Ricerca Sociale con R

Una wiki per l'analisi dei dati con R

Strumenti Utente

Strumenti Sito


r:modelli:regressione_multipla

Regressione lineare multipla

Modello additivo e con interazione

Vedi Le formule dei modelli

Tab. 1: Esempio: dataset mtcars
mpg miglia per gallone
hp potenza
wt peso

I regressori (o predittori) del modello sono le variabili indipendenti (i regressori principali $X_j$) e le loro eventuali interazioni (regressori subordinati).

Il numero di coefficienti ($b_j$ o $\beta_j$) è pari al numero di regressori, più l’eventuale intercetta ($b_0$ o $\beta_0$).

modello additivo

$$\hat Y = a + b_1X1 + b_2X2$$

mpg ~ wt + hp

In questo caso, i regressori sono due ($b_1$, $b_2$), i coefficienti sono tre (con $a$).

modello con interazione

$$\hat Y = a + b_1X1 + b_2X2 + b_3X1X2$$

mpg ~ wt * hp

In questo caso, i regressori stimati saranno invece tre: oltre a $b_1$, $b_2$, avremo infatti anche un $b_3$, per l'interazione fra i primi due.

Analisi esplorativa

summary(mtcars[c("mpg","hp","wt")])
##       mpg              hp              wt       
##  Min.   :10.40   Min.   : 52.0   Min.   :1.513  
##  1st Qu.:15.43   1st Qu.: 96.5   1st Qu.:2.581  
##  Median :19.20   Median :123.0   Median :3.325  
##  Mean   :20.09   Mean   :146.7   Mean   :3.217  
##  3rd Qu.:22.80   3rd Qu.:180.0   3rd Qu.:3.610  
##  Max.   :33.90   Max.   :335.0   Max.   :5.424  

Assunti

Gli assunti del modello sono:

  • la linearità della relazione;
  • indipendenza dei residui;
  • omoschedasticità (varianza costante) dei residui;
  • normalità della distribuzione dei residui, con media pari a zero;
  • Assenza di multicollinearità perfetta: nessuna variabile indipendente nel modello deve essere una combinazione lineare perfetta di una o più altre variabili indipendenti.
plot(mtcars[c("mpg","hp","wt")])

oppure, meglio:

library(psych)
pairs.panels(mtcars[c("mpg","hp","wt")])

che produce il seguente grafico:

Fig. 1: Relazioni fra le variabili del modello

Verifica di normalità

Anche se gli assunti di normalità riguardano i residui, e non le variabili del modello, il controllo della normalità è un'analisi utile per anticipare potenziali problemi di eteroschedasticità o di influenza sproporzionata di alcuni dati (asimmetria e outliers).

Utilizziamo la funzione shapiro.test() (vedi test di Shapiro).

Tab. 2: Test di normalità sulle variabili
statistic p.value
mpg 0,9475647 0,1228814
wt 0,9432577 0,0926550
hp 0,9334193 0,0488082

Il test conferma che gli outliers della variabile hp determinano uno scostamento dalla normalità.

boxplot(scale(mtcars[c("mpg","hp","wt")]))
Fig. 2: Boxplot delle variabili standardizzate

Multicollinearità

  • Matrice di correlazione: Si calcola la correlazione (es. Pearson) tra ogni coppia di predittori. Valori molto alti ($|r| > 0.8$ o $0.9$) indicano un problema di collinearità semplice.
  • VIF - Variance Inflation Factor: calcolato per ciascun predittore e indica quanto la varianza del suo coefficiente stimato è “gonfiata” dalla presenza degli altri predittori.Un VIF di 1 indica assenza di correlazione.Valori VIF superiori a 5 o, più conservativamente, a 10, sono generalmente considerati problematici e indicano multicollinearità.

Correlazione

cor.test(mtcars$hp, mtcars$wt)
## 	Pearson's product-moment correlation
## 
## data:  mtcars$hp and mtcars$wt
## t = 4.7957, df = 30, p-value = 4.146e-05
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4025113 0.8192573
## sample estimates:
##       cor 
## 0.6587479 

Se si tratta di più variabili, si può creare una matrice di correlazione.

VIF

Il test VIF è disponibile in diversi pacchetti di R, dei quali i più diffusi sono DescTools e car. Qui utilizzeremo quest'ultimo. La sintassi è vif(modello):

library(car)
vif(lm(mpg ~ wt + hp, data = mtcars))
##       wt       hp 
## 1.766625 1.766625 

Modello additivo

fit1 <- lm(mpg ~ wt + hp, data = mtcars) 
summary(fit1)
## Call:
## lm(formula = mpg ~ wt + hp, data = mtcars)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -3.941 -1.600 -0.182  1.050  5.854 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 37.22727    1.59879  23.285  < 2e-16 ***
## wt          -3.87783    0.63273  -6.129 1.12e-06 ***
## hp          -0.03177    0.00903  -3.519  0.00145 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.593 on 29 degrees of freedom
## Multiple R-squared:  0.8268,	Adjusted R-squared:  0.8148 
## F-statistic: 69.21 on 2 and 29 DF,  p-value: 9.109e-12

`

Ovvero: $\hat{mpg} = 32,23 -3,88wt -0,03hp$

Modello con interazione

fit2 <- lm(mpg ~ wt * hp, data = mtcars) 
summary(fit2)
## Call:
## lm(formula = mpg ~ wt * hp, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.0632 -1.6491 -0.7362  1.4211  4.5513 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 49.80842    3.60516  13.816 5.01e-14 ***
## wt          -8.21662    1.26971  -6.471 5.20e-07 ***
## hp          -0.12010    0.02470  -4.863 4.04e-05 ***
## wt:hp        0.02785    0.00742   3.753 0.000811 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.153 on 28 degrees of freedom
## Multiple R-squared:  0.8848,	Adjusted R-squared:  0.8724 
## F-statistic: 71.66 on 3 and 28 DF,  p-value: 2.981e-13

Ovvero: $\hat {mpg} = 49,81 -8,21 wt -0,12 hp +0,03 wt \cdot hp$

L'R quadro corretto

Aumentando il numero delle variabili indipendenti, vi è una certa quota di varianza aggiuntiva spiegata, indipendentemente dalla significatività del contributo di ciascuna variabile. Per questa ragione, si utilizza un coefficiente di determinazione “corretto” (Adjusted R-squared), rispetto al numero dei regressori ($p$, parametri):

$$\text{adj.R2} = 1 - (1- R^2)\frac{n-1} {n - p - 1}$$

# per il primo modello
1 - (1 - 0.8268) * (31 / 29)
 
# oppure
1 - (1 - summary(fit1)$r.squared) * (31 / fit1$df.residual)
## [1] 0.8148396
# per il secondo modello
1 - (1 - 0.8848) * (31 / 28)
 
# oppure
1 - (1 - summary(fit2)$r.squared) * (31 / fit2$df.residual)
## [1] 0.872417

Confronto fra i modelli

Test F e analisi della devianza

Tabella delle statistiche

Con la funzione glance() del pacchetto broom (vedi la pagina Broom, e rbind(), è semplice creare una tabella in cui vengono messe a confronto le statistiche dei modelli.

library(broom)
 
rbind("fit1" = glance(fit1), 
      "fit2" = glance(fit2))
## # A tibble: 2 x 11
##   r.squared adj.r.squared sigma statistic  p.value    df logLik   AIC   BIC deviance df.residual
## *     <dbl>         <dbl> <dbl>     <dbl>    <dbl> <int>  <dbl> <dbl> <dbl>    <dbl>       <int>
## 1     0.827         0.815  2.59      69.2 9.11e-12     3  -74.3  157.  163.     195.          29
## 2     0.885         0.872  2.15      71.7 2.98e-13     4  -67.8  146.  153.     130.          28

Script di esempio

E' possibile scaricare ed eseguire lo script dell'esempio:

Es-regr-mult.R
# analisi esplorativa ------------------
library(psych)
 
summary(mtcars[c("mpg","hp","wp")])
 
# grafici
plot(mtcars[c("mpg","hp","wp")])
pairs.panels(mtcars[c("mpg","hp","wt")])
boxplot(scale(mtcars[c("mpg","hp","wt")]))
 
# test VIF
library(car)
vif(lm(mpg ~ wt + hp, data = mtcars))
 
# analisi di regressione ----------------
 
# modello additivo
fit1 <- lm(mpg ~ wt + hp, data = mtcars) 
summary(fit1)
 
# modello con interazione
fit2 <- lm(mpg ~ wt * hp, data = mtcars) 
summary(fit2)
 
# confronto
library(broom)
rbind("fit1" = glance(fit1), 
      "fit2" = glance(fit2))

Domande? Scrivimi

Messenger Telegram Email
r/modelli/regressione_multipla.txt · Ultima modifica: 29/10/2025 15:14 da Agnese Vardanega