lunedì 17 dicembre 2018

La regressione lineare: assunti e modelli

La regressione lineare (x variabile indipendente) viene trattata estesamente in tutti i testi di statica, ai quali si rimanda per gli aspetti tecnici [1]. Tuttavia esiste un aspetto relativo al calcolo della regressione lineare che viene spesso sottovalutato, ed è il fatto che fornisce risultati che dipendono da quale delle due variabili in esame sia assunta come variabile indipendente, che per definizione, per le esigenze imposte dal modello matematico impiegato, deve essere posta sull'asse delle ascisse (x). L'altra variabile, la variabile dipendente, viene posta sull'asse delle ordinate (y).

Si considerino i seguenti dati (simulati):

Variabile 1
Variabile 2
9
9
10
10
11
11
9
10
10
9
10
11
11
10

Non avendo alcuna ragione per assumere l'una o l'altra delle due variabili come la variabile indipendente:
→ prima calcoliamo l'equazione della retta di regressione x variabile indipendente ponendo sull'asse delle ascisse (x) la Variabile 1;
→ poi ricalcoliamo l'equazione della retta di regressione x variabile indipendente ponendo sull'asse delle ascisse (x) la Variabile 2;
→ ricaviamo da quest'ultima l'equazione della retta di regressione y variabile indipendente;
→ infine calcoliamo l'equazione della retta di regressione con un metodo che non impiega nessuna delle due come variabile indipendente, ma calcola la media geometrica dei coefficienti angolari della regressione x variabile indipendente e della regressione y variabile indipendente (regressione media geometrica) [2, 3].

Copiate la prima parte dello script [4], quindi incollatela nella Console di R e premete ↵ Invio:

# MODELLI DI REGRESSIONE PARAMETRICA retta y = a + b·x con dati simulati (1/4)
#
windows() # apre una nuova finestra
par(mfrow=c(2,2)) # predispone la suddivisione della finestra in quattro quadranti, uno per grafico
#
var_1 <- c(9,10,11,9,10,10,11) # variabile 1
var_2 <- c(9,10,11,10,9,11,10) # variabile 2
#
x <- var_1 # variabile 1 in ascisse
y <- var_2 # variabile 2 in ordinate
plot(x, y, xlim = c(0,15), ylim = c(0,15), xlab="Variabile 1", ylab="Variabile 2", main="Regressione x variabile indipendente", cex.main = 0.9) # grafico dei dati
regpar <- lm(y ~ x) # regressione lineare standard
a_yx <- regpar$coefficients[1] # intercetta a
b_yx <- regpar$coefficients[2] # coefficiente angolare b
abline(a_yx, b_yx, col="blue") # retta di regressione x variabile indipendente
c(a_yx, b_yx) # mostra a e b
#

Il risultato di questa prima parte dello script, nel quale l'equazione della retta di regressione x variabile indipendente è calcolata ponendo sull'asse delle ascisse (x) la Variabile 1, è il primo grafico in alto a sinistra:


A questo punto scambiamo tra di loro le due variabili e ricalcoliamo l'equazione della retta di regressione con questa seconda parte dello script. Copiatela e incollatela nella
 Console di R e premete ↵ Invio:

x <- var_2 # variabile 2 in ascisse (2/4)
y <- var_1 # variabile 1 in ordinate
plot(x, y, xlim = c(0,15), ylim = c(0,15), xlab="Variabile 2", ylab="Variabile 1", main="Variabili invertite", cex.main = 0.9) # grafico dei dati
regpar_1 <- lm(y ~ x) # regressione lineare standard
a_yx_1 <- regpar_1$coefficients[1] # intercetta a
b_yx_1 <- regpar_1$coefficients[2] # coefficiente angolare b
abline(a_yx_1, b_yx_1, col="blue") # retta di regressione con variabili scambiate
c(a_yx_1, b_yx_1) # mostra a e b
#

Ora la Variabile 2 è riportata in ascisse (e diventa quindi la variabile indipendente) e la Variabile 1 è riportata in ordinate (grafico in alto a destra). L'equazione della retta di regressione è identica alla precedente (questo è atteso visto che Variabile 1 e Variabile 2 comprendono identici valori). Per confrontare questo grafico e questa retta di regressione con quelli del primo grafico dobbiamo capovolgere il grafico orizzontalmente, quindi ruotarlo a destra di 90°, riportando così la Variabile 2 in ordinate e riportando la Variabile 1 in ascisse, cosa che facciamo con questa terza parte dello script. Copiatela e incollatela nella Console di R e premete ↵ Invio:

x <- var_1 # variabile 1 in ascisse (3/4)
y <- var_2 # variabile 2 in ordinate
a_xy <- - a_yx_1 / b_yx_1 # intercetta a
b_xy <- 1 / b_yx_1 # coefficiente angolare b
plot(x, y, xlim = c(0,15), ylim = c(0,15), xlab="Variabile 1", ylab="Variabile 2", main="Regressione y variabile indipendente", cex.main = 0.9) # grafico dei dati
abline(a_xy, b_xy, col="red") # retta di regressione y variabile indipendente
c(a_xy, b_xy) # mostra a e b
#

Abbiamo così ottenuta la regressione y variabile indipendente, illustrata nel grafico in basso a sinistra.

Infine calcoliamo l'equazione della retta di regressione espressa come regressione media geometrica, copiate la quarta e ultima parte dello script e incollatela nella Console di R e premete ↵ Invio:

x <- var_1 # variabile 1 in ascisse (4/4)
y <- var_2 # variabile 2 in ordinate
b_mg <- sqrt(b_yx*b_xy) # coefficiente angolare b
a_mg <- mean(y) - (b_mg * (mean(x))) # intercetta a
plot(x, y, xlim = c(0,15), ylim = c(0,15), xlab="Variabile 1", ylab="Variabile 2", main="Regressione media geometrica", cex.main = 0.9) # grafico dei dati
abline(a_mg, b_mg, col="green") # retta di regressione media geometrica
c(a_mg, b_mg) # mostra a e b
#

Questa regressione (grafico in basso a destraassume come coefficiente angolare la media geometrica dei coefficienti angolari della regressione x variabile indipendente e della regressione y variabile indipendente. E con la salomonica conclusione che y = x fornisce una soluzione intermedia, che appare più convincente rispetto all'una e all'altra regressione lineare, per il fatto che la retta calcolata risulta essere allineata con l'asse maggiore dell'elissoide che include i dati.

Nel caso del set di dati galton [5] incluso nel pacchetto psychTools ci troviamo proprio in una situazione di questo genere. Nell'analizzare mediante la regressione lineare le altezze dei genitori e le altezze dei figli non vi sono ragioni per assumere le prime come variabile indipendente. Ma non vi sono neppure ragioni per assumere le altezze dei figli come variabile indipendente. Possiamo allora effettuare un'analisi di questi dati provando a calcolare anche per essi la regressione lineare nei tre modi possibili qui riportati:
regressione x variabile indipendente;
regressione y variabile indipendente;
regressione media geometrica.

Se non l'avete già fatto, prima di eseguire lo script dovete scaricare e installare il pacchetto aggiuntivo psychToolsCopiate per intero lo script riportato qui sotto quindi incollatelo nella Console di R e premete ↵ Invio:

# MODELLI DI REGRESSIONE PARAMETRICA retta y = a + b·x set di dati galton
#
library(psychTools) # carica il pacchetto psych incluso il set di dati galton
#
windows() # apre una nuova finestra
par(mfrow=c(2,2)) # predispone la suddivisione della finestra in quattro quadranti, uno per grafico
#
var_1 <- galton$parent # variabile 1
var_2 <- galton$child # variabile 2
#
x <- var_1 # variabile 1 in ascisse
y <- var_2 # variabile 2 in ordinate
plot(x, y, xlim = c(50,80), ylim = c(50,80), xlab="Altezza dei padri", ylab="Altezza dei figli", main="Regressione x variabile indipendente", cex = 0.5, cex.main = 0.9) # grafico dei dati
regpar <- lm(y ~ x) # regressione lineare standard
a_yx <- regpar$coefficients[1] # intercetta a
b_yx <- regpar$coefficients[2] # coefficiente angolare b
abline(a_yx, b_yx, col="blue") # retta di regressione x variabile indipendente
c(a_yx, b_yx) # visualizza a e b
#
x <- var_2 # variabile 2 in ascisse
y <- var_1 # variabile 1 in ordinate
plot(x, y, xlim = c(50,80), ylim = c(50,80), xlab="Altezza dei figli", ylab="Altezza dei padri", main="Variabili invertite", cex = 0.5, cex.main = 0.9) # grafico dei dati
regpar_1 <- lm(y ~ x) # regressione lineare standard
a_yx_1 <- regpar_1$coefficients[1] # intercetta a
b_yx_1 <- regpar_1$coefficients[2] # coefficiente angolare b
abline(a_yx_1, b_yx_1, col="blue") # retta di regressione con variabili scambiate
c(a_yx_1, b_yx_1) # visualizza a e b
#
x <- var_1 # variabile 1 in ascisse
y <- var_2 # variabile 2 in ordinate
a_xy <- - a_yx_1 / b_yx_1 # intercetta a
b_xy <- 1 / b_yx_1 # coefficiente angolare b
plot(x, y, xlim = c(50,80), ylim = c(50,80), xlab="Altezza dei padri", ylab="Altezza dei figli", main="Regressione y variabile indipendente", cex = 0.5, cex.main = 0.9) # grafico dei dati
abline(a_xy, b_xy, col="red") # retta di regressione y variabile indipendente
c(a_xy, b_xy) # visualizza a e b
#
x <- var_1 # variabile 1 in ascisse
y <- var_2 # variabile 2 in ordinate
b_mg <- sqrt(b_yx * b_xy) # coefficiente angolare b
a_mg <- mean(y) - (b_mg * (mean(x))) # intercetta a
plot(x, y, xlim = c(50,80), ylim = c(50,80), xlab="Altezza dei padri", ylab="Altezza dei figli", main="Regressione media geometrica", cex = 0.5, cex.main = 0.9) # grafico dei dati
abline(a_mg, b_mg, col="green") # retta di regressione media geometrica
c(a_mg, b_mg) # visualizza a e b
#

Questo è il grafico risultante.


Come si vede chiaramente assumendo come variabile indipendente i padri o i figli i risultati cambiano. Il problema, generato a scopo didattico nei dati simulati analizzati con il primo script e riportati nella prima figura e che si presenta spontaneamente nei dati di Francis Galton riportati in quest'ultima figura [6], nasce dal fatto che l'equazione della retta di regressione è determinata dall'interazione di due fattori:
→ gli assunti alla base del modello di regressione lineare impiegato;
→ l'informazione che il modello di regressione lineare può ricavare dai dati forniti.

Più i dati sono allineati su una retta:
→ più consistente è l'informazione in essi contenuta;
→ più r si avvicina a 1;
→ meno rilevante è l'influenza degli assunti alla base del modello di regressione sulle conclusioni.
Tanto che nel caso limite di dati perfettamente allineati su una retta, quando r = 1 e l'informazione contenuta nei dati è univoca, tutti i modelli di regressione forniscono lo stesso identico risultato, indipendentemente dagli assunti alla base del modello di regressione.

Meno i dati sono allineati su una retta:
→ meno consistente è l'informazione in essi contenuta;
→ meno r è vicino a 1 (più r si avvicina a 0);
→ più rilevante è l'influenza degli assunti alla base del modello di regressione sulle conclusioni.

Nel caso limite di dati distribuiti in una palla rotonda, quando r = 0 e l'informazione contenuta nei dati è nulla (nessuno sa come far passare una retta da punti così distribuiti), i modelli di regressione manifestano il massimo di divergenza nei risultati, che a questo punto riflettono esclusivamente gli assunti alla base del modello di regressione.

I dati di Galton presentano un coefficiente di correlazione r uguale a 0.4587624 e un coefficiente di determinazione R2 = 0.21 che indica che solamente il 21% della variabilità osservata viene spiegato dalla retta. Ci troviamo di fronte a un caso tipico di una situazione nella quale le conclusioni dipendono più dagli assunti alla base del modello impiegato per interpretare i dati che dalla oggettività fornita dai dati stessi. Non potendo assumere né le altezze dei padri né le altezze dei figli come variabile indipendente, è opportuno accettare le conclusioni tratte dal calcolo della (retta di regressione espressa come) regressione media geometrica, la cui caratteristica più convincente è di essere allineata con l'asse maggiore dell'ellissoide che include i dati (Fig. 2 grafico in basso a destra).


----------

[1] Vedere i riferimenti nel post: Regressione lineare semplice parametrica.

[2] Ling Leng et al. Ordinary least square regression, orthogonal regression, geometric mean regression and their applications in aerosol science. J. Phys. 2007;Conf. Ser. 78 012084. DOI: 10.1088/1742-6596/78/1/012084

[3] Shaoji Xu. A Property of Geometric Mean Regression. The American Statistician 2014;68(4);277-281. DOI: 10.1080/00031305.2014.962763 

[4] Nei link che seguono trovate i dettagli:
→ sui simboli dei punti di R che è possibile impiegare nella funzione plot()
→ gli stili delle linee di R che è possibile impiegare nella funzione abline()
→ i colori di R che potete impiegare;
→ la possibilità di aggiungere la legenda a un grafico.

[5] Vedere il post Il set di dati galton.

[6] Il codice per riportare le tre rette su di un unico grafico è riportato nel post: Aggiungere la legenda a un grafico.

Nessun commento:

Posta un commento