Chapter 3 Lab 1 - 07/10/2022

Per programmare andremo a scrivere il codice in un file di testo detto script. Per aprire un nuovo script, usare il Menu di RStudio: File - New File - R Script. Il file può essere salvato con File - Save as (l’estensione del file è .R).

Per eseguire del codice dallo script è necessario posizionarsi sulla linea del codice da lanciare (in qualsiasi punto) e premere ctrl+invio, in caso di utente Windows, o cmd+invio, in caso di utente Mac (è possibile anche eseguire insieme più righe di codice selezionandole e digitando ctrl/cmd+invio). Nello script è possibile inserire dei commenti (non eseguiti da R) utilizzando all’inizio della riga il simbolo di cancelletto #.

3.1 Funzioni built-in

In R esistono funzioni built-in, ovvero già disponibili (per esempio le funzioni log, sqrt, mean, max, min, …). E’ inoltre possibile scrivere delle proprie funzioni (user-defined functions).

Prima di utilizzare una funzione è sempre opportuno visualizzare la sua pagina di help (tramite ?nomedellafunzione) in modo da capire quali siano i suoi argomenti e gli eventuali settaggi di default.

Per eseguire una qualsiasi funzione ed ottenere il relativo risultato è necessario digitare il suo nome specificando fra parentesi tonde l’argomento (o gli argomenti) che rappresentare gli input della funzione.

Per esempio, per calcolare il logaritmo di un numero si utilizza la funzione log. Visualizzando l’help della funzione lanciando

?log

si nota che la funzione è caratterizzata da due argomenti: x (numero/vettore di cui si vuole calcolare il logaritmo) e base (base del logaritmo, di default viene calcolato il logaritmo naturale).

E’ possibile utilizzare la funzione come segue:

log(x=4 , base=2) #log in base 2 di 4
## [1] 2
log(x=4) #log naturale di 4
## [1] 1.386294

E’ possibile anche omettere i nomi degli argomenti. In questo caso però è necessario fare attenzione all’ordine in cui vengono passati gli input alla funzione (vale l’ordine definito nell’help della funzione).

log(4,2) #ometto i nomi degli argomenti
## [1] 2
log(2,4) #Attenzione: logaritmo di 2 in base 4!
## [1] 0.5

3.2 Vettori

Un vettore di numeri viene creato utilizzando la funzione c (concatenate). Ad esempio, il seguente codice crea un vettore di 4 numeri. Il vettore viene salvato in un nuovo oggetto di nome x (l’assegnazione del vettore al nuovo oggetto viene effettuata usando il segno di uguale =)

x = c(3 , 4.5, log(5), 5.55) 

la cui lunghezza è data da

length(x)
## [1] 4

E’ possibile eseguire operazioni con vettori. Ad esempio, il codice

y = x + 2

crea un nuovo vettore denominato y i cui elementi sono dati dagli elementi di x aumentati di 2. Si noti che R esegue le operazioni (in questo caso la somma) elemento per elemento. Per visualizzare i valori di y lanciare semplicemente il nome dell’oggetto da visualizzare (attenzione, R è case-sensitive per cui y è diverso da Y):

y
## [1] 5.000000 6.500000 3.609438 7.550000

E’ possibile anche sintetizzare i valori presenti in un vettore con funzioni tipo la somma (sum) o la media (mean) applicata a y o a una sua trasformazione:

sum(y) #somma dei valori di y
## [1] 22.65944
sum(sqrt(y)) #prima viene eseguita la radice quadrata e poi la somma
## [1] 9.433156
mean(y) #media dei valori di y
## [1] 5.664859
sum(y) / length(y) #altro modo per calcolare la media
## [1] 5.664859
mean((y^3)+4) #prima viene eseguita la trasformazione ^3+4 e poi la somma dei relativi valori
## [1] 223.2544

Esistono altre funzioni di sintesi come, ad esempio, prod (prodotto dei valori nel vettore), median, var, min e max.

E’ possibile eseguire anche operazioni logiche il cui risultato è TRUE se la condizione è soddisfatta o FALSE altrimenti. Ad esempio il codice

y >= 5 
## [1]  TRUE  TRUE FALSE  TRUE

restituisce un vettore di TRUE/FALSE a seconda che il corrispondente valore di y sia maggiore o uguale a 5. Funzioni di sintesi come la media e la somma possono essere applicati anche a vettori logici. In questo caso ogni TRUE viene conteggiato come uno mentre ogni FALSE come zero; si veda ad esempio i seguenti calcoli:

TRUE + TRUE
## [1] 2
TRUE + FALSE
## [1] 1
FALSE + FALSE
## [1] 0

Analogamente si vogliano contare quanti elementi (frequenza assoluta) sono >=5:

sum(y >= 5) 
## [1] 3

e la relativa proporzione (frequenza relativa) e percentuale:

mean(y >= 5) #proporzione di elementi >= 5
## [1] 0.75
mean(y >= 5)*100 #% di valori >=5
## [1] 75

La seguente tabella riporta tutti gli operatori logici disponibili in R.

Operatore R Descrizione
<= >= minore/maggiore o uguale
< > minore/maggiore
== esattamente uguale
!= diverso (negazione)
& intersezione (e)
| (barra verticale) unione (oppure)

3.3 Variabile casuale Normale

Un esempio di generazione casuale di numeri è dato dall’esperimento che consiste nel lanciare una moneta regolare per quattro volte. Una possibile sequenza ottenuta dall’esperimento è {T, C, C, T, T}, un’altra è {C, C, C, T, C}. Tutte le possibili sequenze casuali di T e C sono simulate dalla stessa distribuzione di probabilità che assegna probabilità 0.5 ad entrambe gli eventi. Procederemo ora in maniera simile per simulare valori dalla variabile casuale Normale. In questo caso la distribuzione è più complessa ed è necessario far ricorso ad un algoritmo. Nel caso di R si utilizza la funzione denominata rnorm (r... sta per random, casuale).

Si simulino ora casualmente 5 valori dalla variabile casuale Normale con media 25 e varianza 1.4. A tal fine si utilizzerà la funzione rnorm:

rnorm(n = 5, mean = 25, sd = sqrt(1.4))
## [1] 24.36940 24.54741 25.23317 26.08176 24.96458

Il codice genera 5 numeri diversi ogni volta che viene fatto girare (perchè sono generati casualmente e non sono prevedibili). Al fine di ottenere gli stessi numeri in un’ottica di riproducibilità dei risultati è necessario fissare il seme, ossia il valore del parametro che inizializza l’algoritmo che genera i numeri. A tal fine si utilizza la funzione set.seed che prende in input un numero intero positivo qualsiasi (22 nel seguente esempio):

set.seed(22)
voti = rnorm(n = 1000, mean = 25, sd = sqrt(1.4))
head(voti) #primi 6 valori
## [1] 24.39403 27.94051 26.19248 25.34646 24.75276 27.19852

In questo caso i 1000 numeri sono salvati nell’oggetto di nome voti. Fissando il seme siamo tutti in grado di ottenere sempre gli stessi numeri.

Rappresentiamo la distribuzione dei voti usando un istogramma:

hist(voti)

Il grafico ricorda la ben nota distribuzione a campana con le proprietà della vc Normale.

E’ possibile calcolare la media campionaria e la varianza campionaria dei dati simulati:

mean(voti)
## [1] 24.99003
var(voti)
## [1] 1.455679

Tali valori saranno simili ai corrispondenti parametri della popolazione (media 25 e varianza 1.4).

Il seguente codice ci parmette di calcolare il numero e la percentuale di voti maggiori di 28:

sum(voti > 28)
## [1] 10
mean(voti > 28) * 100
## [1] 1

Per calcolare il numero e la percentuale di voti compresi tra 24 e 26 è necessario impostare due condizioni (maggiore di 24 E minore di 26). L’operatore E si implenta con il simbolo &:

sum(voti > 24 & voti < 26)
## [1] 601
mean(voti > 24 & voti < 26)*100
## [1] 60.1

Volendo invece contare il numero di valori minori di 22 OPPURE maggiori di 26 si utilizzerà l’operatore O dato da |:

sum(voti < 22 | voti > 26)
## [1] 197
sum(voti < 22 | voti > 26) * 100
## [1] 19700

3.4 Esercizi lab 1

3.4.1 Esercizio 1

  1. Calcolare \(\exp(3-\frac{4}{5})+\frac{\sqrt{3+2^5}}{4-7\cdot \log(10))}\)
  2. Creare il vettore x contenente i valori \((10, log(0.2), 6/7, exp(4), sqrt(54), -0.124)\):
  • Determinare la lunghezza di x.
  • Calcolare il numero e la percentuale di valori di x maggiori o uguali a 0.
  • Calcolare il numero di valori di x compresi tra 0 (incluso) e 1 (escluso). Suggerimento: in questo caso ci sono due condizioni, x>=0 & x<1 dove & è l’operatore AND (intersezione).
  • Calcolare qualche statistica riassuntiva per i valori contenuti nel vettore x.

3.4.2 Esercizio 2

  1. Commentare ogni riga del seguente codice spiegando quale operazione viene eseguita.
x = c(3,6,8)
x
x/2
x^2
sqrt(x)
sum(x)
sum(log(sqrt(x)))
y = x
z = x+3*y^2

3.4.3 Esercizio 3

Simulare \(n=100\) valori dalla distribuzione Normale standardizzata (Normale con media 0 e varianza 1). Usare 123 come seme. I valori vengono salvati in un vettore di nome x.

  1. Calcolare la lunghezza di x.
  2. Calcolare il minimo (min), il massimo (max), la media (mean), la varianza (var) e la mediana (median) di x. I valori ottenuti sono ragionevoli?
  3. Quanti valori (in valore assoluto e percentuale) di x sono positivi?
  4. Quanti valori (in valore assoluto e percentuale) di x sono compresi tra -1 e +1 (estremi esclusi)?
  5. Calcolare x/4-2 e assegnare i nuovi valori a un nuovo vettore denominato y.
  6. Pensate che y possa essere stato generato da una vc Normale? Di quali parametri?