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