Il 0% ha trovato utile questo documento (0 voti)
3 visualizzazioni49 pagine

Dispensa Software R

introduzione al software r con approfondimento sistematico della supercazzola con scappelamento a destra senza contare quello che ha da dire ernanes a ibraimovic

Caricato da

Bartolo Giordano
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
3 visualizzazioni49 pagine

Dispensa Software R

introduzione al software r con approfondimento sistematico della supercazzola con scappelamento a destra senza contare quello che ha da dire ernanes a ibraimovic

Caricato da

Bartolo Giordano
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

Introduzione allanalisi statistica con R

Riccardo Massari
[Link]@[Link]

Introduzione

1.1

Generalit`
a

1.1.1

Che cos`
eR

R `e un ambiente basato sul linguaggio S, per la gestione e lanalisi statistica di dati e la


produzione di grafici, disponibile gratuitamente sotto i vincoli della GPL (General Public
Licence). Informazioni, risorse e molto altro sono disponibili al sito:
[Link]
La versione pi`
u recente di R pu`o essere scaricata dalla pagina:
[Link]
Una volta scaricato il file .exe sul proprio computer `e sufficiente lanciare il programma
di installazione. Sono comunque presenti dettagliate spiegazioni sul sito di distribuzione del
programma.
In R lanalisi `e fatta attraverso una serie di passi, con risultati intermedi che sono immagazzinati in oggetti. Rispetto a programmi come SAS o SPSS, R fornisce un output
minimo. I rimanenti risultati possono essere successivamente richiamati tramite opportuni
comandi.
Per approfondimenti su aspetti che non sono trattati in queste dispense si rimanda a:
1. Iacus, Masarotto Laboratorio di Statistica con R, McGraw-Hill Italia, 2003.
2. Crivellari Analisi statistica dei dati con R, Apogeo, 2006.
oltre alle numerose dispense per approfondire diversi aspetti di R, disponibili in rete. In particolare, nel sito [Link] si possono trovare anche
numerose dispense in italiano (sezione Other languages).
1.1.2

Primi passi

Avviato il programma R, apparir`a una finestra (Console) con il simbolo di prompt


>
1

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"

> #cancella solo uno o pi`


u oggetti
> rm(x)
> ls()
[1] "a"

"x2" "y"

"z"

> rm(y, x2)


> ls()
[1] "a" "z"
> #cancella tutti gli oggetti nello spazio di lavoro
> rm(list = ls())
> ls()
character(0)
2

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

Le funzioni di R sono organizzate in pacchetti, i pi`


u importanti dei quali sono gi`a disponibili quando si accede al programma. Alcuni pacchetti, pur essendo presenti nella release di
base di R, devono essere caricati durante la sessione di lavoro, mediante il comando:
require(nomepacchetto)
Per sapere quali sono i pacchetti gi`a presenti nella release di R con cui si sta lavorando,
basta scrivere:
library()
In alternativa, dal menu Pacchetti si sceglie lopzione Carica pacchetto. In tal caso
apparir`a una finestra con la lista dei pacchetti gi`a installati. Sar`a quindi sufficiente selezionare
il nome del pacchetto da caricare con il mouse e poi cliccare su OK.
Per avere informazioni sul pacchetto e sulle funzioni in esso contenute:
help(package = "nomepacchetto")
Alcuni pacchetti non sono invece presenti nella release di base di R. Per installare un
pacchetto non presente, `e sufficiente scrivere:
[Link]("nomepacchetto")

Table 1: Esempio di matrice di dati

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

R lavora con dati strutturati. Le strutture di dati contemplate sono:


numeri contengono un singolo dato;
vettori insieme lineare di elementi omogenei per tipologia, tutti numeri, tutte stringhe, ecc.;
fattori vettore utilizzato per classificare o suddividere in livelli gli elementi di un altro
vettore;
array e matrici vettori multidimensionali. Le matrici hanno due dimensioni: righe e colonne.
Gli array sono insiemi di numeri con p dimensioni. Ovviamente, per p = 1 si ottiene
un vettore, per p = 2 una matrice. Il caso pi`
u generale, con p > 2 non verr`a trattato;
data frame sono matrici bidimensionali dove ogni colonna pu`o avere una tipo di dato diverso
dalle altre;
liste insieme di elementi non omogenei tra loro.
Prima di andare a vedere i singoli tipi di dati, consideriamo il seguente esempio. Supponiamo di avere rilevato su sei unit`a, cinque variabili, tre numeriche, let`a, il peso e laltezza,
e due categoriche, il sesso e la provincia di nascita. I dati sono riportati nella Tabella 1.
La prima colonna della matrice contiene le etichette con cui vengono identificate le unit`a.
Ciascuna delle rimanenti colonne rappresenta una variabile osservata sul campione. La riga
i-ma della Tabella 1 riporta i valori osservati per le cinque variabili sullunit`a i.
In R, le variabili vengono rappresentate sotto forma di vettori. Ciascun vettore rappresenta una distribuzione unitaria semplice. La matrice dei dati, che contiene le colonne
rappresentanti le variabili osservate sul campione `e una distribuzione unitaria multipla.
Nel seguito, andremo a vedere dapprima come costruire i singoli vettori che compongono
la Tabella 1 e, successivamente, la matrice dei dati. Nel far questo, verranno illustrate le
principali propriet`a di vettori e matrici di dati in R.
8

2.1

Vettori di dati

Per definire un vettore esistono molti modi, il pi`


u comune dei quali `e la funzione c(). Per
costruire i vettori numerici della matrice dei dati nella Tabella 1, scriveremo:
> ETA = c(19, 22, 21, 23, 22, 20)
> ETA
[1] 19 22 21 23 22 20
> PESO = c(50, 75, 80, 56, 75, 58)
> PESO
[1] 50 75 80 56 75 58
> ALTEZZA = c(1.65, 1.78, 1.91, 1.72, 1.81, 1.68)
> ALTEZZA
[1] 1.65 1.78 1.91 1.72 1.81 1.68
E possibile effettuare operazioni sui vettori. Se, ad esempio, volessimo calcolare laltezza
in centimetri, piuttosto che in metri:
> [Link] = ALTEZZA * 100
> [Link]
[1] 165 178 191 172 181 168
Se, invece, vogliamo calcolare il body mass index delle unit`a del campione, dato dal
rapporto tra il peso e il quadrato dellaltezza:
> BMI = PESO/ALTEZZA^2
> BMI
[1] 18.4 23.7 21.9 18.9 22.9 20.5
Per ridurre il numero di decimali, si utilizza la funzione round(x, digits), dove x `e un
oggetto (numero, vettore, matrice) che contiene numeri da arrotondare, e digits `e il numero
di decimali.
> round(BMI, 2)
[1] 18.4 23.7 21.9 18.9 22.9 20.6
Per costruire i vettori delle variabili categoriche, si pu`o ancora utilizzare la funzione c.
Successivamente, si pu`o applicare la la funzione factor, che definisce automaticamente le
modalit`a della variabile categorica. Questo tipo di variabili sono utili nella classificazione
delle unit`a. I singoli elementi del vettore vanno racchiusi tra virgolette: " ".
9

> SESSO = c("F", "M", "M", "F", "M", "F")


> SESSO
[1] "F" "M" "M" "F" "M" "F"
> SESSO = factor(SESSO)
> SESSO
[1] F M M F M F
Levels: F M
> PROV = c("RM", "RM", "TO", "NA", "TO", "NA")
> PROV = factor(PROV)
> PROV
[1] RM RM TO NA TO NA
Levels: NA RM TO
Per selezionare gli elementi di un vettore si deve inserire tra parentesi quadre, successivamente al nome del vettore, un indice, o un vettore di indici, che indichi la posizione
degli elementi del vettore da estrarre. Se davanti allindice c`e il segno "-", il corrispondente
elemento viene eliminato dal vettore:
> #seleziona il peso della prima unit`
a
> PESO[1]
[1] 50
> #della sesta e della terza unit`
a
> PESO[c(6, 3)]
[1] 58 80
> #elimina l'altezza della quarta unit`
a
> ALTEZZA[- 4]
[1] 1.65 1.78 1.91 1.81 1.68
> #estrae l'et`
a di chi ha un peso minore o uguale a 70 kg
> ETA[PESO <= 70]
[1] 19 23 20
> #estrae il peso di che ha un'altezza maggiore di 1.70
> PESO[ALTEZZA > 1.70]
[1] 75 80 56 75
10

> #estrae l'altezza di chi ha 22 anni


> ALTEZZA[ETA == 22]
[1] 1.78 1.81
> #estrae il peso delle unit`
a di sesso femminile
> PESO[SESSO == "F"]
[1] 50 56 58
> #estrae l'altezza delle unit`
a che hanno meno di 22 anni
> #e che non sono nate nella provincia di Napoli
> ALTEZZA[ETA < 22 & PROV != "NA"]
[1] 1.65 1.91
Osservazione Le variabili di classificazione possono essere, a loro volta trasformate in
variabili numeriche, tramite la funzione [Link]. Si osservi che, nel caso i livelli siano
definiti da caratteri, o stringhe di caratteri, la trasformazione in numeri rispetta lordine
alfabetico delle componenti del vettore.
> [Link](SESSO)
[1] 1 2 2 1 2 1
2.1.1

Tipologie particolari di vettori: le funzioni seq e rep

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:
>
>
>
>

#due diversi modi di ottenere la stessa sequenza


x = seq(from = 3, to = 15, by = 3)
x1 = seq(from = 3, to = 15, length = 5)
x
3

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

Le matrici in R possono essere definite tramite oggetti di classe matrix e [Link]. La


differenza principale, `e che gli oggetti di classe matrix sono matrici i cui elementi devono
essere tutti della stessa natura, ad esempio vettori numerici, mentre gli oggetto di classe
[Link] sono matrici in cui le colonne possono essere di natura differente.
Per questo motivo, questi ultimi oggetti sono impiegati per trattare matrici di dati.
Dora in avanti quando si parler`a di matrice di dati ci si riferir`a ad un data frame, se non
altrimenti specificato.
Si osservi, infine, che la maggior parte delle funzioni che possono essere applicate ad
oggetti di classe matrix sono applicabili anche ai data frame, ma non `e sempre vero il
viceversa.
La funzione per generare un data frame `e [Link], che permette di unire pi`
u vettori
di uguale lunghezza come colonne del data frame, ognuno dei quali si riferisce ad una diversa
variabile.
Costruiamo quindi la matrice dei dati della Tabella 1:
> Dati = [Link](ETA, PESO, ALTEZZA, SESSO, PROV)
> Dati

1
2
3
4
5
6

ETA PESO ALTEZZA SESSO PROV


19
50
1.65
F
RM
22
75
1.78
M
RM
21
80
1.91
M
TO
23
56
1.72
F
NA
22
75
1.81
M
TO
20
58
1.68
F
NA

Si osservi che viene automaticamente generata la colonna delle etichette.


La funzione str permette di analizzare la struttura di un oggetto. In particolare, nel
caso della matrice di dati appena ricavata si ha:
> str(Dati)
'

[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

> #estrae la sotto-matrice formata dalle prime due righe


> #e dalla seconda e terza colonna
> Dati[1:2, 2:4]
PESO ALTEZZA SESSO
1
50
1.65
F
2
75
1.78
M
Si osservi che se non si scrive nulla prima della virgola, lestrazione riguarder`a tutte le
righe; se non si scrive nulla dopo la virgola, lo stesso avverr`a per le colonne. In altri termini,
scrivendo Dati[, j] si estrarr`a tutta la colonna j-ma, ossia tutte le righe della colonna;
scrivendo Dati[i, ] si vuole estratte tutta la riga i-ma:
> #estrae la seconda riga
> Dati[2, ]
ETA PESO ALTEZZA SESSO PROV
2 22
75
1.78
M
RM
> #estrae la terza colonna
> Dati[ , 3]
[1] 1.65 1.78 1.91 1.72 1.81 1.68
> #estrae la terza e quarta colonna
> Dati[ , 3:4]

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

> #elimina la prima riga


> Dati[- 1, ]

2
3
4
5
6

ETA PESO ALTEZZA SESSO PROV


22
75
1.78
M
RM
21
80
1.91
M
TO
23
56
1.72
F
NA
22
75
1.81
M
TO
20
58
1.68
F
NA

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

ETA PESO ALTEZZA


19
50
1.65
22
75
1.78
21
80
1.91
23
56
1.72
22
75
1.81
20
58
1.68

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

Per estrarre un oggetto da una lista si pu`o scrivere nomelista[[numerooggetto]].


Qualora ai diversi oggetti sia stato assegnato un nome, si pu`o anche scrivere nomelista$nomeoggetto,
. Quindi, per estrarre il secondo elemento della lista si pu`o scrivere, alternativamente:
4

La stessa funzione pu`


o essere impiegata per modificare i nomi degli oggetti di una lista, delle colonne di
una matrice di dati.

16

> Lista[[2]]
[1]

9 12 15

> Lista$sequenza
[1]

2.3

9 12 15

Caricare dati da fonti esterne

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

EconomiaI EconomiaII StatisticaI StatisticaII Marketing


Chiara
18
20
21
19
26
Piero
30
30
30
30
30
Sabrina
23
25
22
22
28
Elena
21
22
25
24
28
Sara
30
30
30
30
26
Marta
27
30
26
28
24
Una volta caricati i dati, si possono effettuare operazioni sulla matrice dei dati, o sulle
singole variabili. Per accedere alle variabili della matrice dei dati si possono applicare le
soluzioni viste precedentemente. Per cui, per richiamare la prima variabile si pu`o scrivere,
ad esempio:
> exams$EconomiaI
[1] 18 30 23 21 30 27
Se richiamassimo direttamente il nome della variabile, otterremmo un risultato di errore,
perche R non pu`o accedere direttamente alle variabili allinterno di una matrice di dati:
> EconomiaI
Error: object 'EconomiaI' not found
La funzione attach() permette di caricare temporaneamente in memoria le singole variabili della matrice dei dati e rappresenta, quindi, una maniera pi`
u veloce per accedere direttamente alle variabili della matrice dei dati:
> attach(exams)
> EconomiaI
[1] 18 30 23 21 30 27
Si osservi che comunque le variabili non compaiono nello spazio di lavoro:
> ls()
[1] "exams"

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;

[Link], colesterolo totale, prima del trattamento;

[Link], cortisolo plasmatico, prima del trattamento;

[Link], umore, prima del trattamento;

[Link], pessimismo, prima del trattamento;

[Link], colesterolo totale, dopo il trattamento;

[Link], cortisolo plasmatico, dopo il trattamento;

[Link], umore, dopo il trattamento;

[Link], pessimismo, dopo il trattamento;

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

Largomento [Link] posto uguale ad 1 indica al programma di non leggere la prima


colonna del data frame, che contiene lidentificativo del paziente, come una variabile, ma di
impiegarla per identificare le righe della matrice dei dati, ossia come etichette delle unit`a.
La funzione head mostra solo le prime sei righe della matrice dei dati, il che `e utile quando
si ha a che fare con matrici molto grandi8 .
In alternativa, si pu`o impiegare la funzione [Link](), che `e adatta a leggere dati salvati
in .csv, con le impostazioni internazionali anglosassoni9 :
> pazienti = [Link]("[Link]", [Link] = 1)
> str(pazienti)
'

[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

Introduzione allanalisi dei dati

3.1
3.1.1

Analisi descrittiva dei dati


Le principali funzioni per lanalisi dei dati

In bf R ci sono diverse funzioni per lanalisi descrittiva dei dati. Tra le pi`
u utilizzate ricordiamo:

mean() calcola la media di un vettore di dati;

median() calcola la mediana di un vettore di dati;

var() calcola la varianza di un vettore di dati, la covarianza tra due vettori, o la


matrice di varianze e covarianze di una matrice di dati;

cor() calcola la correlazione tra due vettori, o la matrice di correlazione di una matrice
di dati;

sd() calcola lo scarto quadratico medio (standard error) di un vettore di dati;

summary() riporta le principali statistiche descrittive di un vettore o di una matrice di


dati;

length() restituisce la lunghezza del vettore (ossia la numerosit`a campionaria, se si


opera su dati campionari);

sum() calcola la somma degli elementi di un vettore.

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 :
>
>
>
>
>
>

#salva le impostazioni iniziali


op = options()
#riporta al massimo tre numeri decimali
options(digits = 3)
#La media pu`
o essere calcolata combinando le funzioni "sum" e "length"
sum(EconomiaI)/length(EconomiaI)

[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

> #o direttamente con la funzione "mean"


> mean(EconomiaI)
[1] 24.8
> #calcolo della mediana
> median(EconomiaI)
[1] 25
> #La funzione "var" pu`
o essere usata
> #per il calcolo della varianza di un vettore:
> var(EconomiaI)
[1] 24.6
> #per calcolare la covarianza tra due vettori:
> var(EconomiaI, EconomiaII)
[1] 21.6
> #o per ricavare la matrice di varianze e covarianze
> #tra le variabili di una matrice:
> var(exams)
EconomiaI EconomiaII StatisticaI StatisticaII Marketing
EconomiaI
24.6
21.6
17.3
21.7
1.0
EconomiaII
21.6
20.2
14.1
18.9
-0.6
StatisticaI
17.3
14.1
14.7
16.8
1.6
StatisticaII
21.7
18.9
16.8
20.7
0.6
Marketing
1.0
-0.6
1.6
0.6
4.4
> #La funzione "cor" calcola la correlazione tra due variabili
> cor(EconomiaI, EconomiaII)
[1] 0.972
> #o la matrice di correlazione
> #tra le variabili di una matrice di dati quantitativi:
> cor(exams)

EconomiaI
EconomiaII
StatisticaI
StatisticaII
Marketing

EconomiaI EconomiaII StatisticaI StatisticaII Marketing


1.0000
0.9719
0.913
0.9623
0.0962
0.9719
1.0000
0.818
0.9250
-0.0637
0.9132
0.8179
1.000
0.9642
0.1992
0.9623
0.9250
0.964
1.0000
0.0629
0.0962
-0.0637
0.199
0.0629
1.0000
22

> #calcolo dello scarto quadratico medio:


> sd(EconomiaI)
[1] 4.96
> #la funzione "summary", applicata ad un vettore numerico,
> #ne calcola valori minimo e massimo, media, mediana e quartili
> summary(EconomiaI)
Min. 1st Qu.
18.0
21.5

Median
25.0

Mean 3rd Qu.


24.8
29.2

Max.
30.0

> #applicata ad una matrice,


> #riporta le principali informazioni per ciascuna variabile
> summary(exams)
EconomiaI
Min.
:18.0
1st Qu.:21.5
Median :25.0
Mean
:24.8
3rd Qu.:29.2
Max.
:30.0
3.1.2

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

Le funzioni apply, tapply e aggregate

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

> #e per colonna


> apply(exams, 2, mean)
EconomiaI
24.8

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

Distribuzioni di frequenze semplici e doppie

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

Non necessariamente salvata come factor.

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

Creare grafici con R

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

Figure 1: Scatterplot dei dati relativi a peso e cilindrata

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

> plot(peso, cilindrata, pch = traznum, col = traznum)


> legend(800, 5, legend = levels(trazione), pch = 1:3, col = 1:3)
Dal grafico si osserva che le automobili con quattro ruote motrici sono concentrate soprattutto tra quelle a bassa cilindrata e con un peso intorno alla media, le auto a trazione
anteriore sono principalmente a bassa cilindrata e di piccolo peso, mentre tra quelle a trazione
anteriore ci sono modelli con elevato peso e cilindrata.
Esercizio Creare un grafico simile al precedente, ma con alimentazione come variabile
di classificazione. Commentare i risultati.
Il grafico a bolle, o bubbleplot, `e un grafico bi-dimensionale che permette di rappresentare contemporaneamente lassociazione tra tre variabili, x, y, z. La terza variabile
viene rappresentata sostituendo i punti corrispondenti alle coordinate delle unit`a rispetto
alle prime due variabili con delle bolle, la cui dimensione `e proporzionale ai valori della
terza variabile.
Per la generazione del bubbleplot in R si impiega la funzione symbols, la cui sintassi `e:
symbols(x, y, circles, inches, fg = 1, bg)
dove x, y sono le coordinate delle prime due variabili, circles stabilisce la circonferenza
delle bolle, proporzionali ai valori assunti dalla terza variabile, inches che fissa la massima
ampiezza delle bolle, fg che specifica il colore del diametro della bolla (di default `e nero =
1), mentre bg `e un argomento che serve per determinare il colore con cui vanno riempite
le bolle (di default non viene riempita). Altri argomenti sono comuni a quelli gi`a visti per
plot.
Consideriamo il caso in cui confrontiamo peso e cilindrata, con le bolle proporzionali alla
percorrenza urbana (Figura 4):
> symbols(peso, cilindrata, circles = [Link],
+ inches = 0.5, xlab = "peso (kg)", ylab = "cilindrata (l)", main = "Auto")
In aggiunta a quanto visto con i precedenti grafici, ora osserviamo che, come prevedibile, i
modelli pi`
u pesanti e con cilindrata pi`
u elevata hanno anche una percorrenza urbana minore.
Per distinguere le automobili in base allalimentazione (1 = benzina, 2 = diesel), possiamo riempire ogni bolla con un colore diverso (Figura 5):
>
+
+
>
+

symbols(peso, cilindrata, circles = [Link], inches = 0.5,


xlab = "peso (kg)", ylab = "cilindrata (l)",
bg = alimentazione, main = "Auto")
legend(x = 880, y = 5,
legend = c("benzina", "diesel"), pch = rep(16, 2), col = 1:2)

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

Figure 4: Bubble plot

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

Figure 7: Scatterplot matrix

peso

1600

1200

cilindrata

20

800

1200

1600

15

[Link]
10

3
2
1

800

10

15

20

> pairs(x = auto2, pch = 21, bg = 4)


Guardando, ad esempio, alla prima riga della matrice dei grafici, si osserva una relazione
positiva tra peso e cilindrata, mentre quella tra peso e percorrenza urbana `e negativa.
Si possono distinguere le unit`a in base ad una variabile di classificazione, attraverso
gli argomenti pch e bg, nello stesso modo visto negli esempi precedenti. In questo caso
linserimento della legenda `e molto pi`
u complicato e trascende lobiettivo di questa dispensa.
Esercizio Creare un grafico in cui i punti e i colori dei punti cambino a seconda del tipo
di trazione. Commentare i risultati.
Per variabili qualitative, o quantitative discrete, possiamo costruire un diagramma a
barre, in cui laltezza di ogni barra `e proporzionale alla frequenza assoluta, o relativa, di
ciascuna modalit`a della variabile, tramite la funzione barplot, applicata alloutput di table.
Ad esempio, per la distribuzione di frequenze assolute dei modelli di auto in base al
numero dei cilindri si ha (Figura 8:
> barplot(table([Link]))
Infine, per variabili qualitative, non ordinate, si pu`o utilizzare un grafico a torta, che
consiste nellattribuire ciascuna modalit`a della variabile ad una fetta di un cerchio, la
cui ampiezza `e proporzionale alla frequenza relativa della modalit`a, tramite funzione pie,
applicata alloutput di table
Con riferimento alla variabile trazione (Figura 9):
32

50

100

150

Figure 8: Diagramma a barre

12

Figure 9: Grafico a torta

fwd

4wd

rwd

33

> pie(table(trazione))

Variabili casuali

Di seguito si riportano i comandi per il trattamento di variabili casuali (v.c.) in R.


Bernoulli

Densit`a dbinom(x=x,size=1,prob=)

Ripartizione pbinom(q=x,size=1,prob=)

Quantile qbinom(p=,size=1,prob=)

Estrazione di valori casuali da una v.c. Bernoulli rbinom(n,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=)

Estrazione di valori casuali da una v.c. binomiale rbinom(n,size=m,prob=)

Geometrica

Densit`a dgeom(x=x,prob=)

Ripartizione pgeom(q=x,prob=)

Quantile qgeom(p=,prob=)

Estrazione di valori casuali da una v.c. geometrica rgeom(n,prob=)

Poisson

Densit`a dpois(x=x,lambda=)

Ripartizione ppois(q=x,lambda=)

Quantile qpois(p=,lambda=)

Estrazione di valori casuali da una v.c. Poisson rpois(n,lambda=)

Esponenziale

Densit`a dexp(x=x,rate=)

Ripartizione pexp(q=x,rate=)

Quantile qexp(p=,rate=)

Estrazione di valori casuali da una v.c. esponenziale rexp(n,rate=)


34

Normale

Densit`a dnorm(x=x,mean=,sd=)

Ripartizione pnorm(q=x,mean=,sd=)

Quantile qnorm(p=,mean=,sd=)

Estrazione di valori casuali da una v.c. normale rnorm(n,mean=,sd=)

Student

Densit`a dt(x=x,df=k)

Ripartizione pt(q=x,df=k)

Quantile qt(p=,df=k)

Estrazione di valori casuali da una v.c. t di Student rt(n,df=k)

Chi-quadrato

Densit`a dchisq(x=x,df=k)

Ripartizione pchisq(q=x,df=k)

Quantile qchisq(p=,df=k)

Estrazione di valori casuali da una v.c. 2 rchisq(n,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)

Estrazione di valori casuali da una v.c. F di Fisher rf (n,df1=n1,df2=n2)

Fisher

Uniforme

Densit`a dunif (x=x,min,max)

Ripartizione punif (x=x,min,max)

Quantile qunif (p=,min,max)

Estrazione di valori casuali da una v.c. F di Fisher runif (n,min,max)

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

Vettore contenente le probabilit`a dei valori da 0 a 10 in una binomiale n=10 prove


indipendenti =0.5 (Figura 10).
> p<-dbinom(k,10,0.5)
> p
[1] 0.000977 0.009766 0.043945 0.117188 0.205078 0.246094 0.205078 0.117188
[9] 0.043945 0.009766 0.000977
Distribuzione di probabilit`a della funzione di probabilit`a dei valori da 0 a 10 in una
binomiale n=10 prove indipendenti =0.8 (Figura 11).
> p<-dbinom(k,10,0.8)
36

Figure 10: Grafico a barre verticali della funzione di probabilit`


a dei valori da 0 a 10 in una
binomiale n=10 prove indipendenti =0.5

0.15
0.00

0.05

0.10

0.20

0.25

0.30

plot(k,p,type='h')

10

Figure 11: Grafico a barre verticali della funzione di probabilit`


a dei valori da 0 a 10 in una
binomiale n=10 prove indipendenti =0.8

0.15
0.10
0.05
0.00

0.20

0.25

0.30

plot(k,p,type='h')

6
k

37

10

Figure 12: Grafico a barre verticali della funzione di probabilit`


a dei valori da 0 a 10 in una
binomiale n=10 prove indipendenti =0.2

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

Figure 14: Grafico funzione di ripartizione Normale standard

0.6
0.4
0.0

0.2

pnorm(x)

0.8

1.0

curve(pnorm(x),10,10)

10

10

Distribuzione di probabilit`a della funzione di probabilit`a dei valori da 0 a 10 in una


binomiale n=10 prove indipendenti =0.2 (Figura 12).
> p<-dbinom(k,10,0.2)
Quantile 0.95 di una Normale standard
> qnorm(0.95)
[1] 1.64
Quantile 0.975 di una Normale standard
> qnorm(0.975)
[1] 1.96
Quantile 0.99 di una Normale standard
> qnorm(0.99)
[1] 2.33
Quantile 0.025 di una Normale standard
39

> 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

Verifica delle ipotesi


Test di ipotesi sul valor medio

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

dove X `e la media campionaria, s `e la stima dello scarto quadratico medio e n `e la numerosit`a


del campione. Sotto lipotesi nulla, la statistica t si distribuisce come una variabile casuale
T di Student, con n 1 gradi di libert`a.
Per il test di ipotesi sul valore medio di un campione, in R si impiega la funzione [Link],
che permette:
40

1. di costruire un intervallo di confidenza per la media;


2. di eseguire test di ipotesi sia su un singolo campione, sia per il confronto tra due
campioni.
La sintassi di base della funzione `e:
[Link](x, y = NULL, alternative = "[Link]", mu = 0,
paired = FALSE, [Link] = FALSE, [Link] = 0.95)
dove x `e un vettore di dati, y `e un vettore (opzionale) di dati, da specificare quando si vuole
effettuare il confronto tra due campioni, mentre mu `e lipotesi nulla sul valore della media
(test su un campione), o sulla differenza tra medie (test su due campioni). Di default mu =
0. Largomento alternative `e una stringa che serve a specificare lipotesi alternativa. Pu`o
essere "[Link]" (opzione di default), quando lipotesi alternativa `e che la media (o la
differenza tra medie) `e diversa da quella fissata nellipotesi nulla, "less", quando `e minore,
"greater", quando `e maggiore. Infine [Link] `e il livello di confidenza dellintervallo,
ovvero il complemento ad 1 della probabilit`a dellerrore di I specie fissato, di default posto
uguale a 0.95. Gli argomenti paired e [Link] verranno commentati successivamente.
Loutput della funzione `e una lista che contiene, tra gli altri, i seguenti oggetti:
statistic il valore della statistica t;
parameter i gradi di libert`a della statistica t;
[Link] il p-value del test, che `e la probabilit`a di ottenere un risultato pari (o pi`
u estremo)
di quello osservato, supposta vera lipotesi nulla, P r(|T | > t);
[Link] lintervallo di confidenza per la media;
estimate il valore stimato della media, o della differenza tra medie;
[Link] il valore specificato per lipotesi nulla;
Eseguendo il test senza salvare il risultato, o richiamando il nome con cui vengono salvati
i risultati, R restituisce le principali informazioni circa il test condotto.
5.1.1

Test t sulla media di un campione

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

Mean 3rd Qu.


0.805
0.985
41

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

La distribuzione della statistica, con le regioni di accettazioni e di rifiuto, `e illustrata


nella Figura13 15.
Il valore osservato per la statistica t non `e compreso allinterno dei due valori critici, per
cui, come visto precedentemente, lipotesi nulla viene rifiutata.
Figure 15: Distribuzione della statistica t
Test bidirezionale

Rifiuto H0

Accetto H0

Rifiuto H0

2.14

2.14

In realt`a, lipotesi che si vorrebbe verificare `e se il livello di cortisolo post-trattamento sia


significativamente minore di quello pre-trattamento. In tal senso, si potrebbe effettuare un
test unidirezionale, del tipo:
H0 : = 1
H1 : < 1
13

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

Test t per campioni indipendenti e appaiati

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

Figure 16: Distribuzione della statistica t


Test unidirezionale

Rifiuto H0

Accetto H0

1.76

Si osservi che lipotesi nulla corrisponde a F M = 0, che equivale al valore di default


per mu nella funzione [Link]. Facciamo inoltre lulteriore ipotesi che le due varianze incognite siano uguali14 . In questo caso, si utilizza un argomento opzionale della funzione, ossia
[Link] che va posto uguale a TRUE. Infine, fissiamo la probabilit`a dellerrore di I specie
pari ad = 0.01:
> [Link](peso.f, peso.m, [Link] = TRUE,
+ [Link] = 0.99, alternative = "greater")
Two Sample t-test
data: peso.f and peso.m
t = 1.49, df = 13, p-value = 0.08
alternative hypothesis: true difference in means is greater than 0
99 percent confidence interval:
-6.78
Inf
sample estimates:
mean of x mean of y
74.0
65.3
Lipotesi nulla viene accettata.
14

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

Lanalisi della varianza (ANOVA) permette di confrontare due o pi`


u gruppi di unit`a, definiti
in base ad una o pi`
u variabili di classificazione, tramite il confronto tra la variabilit`a interna
di questi gruppi con la variabilit`a tra i gruppi. Lipotesi nulla `e che tutti i gruppi abbiano la
stessa media, e che le differenze osservate tra i gruppi siano dovute solo al caso.
La funzione che si impiega `e anova, che viene applicata al risultato di una regressione
lineare di una variabile continua su una o pi`
u variabile discrete16 . Nel caso in cui si consideri
una sola variabile esplicativa, si parla di analisi della varianza univariata, o ad una via.
Consideriamo di nuovo i dati relativi alla matrice pazienti.
Lipotesi nulla che vogliamo verificare `e che, a prescindere dal livello di autovalutazione
del pessimismo dopo il trattamento, il livello di colesterolo, sempre dopo il trattamento, sia
sempre lo stesso, contro lipotesi alternativa che almeno due gruppi siano differenti tra loro
in media.
In R bisogna prima effettuare la regressione della variazione del livello di cortisolo
sullumore dopo il trattamento, e poi effettuare lanalisi della varianza. La regressione lineare
tra le due variabili si ottiene con la funzione lm17 :
> fit = lm([Link] ~ factor([Link]))
> fit
Call:
lm(formula = [Link] ~ factor([Link]))
Coefficients:
(Intercept)
216.7

factor([Link])1
-11.0

factor([Link])2
88.3

factor([Link])3
-44.2

> [Link] = anova(fit)


> [Link]([Link])
Df Sum Sq Mean Sq F value Pr(>F)
factor([Link]) 3 19849
6616
3.12 0.0701
Residuals
11 23313
2119
NA
NA
Si osservi che la variabile [Link] `e stata trasformata in una variabile di classificazione,
tramite la funzione factor.
Prima di commentare i risultati, commentiamo loutput delle due funzioni. La funzione
lm restituisce i coefficienti stimati della regressione18 . Nellanalisi della varianza il valore di
16

Le variabili esplicative devono essere salvate come factor.


La tilde tra le due variabili nella funzione lm si ottiene tenendo premuto il tasto Alt e digitando 126.
18
In realt`
a, la maggior parte deloutput, come spesso avviene in R non `e immediatamente visibile, ma `e
salvata in una lista, in questo caso salvata con il nome fit.
17

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

In presenza di una tabella di contingenza `e possibile calcolare il valore di 2 , per verificare la


presenza di connessione o di indipendenza tra le due variabili della tabella. Il test 2 serve
a verificare se il valore della statistica `e significativamente diverso da 0, nel qual caso c`e
dipendenza tra le due variabili.
Costruiamo la tabella di contingenza per le variabili sesso e [Link]. Si vuole verificare lipotesi nulla che ci sia indipendenza tra le due variabili.
> tab = table(sesso, [Link])
> tab
[Link]
sesso 0 1 2 3
F 5 0 2 1
M 4 2 0 1
Per effettuare il test, si utilizza la funzione summary, applicata alla tabella:
> summary(tab)
19

Nella seconda riga questi valori non possono essere calcolati, e il programma restituisce un valore di dato
mancante, NA.

48

Number of cases in table: 15


Number of factors: 2
Test for independence of all factors:
Chisq = 4, df = 3, p-value = 0.3
Chi-squared approximation may be incorrect
> #ripristina le impostazioni iniziali di R
> options(op)
In alternativa si pu`o utilizzare la funzione [Link].
Il valore del p-value associato a questo test `e superiore agli usuali livelli di significativit`a
che vengono fissati, per cui lipotesi di indipendenza non pu`o essere rifiutata.

49

Potrebbero piacerti anche