Dispensa Software R
Dispensa Software R
Riccardo Massari
[Link]@[Link]
Introduzione
1.1
Generalit`
a
1.1.1
Che cos`
eR
Primi passi
che indica che lambiente `e pronto per ricevere delle istruzioni, che vengono immesse scrivendo
il comando sulla riga che comincia dal simbolo di prompt (detta linea di comando).
Una volta concluso il comando si digita il tasto di Invio. Se il comando `e completo,
comparir`a una nuova linea di comando con il simbolo di prompt. Altrimenti comparir`a una
nuova riga con il simbolo
+
che sta a significare che il comando deve essere completato.
La console di R pu`o essere utilizzata come semplice calcolatrice. E un ambiente interattivo, ossia i comandi producono una risposta immediata. Ad esempio, se scriviamo 2 + 2,
comparir`a nella riga successiva il risultato. Alcuni esempi:
> #somma
> 2 + 2
[1] 4
> #moltiplicazione
> 2 * 2
[1] 4
> #sottrazione e divisione
> (2 - 3)/6
[1] -0.167
> #ATTENZIONE: `
e diverso da scrivere
> 2 - 3/6
[1] 1.5
> #elevamento a potenza
> 2^2
[1] 4
Osservazione Tutto quello che viene scritto su una riga di comando dopo # non viene letto
dal programma. In tale modo, `e possibile inserire dei commenti alle operazioni che vengono
effettuate.
Esistono poi diverse funzioni (vedi pi`
u avanti) per le principali operazioni matematiche
e trigonometriche. Per dare solo qualche esempio, sqrt serve per estrarre la radice quadrata
da un numero, log calcola il logaritmo naturale ed exp lesponenziale:
> sqrt(9)
2
[1] 3
> log(1)
[1] 0
> exp(0)
[1] 1
Gli operatori == (uguale), >=/<= (maggiore/minore uguale), >/< (maggiore/minore), !=
(diverso) sono utilizzati per effettuare confronti tra oggetti. Sono impiegati in diverse situazioni, ad esempio, come si vedr`a pi`
u avanti, nella selezione di elementi da un vettore o da
una matrice dei dati. Il confronto tra due elementi produce il risultato TRUE se il confronto
`e verificato, FALSE altrimenti. Alcuni esempi:
> 2 * 2 == 4
[1] TRUE
> 2 * 2 > 4
[1] FALSE
> 2 * 2 >= 4
[1] TRUE
> 2 * 2 != 4
[1] FALSE
Ogni entit`a che il programma crea e manipola `e definita un oggetto, che pu`o essere un
numero, una variabile, una funzione, o pi`
u in generale, strutture costruite a partire da tali
componenti.
Gli oggetti creati dallutilizzatore del programma durante una sessione di lavoro possono
essere salvati con un nome, per poter essere riutilizzati durante la sessione. Per assegnare
un nome ad un oggetto si impiega il comando <-, o, pi`
u semplicemente = .
> x <- 4
> x
[1] 4
> y = 3 * 2
> y
3
[1] 6
> #`
e possibile effettuare delle operazioni con gli oggetti salvati
> x * y
[1] 24
> #e creare nuovi oggetti da salvare con un nome
> z = (y - x) * 2
> z
[1] 4
I nomi degli oggetti che vengono creati e salvati dallutente possono contenere un qualunque
carattere alfa-numerico. Non devono mai iniziare con un numero, non ci devono essere spazi
vuoti, ne gli operatori per le operazioni matematiche. Sarebbe opportuno, inoltre, che non
coincidano con nomi di funzioni utilizzate dal programma.
> #i nomi degli oggetti non devono contenere spazi vuoti
> pro va = 2
Error: unexpected symbol in "pro va"
> #non devono contenere simboli matematici
> #creano confusione
> x-y = 2
Error in x - y = 2 : could not find function "-<-"
> #non devono iniziare con un numero
> 2x = 2
Error: unexpected symbol in "2x"
> #alcuni nomi sono "protetti" da R
> for = 3
Error: unexpected '=' in "for ="
> break = 5
Error in break = 5 : invalid (NULL) left side of assignment
Si osservi che, anche se i nomi degli oggetti non devono iniziare con un numero, possono
essere composti anche da numeri:
> x2 = 5
> x2
[1] 5
Occorre fare attenzione al fatto che R `e case sensitive, nel senso che distingue tra maiuscole e minuscole. Ad esempio, Y e y si riferiscono ad oggetti diversi.
4
> y
[1] 6
> Y
Error: object 'Y' not found
Infine, se si attribuisce a due oggetti diversi lo stesso nome, R canceller`a il primo dei due
oggetti e manterr`a in memoria solo il secondo:
> a = 2
> a
[1] 2
> a = 4
> a
[1] 4
1.2
1.2.1
Gli oggetti in R
Spazio di lavoro
Gli oggetti creati dallutente vengono temporaneamente salvati nello spazio di lavoro
(workspace). Per sapere qual `e lo spazio di lavoro di default, ossia quello utilizzato dal
programma nel momento in cui viene lanciato, si utilizza il comando getwd(), che mostrer`a il path della cartella nel computer che `e stata automaticamente selezionata al momento
dellinstallazione del programma. Si pu`o lavorare nel workspace di default, ma `e consigliabile
utilizzare spazi di lavoro diversi, e quindi cartelle diverse, per lavori diversi.
Per modificare lo spazio di lavoro, si utilizza il comando setwd(). Ad esempio, se `e stata
creata una directory dal nome lezioniR nella directory C:, per salvare tutto il lavoro in
questa cartella, allinizio della sessione di lavoro si scriver`a1 :
setwd("C:/lezioniR")
In alternativa, dal menu File, si sceglie lopzione Cambia directory e si sceglie la la
cartella.
In questa cartella devono essere inseriti tutti i dati, provenienti da file esterni ad R che
si vogliono impiegare nella sessione di lavoro. Inoltre, in questa cartella verranno salvate le
figure, le matrici di dati e, pi`
u in generale, tutti gli oggetti che vengono creati durante la
sessione di lavoro.
A questultimo riguardo, come gi`a accennato, gli oggetti vengono salvati solo temporaneamente nello spazio di lavoro, fino alla fine della sessione, e non sono visibili fisicamente
nella cartella selezionata come workspace. Per salvare tutto lo spazio di lavoro in maniera
definitiva, si utilizza il comando [Link](), che crea un file senza nome nella cartella
1
Fate attenzione allorientamento dello slash, che `e opposto da quello impiegato, ad esempio, sotto Windows.
selezionata con estensione .Rdata, la cui icona `e identica a quella di R. Se invece si vuole
salvare lo spazio di lavoro con un nome si scriver`a [Link]("[Link]").
Infine, si possono salvare solo alcuni oggetti presenti nello spazio di lavoro, con il comando
save(). Alcuni esempi:
save(x, file = "[Link]")
save(x, y, z, file = "[Link]")
Nel primo caso si salva solo loggetto x, che si trover`a nel file [Link] visibile nella
cartella indicata come spazio di lavoro, nel secondo gli oggetti x, y, z.
Ciascuno di questi file pu`o essere importato in una nuova sessione sessione semplicemente
avviando R dal file .Rdata di interesse, oppure utilizzando il comando load():
load(".Rdata")
load("[Link]")
Da quanto scritto sopra, dovrebbe essere chiaro che nel primo caso si carica tutto lo
spazio di lavoro precedentemente salvato2 , nel secondo solo gli oggetti x, y, z.
Il comando ls() permette di visualizzare i nomi degli oggetti memorizzati. Per eliminare
uno o pi`
u oggetti dallo spazio di lavoro si utilizza il comando rm(), mentre il comando
rm(list = ls()) elimina tutti gli oggetti nello spazio di lavoro. Esempio:
> ls()
[1] "a"
"x"
"x2" "y"
"z"
"x2" "y"
"z"
Anche le operazioni di salvataggio e di importazione di un workspace pu`o essere effettuata con il menu
File.
1.2.2
Funzioni
Tra gli oggetti in R, un ruolo di particolare rilevanza `e rivestito dalle funzioni, insiemi di
comandi elementari, che permettono di effettuare dalle pi`
u comuni operazioni matematiche,
alle pi`
u sofisticate tecniche statistiche, e altro ancora. I comandi incontrati fino ad ora, come
[Link], ls, o sqrt, sono esempi di funzioni.
La sintassi di una generica funzione `e del tipo:
nomefunzione(argomento1, argomento2, argomento3,...)
dove gli argomenti di una funzione, separati da una virgola, possono essere oggetti come
vettori, matrici, altre funzioni, parametri o operatori logici. Alcuni argomenti possono avere
dei valori di default, se sono posti uguali ad un valore, o ad una condizione, ecc.
Non `e sempre necessario specificare tutti gli argomenti di una funzione. Anche lordine
degli argomenti non `e importante. E necessario ricordare che, qualora gli argomenti della
funzione siano inseriti in un ordine diverso da quello definito, si deve sempre richiamare il
nome dellargomento che si vuole impiegare. Per richiamare lhelp in linea su una funzione,
e quindi avere informazioni sulla sintassi della funzione, oltre a esempi pratici di impiego, si
scrive:
?nomefunzione.
Osservazione Quali argomenti vadano sempre specificati e quali solo in base alle finalit`a
dellanalisi `e un argomento complesso da trattare in astratto, senza esempi pratici. Nel
seguito verranno introdotte numerose funzioni, con esempi che permetteranno di chiarire, di
volta in volta, quali argomenti vadano specificati e quali no.
1.2.3
Pacchetti
i ETA
1
19
2
22
3
21
4
23
5
22
6
20
PESO
50
75
80
56
75
58
ALTEZZA
1.65
1.78
1.91
1.72
1.81
1.68
SESSO
F
M
M
F
M
F
PROV
RM
RM
TO
NA
TO
NA
La prima volta che si usa questa funzione durante una sessione di lavoro si dovr`a anche
selezionare da una lista il sito mirror da cui scaricare il pacchetto.
In alternativa, nel menu Pacchetti si seleziona Installa pacchetti e, successivamente,
si seleziona il pacchetto dalla lista di tutti i pacchetti.
Tipologie di dati in R
2.1
Vettori di dati
La funzione seq genera un vettore che contiene una sequenza regolare di numeri, in base a
determinate regole. La sintassi della funzione `e3 :
seq(from = 1, to, by, length)
Largomento from, che va sempre specificato, indica il primo numero della sequenza di
numeri, che, di default, `e posto pari ad 1. Il secondo, to, `e il numero finale della sequenza.
by indica il passo della sequenza, ossia lincremento tra un numero e quello successivo. Se
non specificato, `e pari ad 1. Infine, length `e la lunghezza della sequenza.
Non `e necessario specificare tutti gli argomenti, dal momento che, ad esempio, una volta
specificato valore di inizio, valore finale e passo, la lunghezza `e automaticamente definita.
Ad esempio, per ottenere una sequenza da 3 a 15, di passo 3 e, quindi, di lunghezza pari a
5, si pu`o scrivere indifferentemente:
>
>
>
>
Si osservi che non sono stati riportati tutti gli argomenti della funzione, ma solo quelli di uso pi`
u comune.
Questo verr`
a fatto anche per le funzioni che verranno successivamente illustrate, per non appesantire la
spiegazione delle varie funzioni. Per approfondimenti, si pu`o sempre fare ricorso allhelp.
11
[1]
9 12 15
9 12 15
> x1
[1]
Si osservi anche che, come accennato precedentemente, non `e necessario scrivere il nome
dellargomento, se viene riportato nellordine prefissato di default. Ad esempio, per ottenere
un vettore con una sequenza di numeri da 2 (from = 2) a 10 (to = 10), di passo 2 (by =
2), `e sufficiente scrivere:
> seq(2, 10, 2)
[1]
8 10
Se si specificano i nomi degli argomenti, questi possono essere posti anche in ordine
diverso da quello prefissato:
> seq(1, length = 5, by = .5)
[1] 1.0 1.5 2.0 2.5 3.0
Infine, un modo compatto per ottenere delle sequenze di passo 1 `e il seguente:
> 1:5
[1] 1 2 3 4 5
> 5:1
[1] 5 4 3 2 1
Nellultimo caso otteniamo una sequenza ordinata in maniera decrescente.
La funzione rep(x, times) genera un vettore in cui un oggetto (x), numero o vettore,
viene ripetuto un numero di volte pari a (times):
> rep(x = 1, times = 5)
[1] 1 1 1 1 1
> rep(c(1, 2), 2)
[1] 1 2 1 2
12
2.2
Data frame
1
2
3
4
5
6
[Link]':
6 obs. of 5 variables:
$ ETA
: num 19 22 21 23 22 20
$ PESO
: num 50 75 80 56 75 58
$ ALTEZZA: num 1.65 1.78 1.91 1.72 1.81 1.68
$ SESSO : Factor w/ 2 levels "F","M": 1 2 2 1 2 1
$ PROV
: Factor w/ 3 levels "NA","RM","TO": 2 2 3 1 3 1
La funzione names applicata alla matrice dei dati, restituisce il nome delle variabili della
matrice:
> names(Dati)
[1] "ETA"
"PESO"
"ALTEZZA" "SESSO"
13
"PROV"
Lestrazione di dati da un data frame pu`o essere effettuata in maniera simile a quanto
avviene per i vettori. Va per`o tenuto conto che, trattandosi di una matrice, ha due dimensioni.
Quindi, scrivendo Dati[i, j], si estrae lelemento che si trova nelli-ma riga e nella j-ma
colonna della matrice A. Quindi, lindice prima della virgola si riferisce alle righe, mentre
quello dopo la virgola riguarda le colonne:
> #estrae l'elemento che si trova nella prima riga e nella seconda colonna
> Dati[1, 2]
[1] 50
> #estrae il secondo ed il quarto elemento della prima riga
> Dati[1, c(2, 4)]
PESO SESSO
50
F
14
1
2
3
4
5
6
ALTEZZA SESSO
1.65
F
1.78
M
1.91
M
1.72
F
1.81
M
1.68
F
2
3
4
5
6
Dal momento che le colonne sono delle variabili, `e possibile estrarle anche indicando nome
della variabile, scrivendo [Link]$nomecolonna. Ad esempio, per estrarre la prima
variabile si pu`o indicare lindice della prima colonna, o il nome della variabile:
> Dati[, 1]
[1] 19 22 21 23 22 20
> Dati$ETA
[1] 19 22 21 23 22 20
Se quindi vogliamo ricavare la matrice dei dati contenente solo le variabili numeriche,
scriveremo, ad esempio:
> Dati2 = Dati[, 1:3]
> Dati2
1
2
3
4
5
6
15
2.2.1
Liste
Le liste sono insiemi di oggetti di natura e dimensione diversa. Per questo motivo, sono
spesso usate per raccogliere i risultati di unanalisi. Per generare una lista si impiega la
funzione list.
Costruiamo una lista, i cui elementi sono la nostra matrice dei dati, ed il vettore x,
generato nellesempio delle sequenze di numeri.
> Lista = list(Dati, x)
> Lista
[[1]]
ETA PESO ALTEZZA SESSO PROV
1 19
50
1.65
F
RM
2 22
75
1.78
M
RM
3 21
80
1.91
M
TO
4 23
56
1.72
F
NA
5 22
75
1.81
M
TO
6 20
58
1.68
F
NA
[[2]]
[1] 3
9 12 15
Di default gli oggetti in una lista non sono identificati con un nome, ma solo con un
numero. Per assegnare un nome a ciascun oggetto della lista si usa la funzione names,
imputando un vettore di stringhe della stessa lunghezza del numero di oggetti4 :
> names(Lista) = c("Dati", "sequenza")
> Lista
$Dati
ETA PESO ALTEZZA SESSO PROV
1 19
50
1.65
F
RM
2 22
75
1.78
M
RM
3 21
80
1.91
M
TO
4 23
56
1.72
F
NA
5 22
75
1.81
M
TO
6 20
58
1.68
F
NA
$sequenza
[1] 3 6
9 12 15
16
> Lista[[2]]
[1]
9 12 15
> Lista$sequenza
[1]
2.3
9 12 15
E raro che i dati vengano inseriti a mano, come negli esempi precedenti. La situazione
pi`
u comune `e che vengano inseriti a partire da file esterni. R `e in grado di leggere dati in
praticamente qualsiasi formato5 .
In questa sezione vedremo come caricare in R dati che sono stati salvati sotto forma di
testo, soluzione molto comune, con estensioni .txt o .csv. Per caricare questo tipo di dati si
impiega la funzione [Link](), che, con le opportune specificazioni, `e in grado di leggere
file salvati con queste ed altre estensioni.
Consideriamo il file [Link], che contiene i voti riportati in cinque materie da sei
studenti. In questa matrice di dati le variabili sono gli esami e gli studenti sono le unit`a.
Nella prima riga ci sono i nomi delle variabili, ossia gli esami sostenuti dagli studenti.
Perche R sia in grado di caricare questi dati, occorre indicare al programma dove si trova
il file. Qualora il file si trovasse in unaltra cartella diversa dal workspace occorre indicare
tutto il percorso, per permettere al programma di individuare la cartella. Ad esempio, se la
cartella dove si trovano i dati fosse "D:/my documents/data", si dovrebbe scrivere:
[Link]("D:/my documents/data/[Link]", header = TRUE)
dove largomento header posto uguale a TRUE sta a significare che la prima riga della matrice
di dati contiene i nomi delle variabili.
Se, invece, la cartella in cui si trovano i dati `e quella definita come spazio di lavoro,
non serve indicarla. La soluzione pi`
u semplice `e, quindi, copiare il file nella nostra cartella
"C:/lezioniR", in modo che il programma sia in grado di individuare i dati immediatamente,
e scrivere:
> exams = [Link]("[Link]", header = TRUE)
> str(exams)
'
[Link]':
$ EconomiaI
:
$ EconomiaII :
$ StatisticaI :
$ StatisticaII:
$ Marketing
:
int
int
int
int
int
6 obs. of
18 30 23
20 30 25
21 30 22
19 30 22
26 30 28
5 variables:
21 30 27
22 30 30
25 30 26
24 30 28
28 26 24
> exams
5
Tramite il pacchetto foreign, R `e in grado di leggere e salvare dati in formati provenienti da altri
programmi di analisi statistica, come Stata, SPSS e SAS.
17
18
Osservazione Una volta effettuate le analisi sulle variabili, `e preferibile applicare la funzione detach(), che chiude laccesso diretto alle variabili.
Consideriamo ora il file [Link], che riporta dati relativi a 15 persone, che sono state
sottoposte ad un trattamento medico, sui quali sono state osservate le seguenti variabili6 :
sesso;
eta;
I file con estensione .csv sono particolari tipi di documenti di testo che possono essere letti
e salvati con Excel. In questo caso, il file `e stato salvato con le impostazioni internazionali
americane, per cui i decimali sono separati da un punto, e lo spazio tra le variabili `e dato
da una virgola7 . Queste informazioni vanno date alla funzione [Link](), tramite gli
argomenti dec e sep rispettivamente:
> pazienti = [Link]("[Link]", header = TRUE, dec = ".",
+ sep = ",", [Link] = 1)
> head(pazienti)
sesso eta peso [Link] [Link] [Link] [Link] [Link] [Link] [Link]
M 27
60
260
14.5
1
1
175
3.2
1
M 41
65
320
8.0
3
1
195
4.5
0
M 65
75
360
13.0
2
3
225
8.7
1
M 53
67
380
12.0
0
1
220
8.7
0
M 47
52
350
20.5
1
1
222
13.5
0
M 56
70
253
14.7
3
3
120
16.5
3
[Link]
1
1
1
2
3
4
5
6
6
Le variabili relative allumore ed al pessimismo, sono state valutate in base alla scala della depressione
di Beck.
7
Se il file viene salvato con le impostazioni italiane, i decimali sono separati da una virgola, mentre le
variabili da un punto e virgola.
19
2
3
4
5
6
0
3
1
0
3
[Link]':
$ sesso
:
$ eta
:
$ peso
:
$ [Link] :
$ [Link] :
$ [Link] :
$ [Link] :
$ [Link] :
$ [Link] :
$ [Link]:
$ [Link]:
15 obs. of 11 variables:
Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 1 1 1 ...
int 27 41 65 53 47 56 40 58 32 40 ...
int 60 65 75 67 52 70 68 56 82 70 ...
int 260 320 360 380 350 253 400 250 136 172 ...
num 14.5 8 13 12 20.5 14.7 7.2 13.3 13.6 8.3 ...
int 1 3 2 0 1 3 1 3 2 2 ...
int 1 1 3 1 1 3 0 3 2 3 ...
int 175 195 225 220 222 120 245 320 165 148 ...
num 3.2 4.5 8.7 8.7 13.5 16.5 8.5 12.9 11.8 8 ...
int 1 0 1 0 0 3 0 3 0 0 ...
int 1 0 3 1 0 3 0 2 0 1 ...
> attach(pazienti)
Nella funzione [Link] non occorre specificare gli argomenti header, dec e sep che
sono gi`a impostati di default.
Osservazione Si noti che, sia per il file exams che per pazienti, abbiamo impiegato la
funzione attach(), per cui non sar`a necessario, nelle analisi che seguono, richiamare il nome
della matrice dei dati di provenienza, ma solo i nomi delle variabili.
8
Se si vuole visualizzare le prime n righe di una generica matrice X, si scrive: head(X, n), dove n `e
compreso tra 1 e il numero di righe della matrice.
9
Lequivalente per i file salvati con le impostazioni italiane `e la funzione read.csv2.
20
3.1
3.1.1
In bf R ci sono diverse funzioni per lanalisi descrittiva dei dati. Tra le pi`
u utilizzate ricordiamo:
cor() calcola la correlazione tra due vettori, o la matrice di correlazione di una matrice
di dati;
Molte altre funzioni per lanalisi statistica dei dati saranno introdotte, di volta in volta,
con esempi specifici. Alcuni esempi, basati sui dati del file [Link] sono riportati di
seguito. Per ridurre il numero di decimali, in maniera definita, senza dovere sempre utilzzare
la funzione round, si utilizza la funzione options, che permette di modificare le opzioni di
default di R. In particolare, scrivendo, ad esempio, options(digits = 2), tutti i risultati
non interi verranno riportati con due numeri decimali. Se dopo la virgola ci sono degli zero,
riporter`a i primi due numeri decimali dopo gli zeri10 :
>
>
>
>
>
>
[1] 24.8
10
Dal momento che ogni modifica con options `e definitiva, fino alla fine della sessione di lavoro, `e opportuno
salvare le impostazioni iniziali e ripristinarle alla fine dei calcoli.
21
EconomiaI
EconomiaII
StatisticaI
StatisticaII
Marketing
Median
25.0
Max.
30.0
EconomiaII
Min.
:20.0
1st Qu.:22.8
Median :27.5
Mean
:26.2
3rd Qu.:30.0
Max.
:30.0
StatisticaI
Min.
:21.0
1st Qu.:22.8
Median :25.5
Mean
:25.7
3rd Qu.:29.0
Max.
:30.0
StatisticaII
Min.
:19.0
1st Qu.:22.5
Median :26.0
Mean
:25.5
3rd Qu.:29.5
Max.
:30.0
Marketing
Min.
:24
1st Qu.:26
Median :27
Mean
:27
3rd Qu.:28
Max.
:30
La funzione apply permette di calcolare una generica funzione sulle righe (qualora lapplicazione
della funzione sulle righe abbia senso) o sulle colonne di una matrice di dati. La sintassi `e
apply(X, dim, FUN), dove X `e una matrice di dati, dim `e la dimensione lungo la quale si
vuole calcolare la funzione: 1 = per riga, 2 = per colonna), e FUN `e la funzione da applicare
ai dati11 .
> #calcola le medie delle variabili per riga
> apply(exams, 1, mean)
Chiara
20.8
Piero Sabrina
30.0
24.0
Elena
24.0
Sara
29.2
Marta
27.0
EconomiaII
26.2
StatisticaI StatisticaII
25.7
25.5
Marketing
27.0
11
Deve essere coerente con i dati che si vogliono analizzare. Non si pu`o impiegare la funzione mean, ad
esempio, se le variabili non sono quantitative.
23
In questo caso, dal momento che le variabili sono omogenee (sono voti riportati agli
esami), ha senso sia la media per riga, voto medio dello studente, sia quella per colonna,
voto medio per esame. Se le variabili non sono omogenee, non ha senso effettuare operazioni
per riga, ma solo per colonna.
Se nel data frame sono presenti variabili di classificazione, `e possibile calcolare una funzione separatamente su ciascuna classe di unit`a, tramite le funzioni tapply e aggregate,
che si applicano, rispettivamente, ad un singolo vettore, e ad una matrice di dati.
La sintassi della funzione tapply `e:
tapply(X, INDEX, FUN)
dove X `e un vettore, INDEX una variabile di classificazione12 , o una lista di variabili di classificazione, e FUN la funzione da applicare ai dati.
Ad esempio, considerando la matrice di dati pazienti, se si vuole calcolare il peso medio
dei pazienti, a seconda del sesso:
> pesomedio.s = tapply(peso, sesso, mean)
> pesomedio.s
F
M
74.0 65.3
La sintassi della funzione aggregate `e:
aggregate(x, by, FUN)
dove x `e una matrice di dati, by `e una lista, al limite composta da un solo oggetto, di variabili
di classificazione, e FUN, la funzione.
Dalla matrice dei dati pazienti ricaviamo le variabili quantitative, e creiamo un nuovo
data frame, sulle cui variabili calcoliamo la media in base al sesso:
> pazienti2 = [Link](eta, peso, [Link], [Link], [Link], [Link])
> aggregate(pazienti2, list(sesso), mean)
Group.1 eta peso [Link] [Link] [Link] [Link]
1
F 48.8 74.0
195
14.3
237
11.74
2
M 47.0 65.3
332
12.8
200
9.09
Il risultato `e una matrice, sulle cui righe ci sono le medie delle variabili, distintamente
per il sesso dei pazienti.
3.1.3
Per generare distribuzioni di frequenze assolute semplici (una sola variabile) o doppie
(due variabili) in R si utilizza la funzione table. Anche se la funzione pu`o essere applicata
a qualsiasi tipo di variabile, ci occuperemo solo di distribuzioni di variabili qualitative, o
quantitative discrete.
La distribuzione di frequenze della variabile [Link], ad esempio, `e:
12
24
> fr = table([Link])
> fr
[Link]
0 1 2 3
1 4 7 3
La corrispondente distribuzione di frequenze relative si ottiene applicando la funzione
[Link] alla distribuzione di frequenze assolute:
> [Link](fr)
[Link]
0
1
2
3
0.0667 0.2667 0.4667 0.2000
Per determinare distribuzioni di frequenza doppie, si utilizza sempre table. Prendendo come esempio la distribuzione dei pazienti, in base al sesso ed alla valutazione dellumore
prima del trattamento:
> fr1 = table(sesso, [Link])
> fr1
[Link]
sesso 0 1 2 3
F 0 1 6 1
M 1 3 1 2
> [Link](fr1) * 100
[Link]
sesso
0
1
2
3
F 0.00 6.67 40.00 6.67
M 6.67 20.00 6.67 13.33
dove la tabella delle frequenze relative `e stata moltiplicata per 100, allo scopo di ottenere le
percentuali, di pi`
u immediata leggibilit`a.
3.2
R `e in grado di produrre diversi tipi di grafico, attraverso funzioni per i grafici, che possono
essere divisi in tre gruppi:
1. funzioni di alto livello, che creano un nuovo grafico sulla finestra grafica;
2. funzioni di basso livello, che aggiungono parti ad un grafico gi`a esistente;
25
3. funzioni per grafici interattivi, che consentono di aggiungere interattivamente informazioni, o di estrarne, da un grafico esistente.
In R `e inotre disponibile una lunga serie di parametri grafici, che permettono di personalizzare laspetto della finestra grafica, che possono essere modificati dallutilizzatore. Si
rimanda allhelp in linea della funzione par per una lista di tali argomenti.
La funzione di alto livello principale e pi`
u generale `e plot(), ma, a seconda dellanalisi
condotta, si possono impiegare altre funzioni di alto livello, pi`
u specifiche. Ogni volta che
si utilizza la funzione plot(), o qualsiasi altra funzione di alto livello, si apre una nuova
finestra grafica, che sostituisce quella precedentemente aperta.
Lo scatterplot, o diagramma di dispersione, `e un grafico cartesiano che permette
di confrontare due variabili. E formato dalle coordinate di ciascuna coppia di punti, che
rappresentano il valore assunto da ciascuna unit`a nelle due variabili messe a confronto.
Tramite il diagramma di dispersione `e possibile evidenziare sia la presenza di valori anomali,
ovvero punti che si discostano dalla nuvola dei punti, sia lesistenza di relazioni tra le due
variabili, ad esempio lineare o quadratica.
La funzione impiegata per lo scatterplot `e plot. In questo caso, la sintassi della funzione
`e:
plot(x, y, type = "p")
dove x e y sono due vettori che rappresentano le coordinate dei punti nel grafico, mentre
type definisce il tipo di grafico. Nel caso di un diagramma di dispersione, si usa lopzione di
default, ossia type = "p", che equivale ad un grafico a punti.
A partire dai dati contenuti nel file [Link] creiamo, come esempio, un grafico in cui
si mettono a confronto il peso dellauto (peso) e la cilindrata (cilindrata) (Figura 1):
> #carica i dati "auto"
> auto <- [Link]("[Link]", [Link] = 1)
> attach(auto)
> plot(x = peso, y = cilindrata)
In base al grafico si vede che c`e una correlazione positiva tra le due variabili.
Esercizio Calcolare la correlazione tra le due variabili, per verificare se lintuizione grafica
`e giustificata.
Il grafico pu`o essere arricchito, con altri argomenti della funzione plot, come, ad esempio,
main per inserire un titolo al grafico, o xlab e ylab per inserire le intestazioni dellasse delle
ascisse e delle ordinate rispettivamente.
Possiamo anche modificare laspetto dei punti, con largomento pch, il cui valore di default
`e pari a 1, ed anche il colore, con largomento col, il cui valore di default `e 1, equivalente a
nero (Figura 2).
> plot(peso, cilindrata, xlab = "peso (kg)",
+ ylab = "cilindrata (l)", main = "Auto", pch = 2, col = 2)
26
cilindrata
800
1000
1200
1400
1600
1800
peso
Figure 2: Scatterplot dei dati relativi a peso e cilindrata con punti modificati
3
2
1
cilindrata (l)
Auto
800
1000
1200
1400
peso (kg)
27
1600
1800
Figure 3: Scatterplot dei dati relativi a peso e cilindrata con identificazione del tipo di trazione
4wd
fwd
rwd
cilindrata
800
1000
1200
1400
1600
1800
peso
Esercizio Modificare pch e col per ottenere grafici con aspetto diverso.
Per identificare le unit`a sul grafico con un colore e/o con un punto diverso, a seconda
del valore di una variabile di classificazione, o fattore, si possono impiegare nuovamente gli
argomenti pch e/o col. In questo caso va specificato per i due argomenti un vettore numerico,
che permetta di associare un tipo di punto e/o un colore a ciascuna unit`a, a seconda della
classe cui appartiene. Se la variabile di classificazione `e un vettore di stringhe, dovr`a prima
essere trasformata in vettore numerico tramite la funzione [Link].
Consideriamo il caso in cui si voglia identificare le auto in base alla trazione. La variabile
trazione non `e numerica, quindi va trasformata. Dopo la trasformazione, si ha che 4wd = 1,
fwd = 2, rwd = 3.
Si pu`o anche aggiungere una legenda, tramite la funzione legend, da inserire dopo la
funzione plot, la cui sintassi di base `e:
legend(x, y, legend)
dove x ed y sono le coordinate alle quali viene posizionata la legenda, mentre legend `e un
vettore, della stessa lunghezza del numero di classi diverse nella variabile di classificazione,
che rappresenta i vari elementi da identificare. In questo caso si pu`o impiegare direttamente
la funzione levels per ricavare i nomi delle classi. In generale, si costruisce un vettore con
i nomi delle modalit`a della variabile di classificazione. Altri argomenti variano a seconda
del grafico. In questo caso occorrer`a associare a ciascun elemento del vettore di stringhe il
simbolo corrispondente, attraverso pch e col (Figura 3).
> traznum = [Link](trazione)
28
In questo caso si mette in evidenza lesistenza di due gruppi di auto con alimentazione
diesel, un primo gruppo che si trova tra i modelli pi`
u al disotto dei 1200 kg, a bassa cilindrata
e ad elevata percorrenza urbana, un secondo con cilindrata attorno alla media, piuttosto
pesanti e con una percorrenza urbana medio-bassa.
29
Auto
3
1
cilindrata (l)
600
800
1000
1200
1400
1600
1800
2000
peso (kg)
Figure 5: Bubble plot con bolle distinte in base al tipo di alimentazione del motore
Auto
benzina
diesel
3
2
1
cilindrata (l)
600
800
1000
1200
1400
peso (kg)
30
1600
1800
2000
Figure 6: Boxplot
Esercizio Creare un grafico simile al precedente, ma con trazione come variabile di classificazione. Commentare i risultati.
Il boxplot `e un grafico che rappresenta le seguenti quantit`a: minimo, massimo, primo,
secondo (mediana) e terzo quartile. Fornisce informazioni sulla sulla variabilit`a che sulla
asimmetria di una distribuzione. Si richiede con la funzione boxplot (Figura 6).
> boxplot(cilindrata)
Un metodo per la rappresentazione contemporanea di tre o pi`
u variabili `e la matrice
dei diagrammi di dispersione (scatterplot matrix). Si tratta di un insieme di diagrammi
di dispersione nei quali sono messe a confronto tutte le coppie di variabili di una matrice di
dati quantitativi.
La funzione che genera la scatterplot matrix `e pairs:
pairs(x, labels)
dove x `e la matrice dei dati, mentre labels `e il vettore dei nomi delle variabili. labels si
utilizza, in maniera analoga alla funzione names, se si vuole modificare il nome delle variabili.
Altri argomenti grafici sono identici a quelli visti per le precedenti funzioni.
Costruiamo la matrice dei diagrammi sul data frame auto2, ricavato dai dati auto (Figura
7):
> auto2 = [Link](peso, cilindrata, [Link])
31
peso
1600
1200
cilindrata
20
800
1200
1600
15
[Link]
10
3
2
1
800
10
15
20
50
100
150
12
fwd
4wd
rwd
33
> pie(table(trazione))
Variabili casuali
Densit`a dbinom(x=x,size=1,prob=)
Ripartizione pbinom(q=x,size=1,prob=)
Quantile qbinom(p=,size=1,prob=)
Binomiale
Densit`a dbinom(x=x,size=m,prob=)
Ripartizione pbinom(q=x,size=m,prob=)
Quantile qbinom(p=,size=m,prob=)
Geometrica
Densit`a dgeom(x=x,prob=)
Ripartizione pgeom(q=x,prob=)
Quantile qgeom(p=,prob=)
Poisson
Densit`a dpois(x=x,lambda=)
Ripartizione ppois(q=x,lambda=)
Quantile qpois(p=,lambda=)
Esponenziale
Densit`a dexp(x=x,rate=)
Ripartizione pexp(q=x,rate=)
Quantile qexp(p=,rate=)
Normale
Densit`a dnorm(x=x,mean=,sd=)
Ripartizione pnorm(q=x,mean=,sd=)
Quantile qnorm(p=,mean=,sd=)
Student
Densit`a dt(x=x,df=k)
Ripartizione pt(q=x,df=k)
Quantile qt(p=,df=k)
Chi-quadrato
Densit`a dchisq(x=x,df=k)
Ripartizione pchisq(q=x,df=k)
Quantile qchisq(p=,df=k)
Densit`a df (x=x,df1=n1,df2=n2)
Ripartizione pf (q=x,df1=n1,df2=n2)
Quantile qf (p=,df1=n1,df2=n2)
Fisher
Uniforme
35
4.1
Esempi
Probabilit`a di ottenere un valore pari a 3 (3 successi) in una binomiale n=10 prove indipendenti =0.5.
> dbinom(3,10,0.5)
[1] 0.117
Funzione di ripartizione valore 3 (3 successi) in una binomiale n=10 prove indipendenti
=0.5.
> pbinom(3,10,0.5)
[1] 0.172
Quantile 0.171875 in una binomiale in una binomiale n=10 prove indipendenti =0.5.
> qbinom(0.171875,10,0.5)
[1] 3
Generazione casuale di 5 valori in una binomiale n=10 prove indipendenti =0.5.
> rbinom(5,10,0.5)
[1] 7 6 5 6 3
Vettore k contenente i numeri da 0 a 10
> k<-c(0:10)
> k
[1]
9 10
0.15
0.00
0.05
0.10
0.20
0.25
0.30
plot(k,p,type='h')
10
0.15
0.10
0.05
0.00
0.20
0.25
0.30
plot(k,p,type='h')
6
k
37
10
0.15
0.00
0.05
0.10
0.20
0.25
0.30
plot(k,p,type='h')
10
0.8
Figure 13: Grafico della distribuzione Normale con media uguale e diversa varianza o varianza
uguale e diversa media
0.4
0.2
0.0
dnorm(x, 0, 0.5)
0.6
N(0,0.5)
N(0,1)
N(2,1)
0
x
38
0.6
0.4
0.0
0.2
pnorm(x)
0.8
1.0
curve(pnorm(x),10,10)
10
10
> qnorm(0.025)
[1] -1.96
Quantile 0.975 di una t Student di parametro 10
> qt(0.975,10)
[1] 2.23
Quantile 0.975 di una t Student di parametro 20
> qt(0.975,20)
[1] 2.09
Quantile 0.95 di una chi-quadro di parametro 5
> qchisq(0.95,5)
[1] 11.1
Quantile 0.95 di una F di Fisher di parametri 2 e 3
> qf(0.95,2,3)
[1] 9.55
Il grafico della distribuzione Normale con media uguale e diversa varianza o varianza
uguale e diversa media si ottiene con la seguente sintassi (Figura 13):
> curve(dnorm(x,0,0.5),-6,6)
> curve(dnorm(x,0,1),-6,6,add=TRUE)
> curve(dnorm(x,2,1),-6,6,add=TRUE)
5
5.1
Dato un campione estratto da una variabile casuale X, con distribuzione normale di media
e varianza incognita 2 , se si vuole sottoporre a verifica lipotesi che la media del campione
sia pari a 0 , la verifica dellipotesi viene effettuata sulla statistica test:
t=
X 0
,
s/ n
A partire dalle due variabili del dataframe pazienti che riportano il livello di colesterolo
prima e dopo il trattamento, creiamo una nuova variabile, ratio, data dal rapporto tra le
due. Questa variabile `e un numero indice, minore di 1 se il livello di cortisolo `e diminuito
dopo il trattamento, e maggiore se vale il viceversa.
> ratio = [Link]/[Link]
> summary(ratio)
Min. 1st Qu.
0.221
0.611
Median
0.745
Max.
1.470
Lipotesi nulla che si vuole sottoporre a verifica `e che non ci sia differenza nel livello di
colesterolo, contro lipotesi alternativa che ci sia differenza. In termini formali:
H0 : = 1
H1 : =
6 1
Fissando un livello di significativit`a pari a = 0.05, si ha:
> t1 = [Link](ratio, mu = 1)
> t1
One Sample t-test
data: ratio
t = -2.33, df = 14, p-value = 0.03535
alternative hypothesis: true mean is not equal to 1
95 percent confidence interval:
0.625 0.985
sample estimates:
mean of x
0.805
> t1$statistic
t
-2.33
> t1$[Link]
[1] 0.0353
> t1$estimate
mean of x
0.805
Nellesempio abbiamo evidenziato sia le informazioni generali sul test, sia alcune delle
informazioni pi`
u rilevanti. Ricordando che il p-value pu`o anche essere interpretato come il
minimo livello di significativit`a per il quale lipotesi nulla viene rifiutata, dal momento che `e
minore di , lipotesi nulla viene rifiutata.
Un altro modo di valutare i risultati del test `e quello di confrontare la statistica t con il
valore critico, o soglia, della distribuzione T di Student, al livello di significativit`a prefissato.
Per ricavare i valori della distribuzione si impiega la funzione qt(p, df), dove p `e una
probabilit`a, o un vettore di probabilit`a, mentre df `e il numero di gradi di libert`a. In pratica,
per un dato valore di p, la funzione restituisce il valore tp tale che P rob(Tdf tp ) = p, dove
Tdf `e una variabile casuale T di Student, con df gradi di libert`a.
Dal momento che il test `e bi-direzionale, ossia lipotesi nulla pu`o essere rifiutata sia per
valori positivi che negativi della statistica t, ricaviamo i due valori critici corrispondenti a
t/2 e a t1/2 .
42
> n = length(ratio)
> n
[1] 15
> alpha = .05
> qt(c(alpha/2, 1 - (alpha/2)), n - 1)
[1] -2.14
2.14
Rifiuto H0
Accetto H0
Rifiuto H0
2.14
2.14
La sintassi per ottenere la funzione `e piuttosto complicata, e non verr`a commentata. E tuttavia disponibile nello script della dispensa, per chi vuole approfondire.
43
dove lipotesi nulla `e, al solito, che non ci sia differenza, contro lipotesi alternativa che,
in media, il livello di cortisolo post-trattamento sia inferiore a quello osservato prima del
trattamento.
La distribuzione della statistica test, con la regione di accettazione e quella di rifiuto `e
riportata in Figura 16.
Per effettuare il test in questo caso si scriver`a:
> [Link](ratio, mu = 1, alternative = "less")
One Sample t-test
data: ratio
t = -2.33, df = 14, p-value = 0.01767
alternative hypothesis: true mean is less than 1
95 percent confidence interval:
-Inf 0.952
sample estimates:
mean of x
0.805
Anche in questo caso lipotesi nulla viene rifiutata.
Esercizio Calcolare il valore critico per il test unidirezionale.
5.1.2
Il test pu`o essere condotto anche per confrontare le medie di due campioni. Consideriamo
dapprima il caso di campioni indipendenti.
Sempre con riferimento agli stessi dati dellesempio precedente, vogliamo verificare se il
peso dei pazienti di sesso femminile sia maggiore di quello dei pazienti di sesso maschile.
Costruiamo quindi due nuove variabili:
> peso.m = peso[sesso == "M"]
> peso.f = peso[sesso == "F"]
> mean(peso.m)
[1] 65.3
> mean(peso.f)
[1] 74
H0 : F = M
H1 : F > M
44
Rifiuto H0
Accetto H0
1.76
In realt`
a, questa ipotesi pu`
o essere sottoposta a verifica, tramite la funzione [Link].
45
Osservazione Nel caso in cui le varianze delle due popolazioni non possano essere assunte
uguali, si pone [Link] = FALSE.
Unaltra situazione comune `e quella dei campioni appaiati. Lesempio pi`
u comune `e
proprio quello relativo ai nostri dati, ossia verificare lefficacia del trattamento, confrontando
il valore medio di una qualche variabile del campione prima e dopo lesperimento. Per questo
tipo di test si utilizza largomento paired, con lopzione tt TRUE.
Per questo tipo di test consideriamo un nuovo data frame, sleep15 , che contiene dati
relativi alleffetto di due diversi sonniferi, in termini di incremento di numero di ore di
sonno, su 10 pazienti. Le variabili sono:
extra : numero extra di ore di sonno, rispetto ad un gruppo di controllo;
group : tipo di sonnifero.
In base al numero medio di ore di sonno extra nei due gruppi si osserva che, in media,
con il secondo tipo di sonnifero i pazienti guadagnano in media pi`
u ore di sonno. Si vuole
verificare se questa differenza `e significativa.
> attach(sleep)
> tapply(extra, group, mean)
1
2
0.75 2.33
> extra1 = extra[group == 1]
> extra2 = extra[group == 2]
> [Link](extra2, extra1, alternative = "greater", paired = T)
Paired t-test
data: extra2 and extra1
t = 4.06, df = 9, p-value = 0.001416
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
0.867
Inf
sample estimates:
mean of the differences
1.58
Come ci si aspetterebbe, lipotesi nulla, che corrisponde ad assumere che non ci sia
differenza tra i due gruppi viene rifiutata, a favore dellipotesi alternativa che la media del
secondo gruppo `e significativamente maggiore di quella del primo.
15
Nella release di R sono inclusi un gran numero di data frame, che possono essere richiamati semplicemente
specificando il nome del data frame. Scrivendo data(), comparir`a una finestra con lintera lista dei dati
disponibili.
46
Esercizio Il test sulle medie di campioni appaiati equivale ad un test sulle differenze tra i
due campioni. Verificare per esercizio.
5.2
Anova univariata
factor([Link])1
-11.0
factor([Link])2
88.3
factor([Link])3
-44.2
47
tali coefficienti non `e di particolare interesse, quanto piuttosto il loro segno. Si noti, intanto,
che sono riportati i coefficienti di tutti i gruppi, tranne il primo, "A". Questo perche R lo
considera come gruppo di riferimento. In effetti, lintercetta `e proprio il numero medio di
insetti trovati vivi negli esperimenti nei quali si usa questo tipo di spray. I rimanenti valori
dei coefficienti rappresentano il valore differenziale rispetto al gruppo di riferimento.
Loutput della funzione anova, che per comodit`a `e stato riportato come una matrice,
tramite la funzione [Link], restituisce la scomposizione della varianza e della devianza
sia nei gruppi che tra i gruppi.
Nelle prime tre colonne della prima riga della matrice ci sono i valori relativi alla devianza
tra i gruppi. Il primo valore `e il numero di gradi di libert`a (pari al numero di gruppi, meno
1), il secondo `e la devianza tra i gruppi e il terzo la varianza. La seconda riga riporta i
corrispondenti valori per la devianza nei gruppi.
Tornando alla prima riga, il quarto valore `e il valore della statistica F che si utilizza
per sottoporre a verifica lipotesi che le medie dei diversi gruppi sono uguali. Si osservi che
il valore della statistica `e pari al rapporto tra la varianza tra i gruppi e quella nei gruppi.
Lidea `e che se le medie sono uguali tra loro, la varianza dei gruppi `e nulla, per cui tale
rapporto `e pari a 0. In generale, per accettare lipotesi nulla ci si aspettano valori piccoli di
tale rapporto. Lultimo valore `e il corrispondente p-value, ossia la probabilit`a di osservare
un valore maggiore di quello osservato per la statistica F . Se il valore della statistica `e
sufficientemente piccolo, il p-value sar`a elevato, e lipotesi nulla non pu`o essere rifiutata19 .
Nel nostro caso, il test risulta non significativo, perche il p-value `e piccolo, ma comunque
superiore ai livelli di significativit`a generalmente fissati, per cui si accetta lipotesi nulla.
5.3
Test 2
Nella seconda riga questi valori non possono essere calcolati, e il programma restituisce un valore di dato
mancante, NA.
48
49