Laboratorio di R

Transcript

Laboratorio di R
lunedì 12 dicembre 2005 – Brunella Caroleo
Laboratorio di R - 3a lezione
Prof. Mauro Gasparini
1. Verifica di ipotesi: il test t di Student
In R è disponibile la funzione t.test che effettua il test t di Student ad un campione, a due
campioni e per dati appaiati.
L’utilizzo di tale funzione è:
t.test(x, y = NULL, alternative = c("two.sided", "less", "greater"), mu =
0, paired = FALSE, var.equal = FALSE, conf.level = 0.95, ...)
dove:
x , y : sono vettori numerici di dati;
alternative: specifica l’ipotesi alternativa, a seconda che si tratti di una verifica di ipotesi
bilaterale o unilaterale;
mu: un numero che indica il valore reale della media (o la differenza tra le medie se si sta
effettuando un test a due campioni);
paired: una variabile logica che indica se si vuole effettuare un test t per dati appaiati;
var.equal: una variabile logica che indica se porre le varianze dei due campioni uguali fra loro;
conf.level: livello di confidenza dell’intervallo.
Esempio: (esempio 8.4.2 del Ross)
Un gruppo di 22 volontari presso un centro di ricerca medica, viene esposto a vari tipi di virus
influenzali e tenuto sotto controllo medico.
Ad un campione casuale di 10 volontari viene somministrato un grammo di vitamina C quattro volte
al giorno.
Agli altri 12 volontari viene somministrato un placebo non distinguibile dal farmaco.
I volontari vengono poi visitati spesso da un medico che non conosce la divisione in gruppi, e non
appena uno di essi viene trovato guarito si registra la durata della malattia. Alla fine
dell’esperimento si possiedono i dati contenuti nel file es8_4_2.txt.
Si può concludere che l’assunzione di 4 grammi di vitamina C al giorno abbia accorciato il decorso
medio della malattia? A che livello di significatività?
Soluzione:
Per provare l’ipotesi fatta, la assumiamo come ipotesi alternativa e vediamo se rifiutiamo l’ipotesi
nulla corrispondente al livello di significatività desiderato.
Eseguiamo quindi il seguente test:
H 0 : µ vitam _ C ≥ µ placebo
contro
H 1 : µ vitam _ C < µ placebo
supponendo che le varianze della durata della malattia nei due casi siano uguali.
In R:
> t.test(vitam_C, placebo, alternative
var.equal = TRUE, conf.level = 0.95)
=
"less",
paired
Two Sample t-test
data: vitam_C and placebo
t = -1.8987, df = 20, p-value = 0.03606
alternative hypothesis: true difference in means is less than 0
95 percent confidence interval:
-Inf -0.06185013
sample estimates:
mean of x mean of y
6.450
7.125
1
=
FALSE,
lunedì 12 dicembre 2005 – Brunella Caroleo
L’ipotesi nulla viene accettata solo per livelli di significatività α < 0.036 = p-value; l’ipotesi nulla
H0 viene dunque rifiutata ad un livello di significatività del 5%: quindi, a questo livello di
significatività, i dati raccolti evidenziano un accorciamento del decorso dell’influenza
somministrando vitamina C.
________________________________________________________________________________
Esercizio 1: (tratto dall’es. 8.25 del Ross, modificato)
Uno scienziato che si occupa di inquinamento ambientale vuole verificare se due campioni di
soluzioni in suo possesso possono provenire dalla stessa sorgente. Se fosse così, i pH delle due
soluzioni dovrebbero coincidere, e per stabilire se questo sia vero, vengono fatte 10 misurazioni
indipendenti per ciascuna soluzione. I dati ottenuti sono contenuti nel file es8_25.txt.
a) Tali dati mostrano un’apprezzabile differenza nei pH al 5% di significatività?
b) Quanto vale il p-dei-dati (p-value) di questo test?
Soluzione:
Si vuole verificare l’ipotesi:
________________________________________________________________________________
Esercizio 2: (tratto dall’es. 8.39 del Ross)
A 10 donne incinte è stata somministrata un’iniezione di pitocina per stimolarne il travaglio. Le
pressioni sanguigne sistoliche immediatamente prima e dopo la somministrazione sono contenute
nel file es8_39.txt.
Ti sembra che i dati indichino che l’iniezione provochi un cambiamento della pressione sanguigna?
Soluzione:
Si vuole verificare l’ipotesi:
________________________________________________________________________________
2. Regressione lineare
Un modello di regressione lineare può essere descritto da una variabile risposta Y e da una o più
variabili esplicative X1,…, Xr.
La variabile Y è rappresentabile tramite la relazione:
Y = β 0 + β 1 X 1+ K + β r X r+ε
,
r ≥1
in cui β1,…, βr sono i parametri che individuano la relazione tra Y e le variabili esplicative, ed ε è la
variabile errore casuale, che rappresenta la parte di variabilità di Y non riducibile alla dipendenza da
X1,…, Xr. Di solito, si assume che ε ~ N (0, σ 2 ) .
Il modello di regressione lineare non impone la linearità rispetto alle variabili, ma solo rispetto ai
parametri. L’obiettivo è fare inferenza sui valori dei parametri β1,…, βr.
Il comando di R per adattare un modello di regressione lineare è lm, che ha il seguente utilizzo:
nome_modello <- lm(formula)
in cui formula specifica l’espressione del modello che si vuole stimare. In genere formula è
esprimibile nella forma:
variabile risposta ~ variabili esplicative separate da segni +
Per ulteriori dettagli sull’utilizzo del comando lm, si consiglia di consultare la guida di R:
?lm
2
lunedì 12 dicembre 2005 – Brunella Caroleo
Il risultato della funzione lm è una lista composta da numerosi elementi che riassumono la stima del
modello ed a cui si può accedere tramite il simbolo $. I principali sono:
coef: stime dei parametri di regressione;
residuals: residui del modello;
fitted: valori stimati con il modello di regressione.
Il risultato convenzionale di una analisi di regressione si ottiene con il comando
summary(nome_modello).
Esempio:
Si considerino i dati contenuti nel file auto.txt, che contengono nella prima colonna (potenza) i
cavalli di potenza di un’automobile, e nella seconda colonna (consumo) i litri di carburante
consumati ogni 100 km.
Acquisiamo i dati con il comando:
auto <- read.table(‘auto.txt’ , header = TRUE)
attach(auto)
Il punto di partenza è sempre un esame grafico dei dati. Il diagramma di
dispersione delle due variabili si ottiene con:
plot(potenza, consumo, xlab = “potenza”, ylab =
“consumo”)
Le osservazioni sembrano tendenzialmente allineate lungo una retta con coefficiente angolare
positivo e, a conferma di questo, il calcolo del coefficiente di correlazione tra le due variabili
fornisce un valore pari a:
> cor(potenza , consumo)
[1] 0.9520638
Si stima allora il modello di regressione lineare semplice consumo = b1 + b2*potenza tramite
la funzione lm:
> modello <- lm(consumo ~ potenza)
> summary(modello)
Call:
lm(formula = consumo ~ potenza)
Residuals:
Min
1Q
Median
-0.76762 -0.55288 -0.06714
3Q
0.28201
Max
1.24835
Coefficients:
Estimate Std. Error t value
(Intercept) 3.197106
0.591508
5.405
potenza
0.071007
0.005891 12.054
--Signif. codes: 0 '***' 0.001 '**' 0.01
Pr(>|t|)
7.30e-05 ***
4.07e-09 ***
'*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.641 on 15 degrees of freedom
Multiple R-Squared: 0.9064,
Adjusted R-squared: 0.9002
F-statistic: 145.3 on 1 and 15 DF, p-value: 4.065e-09
Dal risultato dell’analisi di regressione risulta che (Coefficients) il modello stimato è:
consumo = 3.197 + 0.071*potenza.
3
lunedì 12 dicembre 2005 – Brunella Caroleo
Si può inoltre affermare che sia l’intercetta sia il coefficiente angolare sono significativi
individualmente, in quanto i livelli di significatività osservati associati sono praticamente nulli
(Pr(>|t|)). Ciò è evidenziato in R da un certo numero di * : maggiore è il numero di *, maggiore
è la significatività della corrispondente variabile.
Nella colonna Std. Error sono riportate le stime degli scarti quadratici medi degli stimatori dei
parametri del modello. Se si è interessati anche alla stima di σ2, il valore della radice della varianza
residua corretta è contenuto in Residual standard error, in questo caso pari a S 2 = 0.641 .
Inoltre, si trova che l’indice di determinazione R2 è abbastanza elevato, pari a 0.9064 (Multiple
R-Squared).
Per sovrapporre il grafico della retta stimata al diagramma di dispersione basta
eseguire i comandi grafici:
plot(potenza , consumo)
abline(modello$coef)
Per una verifica della bontà dell’adattamento al modello, si esegue un’analisi dei residui. Si possono
considerare i seguenti strumenti grafici:
•
il grafico dei residui rispetto alle variabili esplicative ottenuto con il
comando:
resauto <- modello$residuals
plot(potenza, resauto)
ci permette di individuare scorrette specificazioni della dipendenza dalle
variabili esplicative, come ad esempio dipendenze non lineari;
•
il grafico dei residui contro i valori stimati ottenuto con il comando:
fitauto <- modello$fitted
plot(fitauto,resauto)
ci permette di verificare se le ipotesi di omoschedasticità, media nulla e
non correlazione dei residui sono verificate.
In generale, sotto le ipotesi del modello lineare dei minimi quadrati, tali diagrammi non presentano
alcun andamento particolare o sistematico. Ogni scostamento da tali ipotesi indicherà la
necessità di migliorare il modello procedendo ad una sua riformulazione anche con curve di tipo
non lineare o ad una trasformazione delle variabili esplicative ottenibili attraverso la famiglia.
Un altro aspetto molto importante riguarda la verifica della normalità dei
residui. Per verificare tale fatto possiamo utilizzare le funzioni qqnorm e
qqline:
qqnorm(resauto)
qqline(resauto)
Una volta stimato il modello di regressione e memorizzato nella variabile modello è possibile
calcolare i valori predetti nel seguente modo:
predict(modello): se vogliamo calcolare i valori predetti per i dati del dataframe utilizzato per
stimare i coefficienti della regressione;
predict(modello , new) : se vogliamo stimare i valori predetti per nuovi valori delle variabili
contenuti nel dataframe new
4
lunedì 12 dicembre 2005 – Brunella Caroleo
Esercizio 3:
I dati contenuti nel file esercizio_3.txt riportano le temperature (gradi Fahrenheit) di
ebollizione dell’acqua relative a diversi valori della pressione della pressione atmosferica (mmHg).
Si desidera individuare un modello di regressione appropriato per descrivere la relazione esistente
fra le variabili temperatura e pressione.
________________________________________________________________________________
3. Regressione lineare multipla
Vediamo ora come si estendono i risultati ottenuti nel caso della regressione lineare semplice al
caso della regressione lineare multipla, cioè quando invece di basarsi solo su una variabile
indipendente se ne utilizzano diverse.
Esempio:
Si considerino i dati contenuti nel file benzina.txt. Le variabili rilevate sono:
y: percentuale di benzina ottenuta dal petrolio greggio;
x2: gravità del petrolio greggio (° API);
2
x3: pressione del petrolio greggio (lbs/in );
x4: temperatura alla quale il 10% del petrolio si vaporizza (° F);
x5: temperatura alla quale tutto il petrolio si vaporizza (° F).
Si desidera trovare un buon modello per spiegare la percentuale di benzina ottenuta y in funzione
delle quattro variabili disponibili.
Acquisiamo i dati:
benzina <- read.table(‘benzina.txt’ , header = TRUE)
attach(benzina)
Per la scelta del modello di regressione multipla che descrive y in
funzione delle quattro variabili esplicative disponibili, conviene
in primo luogo analizzare i diagrammi di dispersione:
par(mfrow = c(2,2))
plot(x2,y)
title(“(1)”)
plot(x3,y)
title(“(2)”)
plot(x4,y)
title(“(3)”)
plot(x5,y)
title(“(4)”)
Mentre sembra evidente un legame lineare tra la variabile risposta y e x5, non altrettanto si può dire
riguardo il legame tra y e le altre tre variabili esplicative. Tuttavia, poiché si desidera individuare il
modello di regressione più appropriato, si inizia stimando il modello di regressione lineare
completo:
Y = β1 + β 2 X 2+ β 3 X 3+ β 4 X 4+ β 5 X 5
> modello <- lm(y ~ x2 + x3 + x4 + x5)
> summary(modello)
Call:
lm(formula = y ~ x2 + x3 + x4 + x5)
Residuals:
Min
1Q Median
-3.5804 -1.5223 -0.1098
3Q
1.4237
Max
4.6214
5
lunedì 12 dicembre 2005 – Brunella Caroleo
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -6.820774 10.123152 -0.674
0.5062
x2
0.227246
0.099937
2.274
0.0311 *
x3
0.553726
0.369752
1.498
0.1458
x4
-0.149536
0.029229 -5.116 2.23e-05 ***
x5
0.154650
0.006446 23.992 < 2e-16 ***
--Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.234 on 27 degrees of freedom
Multiple R-Squared: 0.9622,
Adjusted R-squared: 0.9566
F-statistic: 171.7 on 4 and 27 DF, p-value: < 2.2e-16
Dall’analisi di regressione risulta che almeno due parametri, l’intercetta β1 e il coefficiente β3, non
sono significativi. Si prova ad eliminare dal modello la variabile x3; stimando il nuovo modello di
regressione si trova:
> modello_1 <- lm(y ~ x2 + x4 + x5)
> summary(modello_1)
Call:
lm(formula = y ~ x2 + x4 + x5)
Residuals:
Min
1Q Median
-3.5303 -1.3606 -0.2681
3Q
1.3911
Max
4.7658
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.032034
7.223341
0.558
0.5811
x2
0.221727
0.102061
2.173
0.0384 *
x4
-0.186571
0.015922 -11.718 2.61e-12 ***
x5
0.156527
0.006462 24.224 < 2e-16 ***
--Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.283 on 28 degrees of freedom
Multiple R-Squared: 0.959,
Adjusted R-squared: 0.9546
F-statistic: 218.5 on 3 and 28 DF, p-value: < 2.2e-16
La sintesi prodotta suggerisce che anche la variabile x2 potrebbe essere eliminata; la sua
eliminazione porta a:
> modello_2 <- lm(y ~ x4 + x5)
> summary(modello_2)
Call:
lm(formula = y ~ x4 + x5)
Residuals:
Min
1Q Median
-3.9593 -1.9063 -0.3711
3Q
1.6242
Max
4.3802
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 18.467633
3.009009
6.137 1.09e-06 ***
x4
-0.209329
0.012737 -16.435 3.11e-16 ***
x5
0.155813
0.006855 22.731 < 2e-16 ***
6
lunedì 12 dicembre 2005 – Brunella Caroleo
--Signif. codes:
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.426 on 29 degrees of freedom
Multiple R-Squared: 0.9521,
Adjusted R-squared: 0.9488
F-statistic: 288.4 on 2 and 29 DF, p-value: < 2.2e-16
Risulta che il modello stimato è:
y = 18.4676 – 0.2093*x4 + 0.1558*x5
con un indice di determinazione R2 = 0.9521.
Per una verifica della bontà di adattamento del modello si esegue un’analisi dei residui. I cinque
numeri forniti da summary(modello_2) non evidenziano notevoli asimmetrie. Quindi, si
considerano il diagramma di dispersione dei residui in funzione dei valori stimati e il diagramma QQ normale:
res_modello_2 <- modello_2$residuals
fit_modello_2 <- modello_2$fitted
par(mfrow = c(1,2))
plot(fit_modello_2, res_modello_2)
qqnorm(res_modello_2)
qqline(res_modello_2)
I grafici ottenuti non sembrano evidenziare andamenti sistematici.
Concludendo, il modello:
y = 18.4676 – 0.2093*x4 + 0.1558*x5
è nel complesso abbastanza soddisfacente per spiegare le percentuali di benzina ottenuta dal
petrolio greggio a partire dalle variabili disponibili.
3. Regressione polinomiale
Esempio:
Si considerino i dati contenuti nel file censimento.txt, che riportano i dati del censimento degli
Stati Uniti (in milioni di persone).
Il valore per l’anno 19 è di 249.63 milioni di persone, ma non lo includeremo nella lista perché ce
ne serviremo per verificare con quale precisione l’equazione interpolante è in grado di prevederlo.
7
lunedì 12 dicembre 2005 – Brunella Caroleo
dati <- read.table('censimento.txt', header = TRUE)
attach(dati)
plot(anno , popopolazione)
> modello <- lm(popolazione ~ anno)
> summary(modello)
Call:
lm(formula = popolazione ~ anno)
Residuals:
Min
1Q
-16.429 -12.623
Median
-6.354
3Q
10.554
Max
32.406
Coefficients:
Estimate Std. Error t value
(Intercept) -35.4159
8.3848 -4.224
anno
12.7506
0.7746 16.460
--Signif. codes: 0 '***' 0.001 '**' 0.01
Pr(>|t|)
0.000646 ***
1.88e-11 ***
'*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 17.05 on 16 degrees of freedom
Multiple R-Squared: 0.9442,
Adjusted R-squared: 0.9408
F-statistic: 270.9 on 1 and 16 DF, p-value: 1.882e-11
Risulta che il modello stimato è:
popolazione = -35.4159 + 12.7506*anno
con un indice di determinazione R2 = 0.9442.
Sovrapponiamo al diagramma di dispersione la retta di regressione
lineare così ottenuta:
win.graph()
plot(anno,popolazione)
abline(modello$coef)
Per una verifica della bontà di adattamento del modello si esegue un’analisi dei residui. I cinque
numeri forniti da summary(modello) evidenziano asimmetrie. Si considerano il diagramma di
dispersione dei residui in funzione dei valori stimati e il diagramma Q-Q normale:
res_modello <- modello$residuals
win.graph()
par(mfrow = c(1,2))
plot(anno, res_modello)
qqnorm(res_modello)
qqline(res_modello)
8
lunedì 12 dicembre 2005 – Brunella Caroleo
Si nota una forte regolarità nei residui, che sono prima decrescenti e poi crescenti all’aumentare
dell’ingresso. Questo di solito significa che per descrivere la relazione tra ingresso e risposta si
rendono necessari termini di grado più elevato (rispetto a quelli lineari), e ciò in questo caso è ben
visibile anche dal diagramma di dispersione dei dati (i quali, più che una retta, sembrano seguire
una parabola).
Visti anche i discostamenti nel Q-Q plot, vediamo se esiste un modello migliore per descrivere la
relazione tra l’anno del censimento e la popolazione; proviamo con una trasformazione non lineare
della variabile esplicativa. Si sceglie, ad esempio, una relazione del tipo anno^2:
> modello_1 <- lm(popolazione ~ I(anno^2))
> summary(modello_1)
Call:
lm(formula = popolazione ~ I(anno^2))
Residuals:
Min
1Q
-6.9051 -0.5140
Median
0.1233
3Q
1.9487
Max
3.6852
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.149892
1.035534
6.905 3.54e-06 ***
I(anno^2)
0.670537
0.006682 100.355 < 2e-16 ***
--Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.876 on 16 degrees of freedom
Multiple R-Squared: 0.9984,
Adjusted R-squared: 0.9983
F-statistic: 1.007e+04 on 1 and 16 DF, p-value: < 2.2e-16
Risulta che il modello stimato è:
popolazione = 7.149892 + 0.670537*anno^2
con un indice di determinazione molto alto (R2 = 0.9984).
Sovrapponiamo al diagramma di dispersione la retta di regressione lineare così ottenuta:
stime <- modello_1$coef
win.graph()
plot(anno,popolazione)
lines ( anno , stime[1] + stime [2] * anno^2 ,
type="l")
Si considerano il diagramma di dispersione dei residui in funzione dei valori stimati e il diagramma
Q-Q normale:
res_modello_1 <- modello_1$residuals
fit_modello_1 <- modello_1$fitted
win.graph()
par(mfrow = c(1,2))
plot(fit_modello_1, res_modello_1)
qqnorm(res_modello_1)
qqline(res_modello_1)
9
lunedì 12 dicembre 2005 – Brunella Caroleo
Il modello:
popolazione = 7.149892 + 0.670537*anno^2
risulta quindi soddisfacente per descrivere il legame tra l’anno e la popolazione residente negli Stati
Uniti.
Se ora vogliamo prevedere la popolazione per l’anno 19:
> new <- data.frame ( anno = 19 )
> predict(modello_1, new, se.fit = TRUE)
$fit
[1] 249.2136
$se.fit
[1] 1.764593
$df
[1] 16
$residual.scale
[1] 2.875765
La stima per la popolazione residente è di 249.21 milioni di persone; notiamo quindi come
l’equazione interpolante è in grado di prevedere la popolazione, dato che nella realtà il valore per
l’anno 19 è di 249.63 milioni di persone.
10