5.1 Il modello di regressione lineare semplice

Come sappiamo, il modello di regressione lineare semplice è definito come

\[\begin{equation} Y_i = \beta_0 + \beta_1 x_i + \varepsilon_i, \quad i=1,\ldots,n, \tag{5.1} \end{equation}\]

dove \((x_i, y_i)\) rappresentano le coppie di osservazioni facenti parte del campione, \(\beta_0\) e \(\beta_1\) sono i coefficienti non noti che si suppone leghino le variabili \(X\) e \(Y\) nella popolazione, mentre \(\varepsilon_i\) corrisponde all’errore casuale che intuitivamente descrive l’informazione relativa a \(Y\) che non è possibile spiegare attraverso una funzione lineare di \(X\). In aggiunta all’equazione (5.1), il modello di regressione lineare semplice è definito anche dalle seguenti ipotesi:

  1. le osservazioni \(x_i\) sono costanti o realizzazioni di una variabile aleatoria \(X\) non correlata con le componenti aleatorie di errore, \(\varepsilon_i\). In quest’ultimo caso l’inferenza è svolta condizionatamente ai valori osservati di \(X\)
  2. gli errori aleatori, \(\varepsilon_i\), sono variabili aleatorie con media 0 e varianza \(\sigma^2\) costante per ogni \(i = 1,\ldots,n\) (omoschedasticità)
  3. gli errori aleatori, \(\varepsilon_i\), non sono correlati tra loro
  4. gli errori aleatori, \(\varepsilon_i\), sono distribuiti secondo una distribuzione normale

La funzione principale per stimare un modello di regressione lineare in R è lm(), che sta per linear model. Il primo argomento di questa funzione è un tipo di oggetto che non abbiamo mai usato finora chiamato formula. Gli oggetti di tipo formula sono impiegati in R per specificare una relazione tra una variabile dipendente y e una (o più) variabili indipendenti x. Per specificare un oggetto di tipo formula è necessario utilizzare un simbolo particolare che non è sempre facile recuperare sulle tastiere italiane, ovvero il simbolo di tilde “~40. La particolare combinazione di tasti che è necessario usare per ottenere tale simbolo dipende dal sistema operativo (Mac, Windows, ecc.), dal tipo di macchina che state usando (laptop, desktop, ecc.), oltre che dal particolare brand della vostra macchina. Per questo motivo, non è possibile indicare qui in modo univoco come ottenere la tilde sul vostro particolare computer, ma vi suggeriamo un modo poco elegante, ma molto semplice, per recuperarlo: eseguite il codice ?tilde, copiate il carattere di tilde che trovate nella pagina di help e incollatelo dove vi serve41.

La sintassi generale della funzione lm() è

lm(y ~ x),

la quale restituisce una lista (si veda la Sezione 1.3.6) contenente un gran numero di risultati relativi alla stima del modello considerato. A titolo d’esempio, consideriamo il data frame comp disponibile nel file competitors.RData. Il data frame comp contiene i valori rilevati in 113 settimane successive per le seguenti variabili relative a un’azienda che produce un prodotto destinato al consumo alimentare:

  • mktshare indica la quota di mercato (in termini relativi) dell’azienda rilevata alla fine di ogni settimana
  • ownprice indica il prezzo (in $) alla fine di ogni settimana del prodotto offerto dall’azienda in questione
  • comp1price indica il prezzo (in $) alla fine di ogni settimana del medesimo prodotto offerto da un competitor dell’azienda
  • comp2price indica il prezzo (in $) alla fine di ogni settimana del medesimo prodotto offerto da un secondo competitor dell’azienda

Vogliamo stimare la relazione lineare che intercorre tra la quota di mercato dell’azienda nelle varie settimane e il prezzo del proprio prodotto nelle medesime settimane, ovvero ci interessa stimare il modello

\[\begin{equation} \mbox{mktshare}_i = \beta_0 + \beta_1 \mbox{ownprice}_i + \varepsilon_i. \tag{5.2} \end{equation}\]

Dopo aver caricato il file dei dati (vedi la Sezione 1.8), si può utilizzare la funzione View() per vederli. Il codice seguente utilizza la funzione lm() per stimare il modello, i cui risultati sono memorizzati nell’oggetto comp_m1, di cui si può ottenere una sintesi attraverso la funzione summary():

> load("competitors.RData")
> comp_m1 <- lm(mktshare ~ ownprice, data = comp)
> summary(comp_m1)

Call:
lm(formula = mktshare ~ ownprice, data = comp)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.01715 -0.00961 -0.00310  0.00642  0.05011 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.11043    0.01498    7.37  3.2e-11 ***
ownprice    -0.04532    0.00896   -5.06  1.7e-06 ***
---
Signif. codes:  
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.0129 on 111 degrees of freedom
Multiple R-squared:  0.187, Adjusted R-squared:  0.18 
F-statistic: 25.6 on 1 and 111 DF,  p-value: 1.67e-06

Vi facciamo notare che oltre all’argomento di tipo formula mktshare ~ ownprice, che specifica il modello da stimare, nella funzione lm() abbiamo aggiunto anche un secondo argomento, denominato data. Questo argomento serve per indicare ad R il data frame in cui si trovano le variabili specificate nella formula42.

La funzione summary(), applicata alla lista restituita dalla funzione lm(), produce un output che consiste delle seguenti parti:

  • la prima riga dell’output (Call) riporta il codice che è stato eseguito
  • la seconda parte dell’output (Residuals) offre una sintesi dei residui del modello
  • la terza parte (Coefficients) fornisce le stime dei coefficienti del modello insieme ai relativi p-value. Per l’esempio precedente, il modello stimato è quindi dato da
\[\begin{equation} \widehat{\mbox{mktshare}}_i = 0.1104 -0.0453 \, \mbox{ownprice}_i. \tag{5.3} \end{equation}\]
  • la quarta e ultima parte (ultime tre righe) contiene alcuni indici utili per valutare la bontà complessiva del modello, in particolare la stima di \(\sigma\) (indicata come Residual standard error), l’indice \(R^2\) (riportato come Multiple R-squared), e il test \(F\) (ultima riga dell’output)

L’indice \(R^2\) (0.1874) indica una limitata capacità predittiva del modello, anche se il basso p-value del coefficiente \(\beta_1\) (1.67e-06) segnala che l’associazione lineare tra le due variabili è significativa da un punto di vista statistico.

E’ possibile visualizzare la retta stimata direttamente sul diagramma di dispersione delle due variabili attraverso il seguente codice43:

> plot(mktshare ~ ownprice, data = comp)
> abline(comp_m1, lwd = 2, col = "blue")
Diagramma di dispersione di `mktshare` contro `ownprice` e relativa retta stimata.

Figura 5.1: Diagramma di dispersione di mktshare contro ownprice e relativa retta stimata.

La prima linea di codice usa la funzione plot(), ma a differenza di quanto abbiamo visto in precedenza, in questo caso abbiamo indicato le variabili da rappresentare nel grafico attraverso una formula. La seconda linea di codice utilizza invece la funzione abline(), la quale aggiunge al grafico attivo una linea, in questo caso la retta stimata.

L’output fornito da R per un modello di regressione lineare include i p-value per i test sui due coefficienti, ma non include i rispettivi intervalli di confidenza. Per ottenere questi ultimi è necessario utilizzare la funzione confint() direttamente sul risultato di lm(). Per il precedente esempio otteniamo:

> confint(comp_m1)
               2.5 %   97.5 %
(Intercept)  0.08074  0.14012
ownprice    -0.06307 -0.02757

Altre funzioni utili per esaminare i risultati della stima di un modello di regressione lineare (non solo semplice) sono:

  • coef(), che stampa le stime dei coefficienti
  • residuals(), che calcola i residui del modello
  • fitted(), che calcola i valori previsti dal modello per le sole osservazioni incluse nel campione
  • anova(), che produce la scomposizione della devianza
  • predict(), che consente di calcolare le previsioni in modo più generale

Tralasciando per il momento predict(), alla quale dedicheremo una sezione successiva del capitolo, vediamo ora il tipo di output prodotto dalle altre:

> coef(comp_m1)
(Intercept)    ownprice 
    0.11043    -0.04532 
> anova(comp_m1)
Analysis of Variance Table

Response: mktshare
           Df  Sum Sq Mean Sq F value  Pr(>F)    
ownprice    1 0.00428 0.00428    25.6 1.7e-06 ***
Residuals 111 0.01855 0.00017                    
---
Signif. codes:  
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Il seguente codice salva in due nuovi vettori i valori previsti dal modello per le osservazioni incluse nel campione e i relativi residui, che ricordiamo sono definiti come le differenze tra i valori osservati e quelli previsti. Queste quantità possono essere rappresentate in un grafico, chiamato grafico dei residui, che rappresenta uno strumento fondamentale per valutare la bontà del modello (ovvero delle ipotesi teoriche riguardanti gli errori):

> comp_m1_fitted <- fitted(comp_m1)
> comp_m1_resid <- residuals(comp_m1)
> plot(comp_m1_fitted, comp_m1_resid, xlab = "Valori previsti", ylab = "Residui")
> abline(h = 0, lty = 2)
Grafico dei residui contro i valori previsti per il modello `comp_m1`.

Figura 5.2: Grafico dei residui contro i valori previsti per il modello comp_m1.

Le opzioni h e lty nel codice precedente servono rispettivamente a disegnare una linea orizzontale (in corrispondenza del valore 0 sull’asse verticale) e a scegliere il tipo di linea (il valore 2 indica una linea tratteggiata).


  1. Si usa il simbolo di tilde perché R è un software nato e sviluppato nei paesi anglosassoni e sulle tastiere US e UK tale simbolo è direttamente disponibile su uno dei tasti.

  2. In generale, sui computer Mac dovreste poter recuperare il simbolo di tilde con la combinazione di tasti alt+5, ovvero il tasto option solitamente situato a sinistra della barra spaziatrice insieme al numero 5. Sulla maggior parte dei computer desktop (ma non laptop) con sistema operativo Windows, la tilde si riesce a recuperare con la combinazione di tasti Alt+126, ovvero il tasto Alt (di solito situato a sinsitra della barra spaziatrice) insieme al numero 126. Il numero 126 deve essere digitato sul tastierino numerico della tastiera (ovvero non dovete usare i numeri posti sopra la parte centrale della tastiera). Purtroppo, sui laptop la posizione di questo simbolo dipende dalla tastiera e dal brand del laptop stesso, per cui vi invitiamo a consultare le istruzioni del vostro laptop.

  3. Ciò è necessario perché le variabili di un data frame non sono disponibili come oggetti autonomi nella memoria di R, a meno che non abbiate prima usato attach().

  4. L’opzione lwd consente di scegliere lo spessore della linea, mentre col permette di scegliere il colore.