Laboratorio R Corso di Algebra e Modelli lineari (Anno Accademico 2015-16) REGRESSIONE LINEARE SEMPLICE OPEN STATISTICA 8.44 Per 8 settimanali, appartenenti alla medesima fascia di prezzo e presenti in edicola a una certa data, sono stati rilevati il numero X di pagine dedicate ad arte e cultura e le vendite Y (in milioni di lire) effettuate nella settimana. I dati sono riportati nella seguente tabella: X 0 1 2 5 7 10 14 20 Y 375 450 500 725 800 950 1025 1200 a) Si stimino con il metodo dei minimi quadrati i parametri β0 e β1 del modello: Y=β0 + β1X + ε In R i due vettori dei dati X e Y vengono costruiti come segue: > x<-c(0,1,2,5,7,10,14,20) > y<-c(375,450,500,725,800,950,1025,1200) Può essere interessante visualizzare la nube dei punti attraverso un grafico che contenga la cosiddetta spezzata di regressione. In R si utilizza la funzione plot che visualizza la successione dei punti seguita dalla funzione lines che ha l’obiettivo di congiungere con una linea i punti del diagramma. Gli argomenti delle funzioni sono nell’ordine il vettore delle X e quello delle Y: > plot(x,y) > lines(x,y) 1 Esistono altri argomenti opzionali per la personalizzazione del grafico (relativamente agli assi, ai titoli, legenda, colori ecc.). Per una più dettagliata trattazione si rimanda all’help in linea del linguaggio R: > help(plot) Per stimare i parametri della retta di regressione si può procedere calcolando dettagliatamente tutte le formule derivanti dal metodo dei minimi quadrati oppure utilizzando le funzioni già predisposte a questo proposito in R. Relativamente al primo approccio, (più laborioso ma sicuramente più costruttivo!) è necessario valutare medie, devianze e codevianze. Si costruiscano i vettori scarto dalle medie utilizzando la funzione mean che calcola la media aritmetica di una successione di valori: > x.scarti<- x-mean(x) > y.scarti<- y-mean(y) La devianza di X, quella di Y e la codevianza risultano allora: > dev.x <- sum(x.scarti^2) > dev.y <- sum(y.scarti^2) > codev.xy <- sum(x.scarti*y.scarti) L’intercetta e il coefficiente di regressione risultano quindi: > b1 <- codev.xy/dev.x [1] 41.45826 > b0 <- mean(y)-mean(x)*b1 [1] 447.3704 Alternativamente per stimare un modello di regressione lineare si può utilizzare la funzione lm. Tale funzione è può essere utilizzata più in generale per vari tipi di modelli lineari, quali modelli di regressione lineari e multipli, analisi della varianza e analisi della covarianza. Come ogni altra funzione, lm prevede argomenti necessari e facoltativi. Quello indispensabile in questo caso è una formula, ovvero una descrizione simbolica del modello da stimare. La descrizione deve essere fatta in questo modo: variabile risposta ~ variabili esplicative pertanto in questo contesto la funzione sarà: > output.reg.lin <- lm(y~x) Il risultato della regressione lineare è racchiuso in una lista un oggetto complesso in R articolato in più vettori, matrici o altri oggetti. Al fine di visualizzare separatamente gli oggetti della lista si utilizza il simbolo $ seguito dal nome dell’oggetto stesso. La stima dei parametri è contenuta nel vettore coefficients: > output.reg.lin$coefficients (Intercept) 447.37036 x 41.45826 A questo punto è possibile visualizzare graficamente la retta di regressione. A tal proposito si valutino i valori teorici: > y.teorici<-b0+b1*x 2 Se si vuole ottenere un grafico che visualizzi la retta passante attraverso la nube dei punti osservata si digitino le funzioni plot per la nube dei punti e points che aggiunge una serie di dati ad un grafico corrente. Con le opzioni type=“l” e col=“2” (rosso) si intende rappresentare una linea continua e di colore rosso: > plot(x,y) > points(x,y.teorici,type="l",col="2") Si potevano altresì utilizzare i comandi: > plot(x,y) > abline(output.reg.lin) b) Si determinino gli intervalli di confidenza al 99% per il coefficiente angolare e l’intercetta Prima di utilizzare l’output derivante dalla funzione lm si proceda per passi, calcolando tutte le quantità necessarie per le formule: b1 ± tα 2;n − 2 s ydisp ∑ (x − x) 2 j j 1 x2 + n ∑ (x j − x )2 bo ± tα 2;n − 2 s ydisp j La radice quadrata della varianza di dispersione si può calcolare nel seguente modo: > dev.disp<-sum((y-y.teorici)^2) [1] 30124.13 > s.disp<-sqrt(dev.disp/6) [1] 70.85681 3 Alternativamente l’output della funzione lm comprende i valori teorici e i residui negli oggetti denominati rispettivamente fitted.values e residuals. Pertanto la devianza di dispersione si poteva ottenere anche nel seguente modo: > dev.disp<-sum((output.reg.lin$residuals)^2) Il valore teorico della distribuzione t di Student in corrispondenza di un determinato livello di significatività lo si determina facendo ricorso alla funzione qt. Tale funzione (cosi come le funzioni qnorm, qbinom, qf, ecc.) determina il valore di ascissa della funzione di ripartizione in modo che l’area alla sua sinistra corrisponda ad una determinata frazione percentuale. La funzione prende due argomenti necessari: la frazione percentuale dell’area e i gradi di libertà. Essendo l’intervallo di confidenza pari al 99% si noti che > qt(0.005,6) [1] -3.707428 > qt(0.995,6) [1] 3.707428 essendo la distribuzione t simmetrica e pertanto il valore teorico di t è dato da: > t.value<-qt(0.995,6) Ora gli estremi dell’intervallo di confidenza per il coefficiente angolare sono dati da: > inf.b1<-b1-t.value*s.disp/sqrt(dev.x) [1] 27.20892 > sup.b1<-b1+t.value*s.disp/sqrt(dev.x) [1] 55.7076 mentre quelli per l’intercetta sono dati da: > sup.b0<-b0+t.value*s.disp*sqrt(1/8+(mean(x)^2/dev.x)) [1] 587.6196 > inf.b0<-b0-t.value*s.disp*sqrt(1/8+(mean(x)^2/dev.x)) [1] 307.1211 c) Il valore della variabile Y, y0, quando xd =7 Si tratta di un problema di previsione: poiché non si è in grado di prevedere in maniera esatta il valore di una singola estrazione occorre determinare l’intervallo di confidenza per il valore y0. Tale intervallo viene determinato applicando la formula: 1 (xd − x )2 i = ( b0 + b1 xd ) ± tα 2;n−2 sydisp 1+ + n ∑( x j − x )2 j Dunque si avrà: > inf.y0<-b0+b1*7-(t.value*s.disp*sqrt(1+1/8+((7-mean(x))^2/dev.x))) [1] 458.8952 > sup.y0<-b0+b1*7+(t.value*s.disp*sqrt(1+1/8+((7-mean(x))^2/dev.x))) [1] 1016.261 4 OPEN STATISTICA 8.44 Si sono valutati i consumi di 10 utilitarie di case automobilistiche diverse con i seguenti risultati: Velocità in miglia per 50 ora (X) 55 60 65 70 75 Consumo in miglia 34.8 per gallone (Y) 33.6 34.6 32.8 32.6 31.6 30.9 34.1 31.9 31.8 a) Si stimi il modello di regressione di Y su X > x<-c(50,50,55,55,60,60,65,70,70,75) > y<-c(34.8,33.6,34.6,34.1,32.8,31.9,32.6,31.6,31.8,30.9) > output.reg.lin<-lm(y~x) > output.reg.lin$coefficients (Intercept) x 41.3304348 -0.1386957 b) Si valuti con un test opportuno l’esistenza di un legame lineare tra la velocità e il consumo di benzina, scegliendo α=0,01. Si tratta di verificare l’ipotesi nulla H0: β1=0 attraverso la statistica test: tc = b1 * 2 j ∑ (y − y ) (n − 2)∑ (x − x ) j 2 j in cui la devianza di dispersione è: > dev.disp<-sum(output.reg.lin$residuals^2) [1] 3.147826 la devianza di x è: > dev.x<-sum((x-mean(x))^2) [1] 690 mentre b1 è il secondo elemento del vettore output.reg.lin$coefficients e lo si seleziona mediante > b1<-output.reg.lin$coefficients[2] Pertanto la statistica test risulta : > tc<-b1/sqrt(dev.disp/(8*dev.x)) [1] -5.808006 5 Per verificare l’ipotesi nulla si confronta tale valore con quello teorico ottenuto in corrispondenza di α=0,01 e di 8 gradi di libertà: > qt(0.005,8) [1] -3.355387 Poiché –5.808006 < -3.355387 si rifiuta l’ipotesi nulla. In modo analogo si poteva calcolare il p-value associato alla statistica test -5.808006. La funzione pt (e così le funzioni pnorm, pbinom, pf ecc.) calcola l’area della coda della distribuzione t di Student in corrispondenza di due argomenti: l’ascissa e i gradi di libertà. Pertanto: > 2*pt(–5.808006,8) [1] 0.0004014839 ed essendo 0.0004014839<0.01 (=α) si conclude che “o si è verificato un evento molto raro, oppure l’ipotesi nulla non è vera”. Quindi si rifiuta l’ipotesi nulla di indipendenza lineare tra i consumi e la velocità. Agli stessi risultati si poteva arrivare utilizzando la funzione summary applicata all’output di lm. La funzione produce alcune informazioni di sintesi sulla stima del modello lineare: > summary(output.reg.lin) Call: lm(formula = y ~ x) Residuals: Min 1Q -1.10870 -0.16359 Median 0.07826 3Q 0.36957 Max 0.89783 Coefficients: Estimate Std. Error t value (Intercept) 41.33043 1.47013 28.113 x -0.13870 0.02388 -5.808 --Signif. codes: 0 `***' 0.001 `**' 0.01 Pr(>|t|) 2.77e-09 *** 0.000401 *** `*' 0.05 `.' 0.1 ` ' 1 Residual standard error: 0.6273 on 8 degrees of freedom Multiple R-Squared: 0.8083, Adjusted R-squared: 0.7843 F-statistic: 33.73 on 1 and 8 DF, p-value: 0.0004015 Vi sono elencate informazioni sui residui, sulla verifica di ipotesi dei parametri, sull’indice di determinazione lineare e sul test F per valutare la significatività del modello di regressione. Con riferimento alla parte intitolata Coefficients si ritrova la statistica test e il p-value calcolati per la stima del coefficiente di regressione. L’indice di determinazione lineare R-Squared risulta 0.8083 e lo si poteva altresì ottenere con i seguenti passaggi: > dev.tot<-sum((y-mean(y))^2) > dev.reg<-dev.tot-dev.disp > dev.reg/dev.tot [1] 0.8083048 La statistica F, Fc = Devreg (Y ) 1 s2 = 2reg la si può calcolare anche come: Devdisp (Y ) (n − 2) sdisp > dev.reg/(dev.disp/8) [1] 33.73293 6 Se si vuole visualizzare la tabella dell’analisi della varianza per questo modello di regressione si può utilizzare il comando anova: > anova(output.reg.lin) Analysis of Variance Table Response: y Df Sum Sq Mean Sq F value Pr(>F) x 1 13.2732 13.2732 33.733 0.0004015 *** Residuals 8 3.1478 0.3935 --Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 7