Chapter 3 Lab 1 - 15/10/2021

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 -2.500000  3.609438  7.550000

Per la selezione di elementi all’interno di un vettore si utilizzano le parentesi quadre. Ad esempio per selezionare il secondo elemento si usa il seguente codice (si noti che all’interno delle parentesi quadre si specifica la posizione del numero da selezionare).

y[2] 
## [1] -2.5

Volendo selezionare più elemento si andrà a definire un vettore di posizioni:

y[c(1,4)]#seleziono il primo e ultimo elemento
## [1] 5.00 7.55

E’ inoltre possibile selezionare un valore e poi sostituirlo creando una nuova assegnazione con il simbolo di =:

# seleziono il secondo elemento e lo sostituisco con il numero 4
y[2] = 4
y
## [1] 5.000000 4.000000 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] 20.15944
sum(sqrt(y)) #prima viene eseguita la radice quadrata e poi la somma
## [1] 8.883646
mean(y) #media dei valori di y
## [1] 5.039859
sum(y) / length(y) #altro modo per calcolare la media
## [1] 5.039859
mean((y^3)+4) #prima viene eseguita la trasformazione ^3+4 e poi la somma dei relativi valori
## [1] 170.5982

Esistono altre funzioni di sintesi come, ad esempio, median, 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 FALSE 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:

sum(y >= 5) #quanti elementi >=5  
## [1] 2
mean(y >= 5) #proporzione di elementi >= 5
## [1] 0.5
mean(y >= 5)*100 #% di valori >=5
## [1] 50

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)

Utilizzando gli operatori logici è possibile eseguire selezione di elementi e/o sostituzione per condizione. In questo caso non sarà necessario specificare le posizioni degli elementi da selezionare/sostitutire perchè R eseguirà la selezione/sostituzione solamente per quegli elementi che soddisfano la condizione:

# sostituire i valori uguali a 5 con 1000
y[y == 5] = 1000
y
## [1] 1000.000000    4.000000    3.609438    7.550000

Si simulino ora casualmente 500 valori dalla variabile casuale Normale con media 2 e varianza 1. A tal fine si utilizzerà la funzione rnorm (r sta per random - casuale). I valori simulati vengono salvati in un oggetto di nome sim:

sim = rnorm(n = 500, mean = 2, sd = 1)

Si visualizzino i primi 5 valori del vettore sim:

sim[1:5]
## [1] 2.5535949 0.2941317 0.5791684 1.5563832 1.5642922

Si noti che i valori sono diversi ogni volta che si lancia il comando perchè sono generati casualmente e non sono quindi prevedibili.

Volendo contare il numero di valori tra 2 e 3 si ha necessità di impostare due condizioni (maggiori di 2 E minori di 3). L’operatore E si implenta con il simbolo &:

sum(sim > 2 & sim < 3) #somma
## [1] 174
mean(sim > 2 & sim < 3)*100 #%
## [1] 34.8

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

sum(sim <1 | sim >4)
## [1] 85
mean(sim <1 | sim >4) * 100
## [1] 17

Per quanto detto sopra i risultati di queste due ultime operazioni saranno per voi diversi (ma simili) essendo i numeri generati dalla stessa distribuzione Normale.

3.3 Esercizi lab 1

3.3.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.
  • Estrarre il primo e ultimo elemento di x (per estrarre l’ultimo elemento usare length).
  • 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).
  • Sostituire i valori negativi di x con il numero 0.
  • Estrarre da x gli elementi in posizione 2 e 4 e salvarli in un nuovo vettore y. Calcolare y+sqrt(exp(-0.4)).

3.3.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)
  1. Commentare ogni riga del seguente codice spiegando quale operazione viene eseguita.
x[2] 
x[c(1,3)]
x[-3]
y = c(2,5,1)
y
x-y
x*y
x[y>1.5]
y[x<= 6]

3.3.3 Esercizio 3

Utilizzare le seguenti due righe di codice (che verranno poi spiegate nelle prossime lezioni) per simulare \(n=100\) valori dalla distribuzione Normale standardizzata (Normale con media 0 e varianza 1). I valori vengono salvati in un vettore di nome x.

set.seed(123)
x = rnorm(100) 
x
##   [1] -0.560475647 -0.230177489  1.558708314  0.070508391  0.129287735
##   [6]  1.715064987  0.460916206 -1.265061235 -0.686852852 -0.445661970
##  [11]  1.224081797  0.359813827  0.400771451  0.110682716 -0.555841135
##  [16]  1.786913137  0.497850478 -1.966617157  0.701355902 -0.472791408
##  [21] -1.067823706 -0.217974915 -1.026004448 -0.728891229 -0.625039268
##  [26] -1.686693311  0.837787044  0.153373118 -1.138136937  1.253814921
##  [31]  0.426464221 -0.295071483  0.895125661  0.878133488  0.821581082
##  [36]  0.688640254  0.553917654 -0.061911711 -0.305962664 -0.380471001
##  [41] -0.694706979 -0.207917278 -1.265396352  2.168955965  1.207961998
##  [46] -1.123108583 -0.402884835 -0.466655354  0.779965118 -0.083369066
##  [51]  0.253318514 -0.028546755 -0.042870457  1.368602284 -0.225770986
##  [56]  1.516470604 -1.548752804  0.584613750  0.123854244  0.215941569
##  [61]  0.379639483 -0.502323453 -0.333207384 -1.018575383 -1.071791226
##  [66]  0.303528641  0.448209779  0.053004227  0.922267468  2.050084686
##  [71] -0.491031166 -2.309168876  1.005738524 -0.709200763 -0.688008616
##  [76]  1.025571370 -0.284773007 -1.220717712  0.181303480 -0.138891362
##  [81]  0.005764186  0.385280401 -0.370660032  0.644376549 -0.220486562
##  [86]  0.331781964  1.096839013  0.435181491 -0.325931586  1.148807618
##  [91]  0.993503856  0.548396960  0.238731735 -0.627906076  1.360652449
##  [96] -0.600259587  2.187332993  1.532610626 -0.235700359 -1.026420900
  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?