Visualizzazione post con etichetta qqPlot(). Mostra tutti i post
Visualizzazione post con etichetta qqPlot(). Mostra tutti i post

venerdì 31 dicembre 2021

Regressione lineare multipla

La regressione lineare semplice (regressione bivariata) costruita sul piano cartesiano

y = a + b·x

può essere estesa a uno spazio n-dimensionale: abbiamo così lregressione lineare multipla nella quale la variabile dipendente y viene fatta dipendere non più da una, bensì da k variabili indipendenti, indicate come x₁, x₂, x₃ … xₖ secondo l'equazione

y = a + b₁·x₁ + b₂·x₂ + b₃·x₃ + ... + b·x

Il risultato è rappresentato quindi da una intercetta a e da tanti coefficienti angolari b (indicati con b₁, b₂, b₃ ... b) quante sono le variabili indipendenti (x₁x₂x₃ ... x) che contribuiscono a determinare il valore della variabile dipendente y.

Come esempio impieghiamo il set di dati ais nel quale, tra i dati ematologici rilevati in un gruppo di atleti australiani, abbiamo tre grandezze:
→ la concentrazione degli eritrociti (globuli rossi) espressa in milioni per microlitro di sangue (10⁶/µL) e contenuta nella variabile rcc;
→ il valore ematòcrito cioè la frazione del volume del sangue occupata dagli eritrociti espressa in percentuale (%) e contenuta nella variabile hc;
→ la concentrazione dell'emoglobina espressa in grammi per decilitro di sangue (g/dL) e contenuta nella variabile hg.

Le tre grandezze sono strettamente legate tra loro dal punto di vista biologico, in quanto gli eritrociti hanno ciascuno un certo volume e contengono ciascuno una data quantità di emoglobina: pertanto all'aumentare del numero di eritrociti aumenta la frazione percentuale del volume del sangue occupata dagli eritrociti (il valore ematòcrito) e aumenta la quantità di emoglobina. Mentre la diminuzione dell'ematòcrito e la diminuzione dell'emoglobina sono indice della diminuzione del numero degli eritrociti.

L'esempio è stato scomposto in una serie di script indipendenti - onde facilitare il riutilizzo del codice per analizzare i propri dati - che impiegano i pacchetti aggiuntivi gvlmacar e rgl, che devono essere scaricati dal CRAN. Accertatevi di avere installato inoltre il pacchetto DAAG che contiene i dati impiegati nello script, o in alternativa  procedete come indicato nel post Il set di dati ais

Iniziamo con una analisi esplorativa preliminare dei dati, copiate questo primo script, incollatelo nella Console di R e premete ↵ Invio:

# REGRESSIONE LINEARE MULTIPLA - analisi esplorativa preliminare dei dati
#
library(DAAG) # carica il pacchetto che include il set di dati ais
library(car) # carica il pacchetto per la grafica
mydata <- ais[,c(1,3,4)] # le colonne 1, 3, 4 contengono le variabili rcc, hc, hg
windows() # apre e inizializza una nuova finestra grafica
#
scatterplotMatrix(~rcc+hc+hg, col="black", pch=20, regLine=list(method=lm, lty=1, lwd=2, col="chartreuse3"), smooth=FALSE, diagonal=list(method="histogram", breaks="FD"), main="Istogrammi e grafici xy con rette di regressione", data=mydata) # istogrammi e grafici xy con rette di regressione
#

Dopo avere caricato i pacchetti necessari, copiato nell'oggetto mydata le tre variabili che ci interessano, aperto e inizializzato una nuova finestra grafica, l'analisi preliminare dei dati viene effettuata con la funzione scatterplotMatrix() nella quale:
~rcc+hc+hg specifica le variabili da rappresentare, che sono la concentrazione degli eritrociti rcc, il valore ematòcrito hc e la concentrazone di emoglobia hg;
col="..." specifica il colore dei grafici; 
pch=... specifica il tipo di simbolo da impiegare (un piccolo cerchio pieno);
→ per la retta di regressione regLine sono impiegati il modello lineare (lm), una linea continua (lty=1) con uno spessore doppio (lwd=2) e un colore (col="chartreuse3"), mentre l'argomento smooth=FALSE fa si che non venga aggiunta ai grafici la rappresentazione della funzione non lineare prevista di default nel pacchetto car;
→ l'argomento diagonal=list() indica la rappresentazione della variabile riportata nella diagonale, che qui è l'istogramma (method="histogram") con il numero di classi (breaks="FD") calcolato mediante la regola di Freedman-Diaconis. 


Da notare che le espressioni che è possibile impiegare per l'argomento  diagonal=... sono:
→ list(method="boxplot");
list(method="density", bw="nrd0", adjust=1, kernel="gaussian", na.rm=TRUE);
→ list(method="histogram");
→ list(method="oned");
list(method="qqplot").

Vista la relazione lineare molto buona che intercorre tra le variabili sembra ragionevole continuare ed effettuare il calcolo della regressione lineare multipla, copiate questo secondo script, incollatelo nella Console di R e premete ↵ Invio:

# REGRESSIONE LINEARE MULTIPLA - calcolo della regressione lineare multipla
#  
library(DAAG) # carica il pacchetto che include il set di dati ais 
mydata <- ais[,c(1,3,4)] # le colonne 1, 3, 4 contengono le variabili rcc, hc, hg
reglin <- lm(rcc~hg+hc, data=mydata) # calcolo della regressione 
#
coefficients(reglin) # intercetta e coefficienti angolari 
confint(reglin, level=0.95) # intervalli di confidenza al 95% 
#  

La funzione lm(...) viene impiegata per calcolare la regressione lineare multipla specificando con l'espressione rcc~hg+hc la variabile dipendente (rcc), le due variabili indipendenti (hg e hc) e l'equazione 

rcc = a + b₁·hg + b₂·hc

quindi possiamo ricavare con la funzione coefficients() i valori dell'intercetta (a), del coefficiente angolare di hg (b₁) e del coefficiente angolare di hc (b₂):

(Intercept)          hg          hc 
-0.24269563  0.03283747  0.10403395 

e riportare l'equazione della regressione lineare multipla come

rcc = -0.24269563 + 0.03283747·hg + 0.10403395·hc

Successivamente con la funzione confint() sono riportati gli intervalli di confidenza al 95% dell'intercetta e dei due coefficienti angolari:

                  2.5 %     97.5 %
(Intercept) -0.53163317 0.04624192
hg          -0.02459817 0.09027311
hc           0.08267073 0.12539718

Da notare che gli intervalli di confidenza forniscono un test di significatività per intercetta e coefficienti angolari:
→ dato un intervallo di confidenza al 95% che va da -0.531633170.04624192 (che quindi include il valore 0) l'intercetta non è significativamente diversa da 0, cosa molto logica in quanto al diminuire fino ad azzerarsi dei valori di emoglobina ed ematòcrito deve necessariamente diminuire e azzerarsi il numero degli eritrociti;
→ con un intervallo di confidenza al 95% che va da -0.02459817 a 0.09027311 (che quindi include il valore 0) il coefficiente angolare della concentrazione di emoglobina hg non è significativamente diversa da 0, cosa meno logica in quanto non solo dal punto di vista biologico deve esistere una proporzionalità tra numero degli eritrociti e concentrazione dell'emoglobina, ma anche nell'analisi esplorativa preliminare dei dati riportata con lo script precedente risulta evidente la proporzionalità tra numero degli eritrociti e concentrazione dell'emoglobina che è una dato di fatto dal punto di vista biologico;
→ con un intervallo di confidenza al 95% che va da 0.08267073 a 0.12539718 (che quindi non include il valore 0il coefficiente angolare del valore ematòcrito hc risulta significativamente diverso da 0.

Come detto all'inizio, oltre ad effettuare una analisi esplorativa preliminare dei dati è opportuno sottoporre i risultati ad una valutazione critica a posteriori, che effettuiamo ora sotto forma di una diagnostica numerica della regressione lineare multipla, copiate il terzo script, incollatelo nella Console di R e premete ↵ Invio:

# REGRESSIONE LINEARE MULTIPLA - diagnostica numerica della regressione
#
library(gvlma) # carica il pacchetto per la diagnostica numerica 
library(car) # carica il pacchetto per la grafica 
library(DAAG) # carica il pacchetto che include il set di dati ais
mydata <- ais[,c(1,3,4)] # le colonne 1, 3, 4 contengono le variabili rcc, hc, hg
reglin <- lm(rcc~hg+hc, data=mydata) # calcolo della retta di regressione lineare multipla
#
summary(gvlma(reglin)) #  test globale per l'assunto di linearità 
outlierTest(reglin) # valore p di Bonferroni per la presenza di dati aberranti (outliers) 
#

Ecco la prima parte del riepilogo dei risultati fornito dalla funzione summary():

Call:
lm(formula = rcc ~ hg + hc, data = mydata)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.55791 -0.11284 -0.00699  0.09950  0.53595 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.24270    0.14652  -1.656   0.0992 .  
hg           0.03284    0.02913   1.127   0.2609    
hc           0.10403    0.01083   9.603   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1744 on 199 degrees of freedom
Multiple R-squared:  0.8565,    Adjusted R-squared:  0.855 
F-statistic: 593.8 on 2 and 199 DF,  p-value: < 2.2e-16

Il valore di probabilità Pr(>|t|) ottenuto con il test t di Student conferma (ovviamente) i risultati della significatività ricavati dagli intervalli di confidenza riportati sopra, per i quali valgono le considerazioni già fatte. E se la significatività statistica non è coerente con una realtà biologica assodata, dovrà ovviamente essere quest'ultima a prevalere: per cui assumiamo che l'equazione calcolata sia, fino a prova contraria, una descrizione sufficientemente adeguata della relazione di funzione che intercorre tra le tre variabili esaminate.

Che questo sia vero ce lo conferma la funzione gvlma(), acronimo di global validation of linear models assumptions, che fornisce questi risultati:
→ i dati sono distribuiti in modo lineare (Global Stat), assunto accettabile;
→ i dati non presentano asimmetria (Skewness), assunto accettabile;
→ i dati non presentano curtosi (Skewness), assunto accettabile;
→ nell'ambito dei valori osservati la varianza è costante (Heteroscedasticity), assunto accettabile.

ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = reglin) 

                    Value p-value                   Decision
Global Stat        6.5801 0.15981    Assumptions acceptable.
Skewness           0.5149 0.47304    Assumptions acceptable.
Kurtosis           0.7559 0.38461    Assumptions acceptable.
Link Function      3.9844 0.04592 Assumptions NOT satisfied!
Heteroscedasticity 1.3249 0.24972    Assumptions acceptable.

L'assenza nei dati di asimmetria e di curtosi, e la loro omoschedasticità, sono condizioni sufficienti per garantire la loro adeguata descrizione mediante una regressione lineare. Il primo test (Global Stat) di valutazione globale degli assunti di linearità, che sostanzialmente comprende tutti e tre i test precedenti in forma compatta, li conferma. In questo contesto il test rimanente e l'unico discordante (Link Function) può essere ignorato.

Con la funzione outlierTest() viene  effettuato il test di Bonferroni, che non evidenzia dati anomali (outliers) ma segnala il dato 78 come quello che si discosta maggiormente dagli altri:

No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:
   rstudent unadjusted p-value Bonferroni p
78 -3.28855          0.0011917      0.24073

In tema di valutazione critica a posteriori, aggiungiamo ora alla diagnostica numerica anche una diagnostica grafica della regressione lineare multipla, per effettuarla copiate questo quarto script, incollatelo nella Console di R e premete ↵ Invio:

# REGRESSIONE LINEARE MULTIPLA - diagnostica grafica della regressione
#
library(car) # carica il pacchetto per la grafica
library(DAAG) # carica il pacchetto che include il set di dati ais
mydata <- ais[,c(1,3,4)] # le colonne 1, 3, 4 contengono le variabili rcc, hc, hg
reglin <- lm(rcc~hg+hc, data=mydata) # calcolo della retta di regressione lineare multipla
#
windows() # apre e inizializza una nuova finestra grafica
qqPlot(reglin, main="Grafico dei quantili per i residui", xlab="t-quantili", ylab="Residui studentizzati") # grafico globale per linearità e dati aberranti
#
windows() # apre e inizializza una nuova finestra grafica
ceresPlots(reglin, ask=FALSE, main="Grafico di Ceres", ylab="Residui di Ceres (rcc)") # grafico di Ceres per la valutazione separata della linearità di hg e hc vs. rcc
#
windows() # apre e inizializza una nuova finestra grafica
plot(mydata$rcc, reglin$fitted.values, xlim=c(4,7), ylim=c(4,7)) # grafico valori originari vs valori stimati
abline(0, 1, lty=2) # linea di indentità y = x
#

La funzione qqPlot() riporta una distribuzione dei residui lineare, evidenziando nel contempo i dati 78 e 161 come quelli che dei quali sarebbe utile controllare la validità, ovvero che sono situati in intervalli di valori per i quali potrebbe essere opportuno acquisire più dati. 


La funzione ceresPlot() genera due grafici di Ceres separati per emoglobina ed ematòcrito, e consente di  visualizzare una relazione lineare tra ematòcrito ed eritrociti migliore di quella che intercorre tra emoglobina ed eritrociti, confermando in un certo senso i valori di significatività riportati sopra.


La diagnostica grafica della regressione lineare multipla si conclude con questo grafico minimalista, ma che entra nell'essenza dei risultati.


Il grafico, generato con la funzione plot(), riporta in ascisse i valori originari della concentrazione degli eritrociti (mydata$rcc) e in ordinate i corrispondenti valori reglin$fitted.values ricalcolati da hg e hc impiegando l'equazione della regressione lineare multipla ove

reglin$fitted.values = -0.24269563 + 0.03283747·hg + 0.10403395·hc

La linea di identità y = x che viene riportata evidenzia, senza la necessità di ulteriori statistiche, che l'informazione acquisita misurando la concentrazione dell'emoglobina e l'ematòcrito può essere compressa in un unico valore, che fornisce una stima mediamente adeguata della concentrazione degli eritrociti.

Nota: con "mediamente adeguata" si intende che, data la misura diretta della concentrazione degli eritrociti riportata in ascisse, la sua misura indiretta - ottenuta misurando emoglobina ed ematòcrito ed applicando la regressione lineare multipla - comporta una perdita di informazione [aumento dell'incertezza della misura] che si riflette nella "dispersione media" dei valori sull'asse delle ordinate. Se non ci fosse perdita di informazione i punti sarebbero perfettamente allineati sulla retta y = x.

Ora, visto che con tre variabili la cosa è ancora fattibile, non resta che aggiungere un grafico tridimensionale (3D).

Copiate quest'ultimo script, incollatelo nella Console di R e premete ↵ Invio:

# GRAFICO 3D ANIMATO con il pacchetto rgl
#  
library(rgl) # carica il pacchetto per la grafica 3D
library(DAAG) # carica il pacchetto che include il set di dati ais 
mydata <- ais[,c(1,3,4)] # le colonne 1, 3, 4 contengono le variabili rcc, hc, hg
windows() # apre e inizializza una nuova finestra grafica
#  
# grafico 3D animato
#  
plot3d(mydata$rcc, y=mydata$hg, z=mydata$hc, type="p", col="red", size=3) # realizza il grafico
play3d(spin3d(axis=c(0,0,1), rpm=10), duration=10) # anima il grafico
#  

Dopo avere caricato il pacchetto necessario con il comando library(rgl) il grafico viene realizzato con la funzione plot3d().

Quindi con la funzione play3d() viene realizzata una animazione della durata di 10 secondi (duration=10) con i parametri specificati dalla funzione spin3d() e cioè l'asse sul quale fare ruotare l'animazione, nel nostro caso  l'asse delle z (0,0,1), e il numero di rotazioni al minuto (rpm=10).


Quando l'animazione che compare nella finestra "RGL device" aperta nella Console di R dallo script si ferma, se “afferrate” il grafico 3D facendo click con il tasto sinistro del mouse e tenendolo premuto senza rilasciarlo potete ruotarlo a vostro piacimento muovendo il mouse. 

Anche se non aggiunge nulla di nuovo, il grafico [1] ci conforta documentando la linearità della relazione tra le tre variabili.

Conclusione: mettere in relazione tra di loro troppe variabili contemporaneamente può portare a risultati di difficile comprensione. Tuttavia una analisi esplorativa preliminare dei dati e una attenta valutazione critica a posteriori dei risultati possono aiutare a identificare i casi nei quali l'impiego della regressione lineare multipla può essere appropriato.


----------

[1] Trovate altre modalità di rappresentazione sotto forma di grafici tridimensionali nel post Grafici 3D.

mercoledì 6 febbraio 2019

Regressione lineare semplice parametrica

La regressione lineare tout court, quella illustrata in tutti i testi di statistica e qui sviluppata con R, è:
→ una regressione lineare semplice (in contrapposizione alla regressione lineare multipla);
→ parametrica (in contrapposizione alla regressione lineare non parametrica);
→ x variabile indipendente (in contrapposizione ad alternative che non prevedono questo assunti).

Dato che la denominazione razionale, quella completa, diverrebbe chilometrica, e dato che l'espressione regressione lineare è però troppo generica, laddove è opportuno semplificare impiegherò la denominazione regressione lineare ordinaria, con riferimento al fatto che è quella non solo dovunque illustrata ma anche più ampiamente impiegata.

Gli assunti alla base del modello matematico-statistico implicano una serie di requisiti che devono essere soddisfatti dai dati, che sono ben chiariti ad esempio in Marubini [1] e in Snedecor [2], ma anche online [3]. Per il caso speciale, ma non infrequente, nel quale nessuna delle due variabili confrontate abbia i requisiti richiesti per essere considerata come variabile indipendente, vedere anche [4].

Qualora invece sia necessario l'impiego di "metodi robusti" di regressione - cioè di metodi che risentono poco della eventuale presenza di dati apparentemente anomali ma che non possono essere esclusi a priori dal calcolo della regressione - è possibile impiegare un metodo non parametrico [5].

Tornando alla nostra regressione lineare semplice parametrica x variabile indipendente, essendo x la variabile indipendente posta sull'asse delle ascisse, y la variabile dipendente posta sull'asse delle ordinate, ed essendo soddisfatti i requisiti previsti per i dati, il metodo dei minimi quadrati consente di calcolare l'intercetta a e il coefficiente angolare b della retta di regressione di equazione

y = a + b∙x

che meglio approssima la distribuzione dei dati sperimentali.

Il calcolo dell'equazione della retta di regressione viene effettuato mediante la funzione lm(), che può essere applicata anche al caso di più variabili indipendenti, consentendo quindi il calcolo della regressione lineare multipla [4]. Ma la cosa più interessante è che R, oltre al calcolo dell'equazione della retta di regressione, un calcolo di per sé semplice, fornisce una serie molto interessante di strumenti che consentono di valutare quanto i dati soddisfano i requisiti richiesti, o in altre parole di valutare se la regressione lineare descrive in modo adeguato la relazione tra le due variabili.

Qui impieghiamo come esempi due diversi set di dati, per uno solo dei quali, come vedremo, la regressione lineare fornisce risultati adeguati.

Il primo è il set di dati ais, nel quale prendiamo in considerazione la concentrazione degli eritrociti (espressa in 1012/L) e il valore ematòcrito (espresso in %), due variabili che, analizzate mediante i coefficienti di correlazione parametrici e non parametrici, hanno mostrato di essere correlate, e che, all'ispezione visiva di una serie di grafici di dispersione (xy) realizzati mediante i correlogrammi, hanno mostrato valori ben allineati su una possibile retta.

Per procedere dovete scaricare e installare dal CRAN i pacchetti aggiuntivi gvlma e car, oltre al pacchetto aggiuntivo DAAG [6].

Copiate e incollate nella Console di R questo script e premete ↵ Invio:

# REGRESSIONE LINEARE SEMPLICE PARAMETRICA y = a + b · x
#
library(DAAG) # carica il pacchetto che include il set di dati ais
library(gvlma) # carica il pacchetto per la funzione gvlma()
library(car) # carica il pacchetto per analisi ouliers e analisi grafica
str(ais) # mostra la struttura dei dati
#
var_x <- ais$rcc # variabile eritrociti x in ascisse
var_y <- ais$hc # variabile ematòcrito y in ordinate
reglin <- lm(var_y ~ var_x) # calcola intercetta (a) e coefficiente angolare (b)
coefficients(reglin) # mostra i coefficienti dell'equazione hc = a + b · rcc
confint(reglin, level=0.95) # calcola gli intervalli di confidenza dell'intercetta e del coefficiente angolare
#
# analisi statistica della adeguatezza della regressione lineare
#
summary(reglin) # mostra un riepilogo dei risultati
t.test(residuals(reglin)) # verifica che la media degli errori non sia significativamente diversa da zero
shapiro.test(residuals(reglin)) # verifica la normalità della distribuzione degli errori
summary(gvlma(reglin)) # test globale per l'assunto di linearità
outlierTest(reglin) # valore p di Bonferonni per la presenza di dati anomali (outliers)
#
# analisi grafica della adeguatezza della regressione lineare
#
windows() # apre una nuova finestra
par(mfrow=c(2,2)) # predispone la suddivisione della finestra in quattro quadranti, uno per grafico
#
newx = seq(min(var_x), max(var_x), by = 0.01) # valori della x per i quali calcolare l'intervallo di confidenza
conf_interval <- predict(reglin, newdata=data.frame(var_x=newx), interval="confidence", level = 0.95) # calcola gli intervalli di confidenza
plot(var_x, var_y, xlab="Eritrociti (10^12/L)", ylab="Ematòcrito (%)", main="Regressione lineare y = a + b·x") # grafico dei dati
abline(reglin, col="lightblue") # retta di regressione
lines(newx, conf_interval[,2], col="blue", lty=2) # limite di confidenza inferiore
lines(newx, conf_interval[,3], col="blue", lty=2) # limite di confidenza superiore
#
plot(var_y, residuals(reglin), xlab="Ematòcrito (%)", ylab="Ematòcrito osservato - calcolato (%)", main="Analisi delle differenza residue") # grafico delle differenza tra ematòcrito osservato e ematòcrito calcolato con l'equazione della retta
#
influencePlot(reglin, fill=FALSE, xlab="t-quantili (il diametro dei cerchi", sub="è proporzionale alla distanza di Cook)", ylab="Residui studentizzati", main="Influenza dei dati") # grafico dell'influenza dei dati sulle conclusioni
#
qqPlot(reglin, xlab="t-quantili", ylab="Residui studentizzati", main="Quantili vs. residui") # mostra il grafico dei quantili per i residui studentizzati
#

Dopo avere caricato i pacchetti aggiuntivi e i dati, e dopo avere mostrato con str(ais) la struttura di questi ultimi, con var_x <- ais$rcc e con var_y <- ais$hc sono memorizzate negli oggetti var_x e var_y rispettivamente la variabile indipendente x, posta in ascisse, e la variabile dipendente y, posta in ordinate. In questo modo sarà possibile riutilizzare per intero lo script semplicemente sostituendo ad ais$rcct e ad ais$hc i vettori contenenti i propri dati.

Con reglin <- lm(var_y ~ var_x) l'equazione della retta di regressione che esprime la y in funzione della x viene calcolata e memorizzata nell'oggetto reglin, che a questo punto diventa l'argomento chiave, l'argomento contenente i dati in ingresso impiegati nelle funzioni successive [7].

Con le funzioni coefficients() e confint() sono infine mostrati i coefficienti della retta di regressione e i loro intervalli di confidenza al 95%

> coefficients(reglin) # mostra i coefficienti dell'equazione hc = a + b · rcc 
(Intercept)       var_x 
   8.183033    7.398052 
> confint(reglin, level=0.95) # calcola gli intervalli di confidenza dell'intercetta e del coefficiente angolare 
               2.5 %    97.5 %
(Intercept) 6.173717 10.192350
var_x       6.974206  7.821898

e pertanto questa risulta essere l'equazione della retta di regressione:

hc = 8.183033 + 7.398052 · rcc

A questo punto seguono due blocchi di codice, il primo per effettuare una analisi statistica, e il secondo per effettuare una analisi grafica della regressione, entrambe allo scopo di valutare, come già detto, se la regressione lineare descrive in modo adeguato la relazione tra le due variabili.

Per quanto concerne l'analisi statistica, le principali conclusioni sono quelle tratte con il test globale per l'assunto di linearità effettuato mediante la funzione gvlma(), che conferma il fatto che gli assunti che stanno alla base del modello di regressione lineare sono tutti soddisfatti:

ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = reglin) 

                      Value p-value                Decision
Global Stat        3.479904  0.4809 Assumptions acceptable.
Skewness           2.233166  0.1351 Assumptions acceptable.
Kurtosis           0.958154  0.3277 Assumptions acceptable.
Link Function      0.005239  0.9423 Assumptions acceptable.
Heteroscedasticity 0.283345  0.5945 Assumptions acceptable.

Il test di Bonferroni non evidenzia dati anomali, ma segnala il dato numero 68 come quello che maggiormente si discosta dai rimanenti:

> outlierTest(reglin) # valore p di Bonferonni per la presenza di dati anomali (outliers) 
No Studentized residuals with Bonferonni p < 0.05
Largest |rstudent|:
    rstudent unadjusted p-value Bonferonni p
68 -3.569525         0.00044828     0.090552

Le conclusioni dell'analisi grafica confermano, con i valori delle differenze residue dispersi in modo casuale, che la regressione lineare descrive in modo adeguato la relazione tra le due variabili


e confermano anche la presenza di possibili dati anomali con il grafico delle distanze di Cook e con il grafico dei quantili, dati che sono evidenziati sia direttamente nei grafici, sia nei rispettivi riepiloghi riportati nella Console di R:

> influencePlot(reglin, xlab="t-quantili (il diametro dei cerchi", sub="è proporzionale alla distanza di Cook)", ylab="Residui studentizzati", main="Influenza dei dati") # grafico dell'influenza dei dati sulle conclusioni 
      StudRes         Hat      CookD
68  -3.569525 0.006301040 0.03815682
78   3.186317 0.009724284 0.04766681
161 -2.179789 0.039758811 0.09655642
166  1.363972 0.099962743 0.10287127
> #  
> qqPlot(reglin, xlab="t-quantili", ylab="Residui studentizzati", main="Quantili vs. residui") # mostra il grafico dei quantili per i residui studentizzati 
[1] 68 78

I dati per i quali i metodi di identificazione meglio concordano sono il numero 68 e il numero 78, ma anche i dati numero 161 e numero 166 meritano di essere valutati. Si tratta di casi dei quali sarebbe importante controllare la validità, o che potrebbero essere situati in intervalli di valori per i quali potrebbe essere opportuno acquisire più dati.

Vediamo ora la stessa identica analisi applicata al set di dati galton [8]. I pacchetti aggiuntivi psychTools, gvlma e car, se non l'avete già fatto, devono essere preventivamente scaricati e installati dal CRAN [9].

Copiate e incollate nella Console di R questo script e premete ↵ Invio:

# REGRESSIONE LINEARE SEMPLICE PARAMETRICA y = a + b · x
#
library(psychTools) # carica il pacchetto che include il set di dati galton
library(gvlma) # carica il pacchetto per la funzione gvlma()
library(car) # carica il pacchetto per analisi outliers e analisi grafica
str(galton) # mostra la struttura dei dati
#
var_x <- galton$parent # variabile altezza dei padri x in ascisse
var_y <- galton$child # variabile altezza dei figli y in ordinate
reglin <- lm(var_y ~ var_x) # calcola intercetta (a) e coefficiente angolare (b)
coefficients(reglin) # mostra i coefficienti dell'equazione hc = a + b · rcc
confint(reglin, level=0.95) # calcola gli intervalli di confidenza dell'intercetta e del coefficiente angolare
#
# analisi statistica della adeguatezza della regressione lineare
#
summary(reglin) # mostra un riepilogo dei risultati
t.test(residuals(reglin)) # verifica che la media degli errori non sia significativamente diversa da zero
shapiro.test(residuals(reglin)) # verifica la normalità della distribuzione degli errori
summary(gvlma(reglin)) # test globale per l'assunto di linearità
outlierTest(reglin) # valore p di Bonferonni per la presenza di dati anomali (outliers)
#
# analisi grafica della adeguatezza della regressione lineare
#
windows() # apre una nuova finestra
par(mfrow=c(2,2)) # predispone la suddivisione della finestra in quattro quadranti, uno per grafico
#
newx = seq(min(var_x), max(var_x), by = 0.01) # valori della x per i quali calcolare l'intervallo di confidenza
conf_interval <- predict(reglin, newdata=data.frame(var_x=newx), interval="confidence", level = 0.95) # calcola gli intervalli di confidenza
plot(var_x, var_y, xlab="Altezza dei padri (pollici)", ylab="Altezza dei figli (pollici)", main="Regressione lineare y = a + b·x") # grafico dei dati
abline(reglin, col="lightblue") # retta di regressione
lines(newx, conf_interval[,2], col="blue", lty=2) # limite di confidenza inferiore
lines(newx, conf_interval[,3], col="blue", lty=2) # limite di confidenza superiore
#
plot(var_y, residuals(reglin), xlab="Altezza dei figli (pollici)", ylab="Altezza osservata - calcolata (pollici)", main="Analisi delle differenza residue") # grafico delle differenza tra altezza osservata e altezza calcolata con l'equazione della retta
#
influencePlot(reglin, fill=FALSE, xlab="t-quantili (il diametro dei cerchi", sub="è proporzionale alla distanza di Cook)", ylab="Residui studentizzati", main="Influenza dei dati") # grafico dell'influenza dei dati sulle conclusioni
#
qqPlot(reglin, xlab="t-quantili", ylab="Residui studentizzati", main="Quantili vs. residui") # mostra il grafico dei quantili per i residui studentizzati
#

Anche in questo caso, per quanto concerne l'analisi statistica, le principali conclusioni sono quelle tratte con il test globale per l'assunto di linearità effettuato mediante la funzione gvlma(), che però questa volta ci dice che gli assunti che stanno alla base del modello di regressione lineare, a parte la curtosi, non sono per niente soddisfatti:

ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
Level of Significance =  0.05 

Call:
 gvlma(x = reglin) 

                    Value   p-value                   Decision
Global Stat        25.489 4.011e-05 Assumptions NOT satisfied!
Skewness            8.979 2.731e-03 Assumptions NOT satisfied!
Kurtosis            1.965 1.610e-01    Assumptions acceptable.
Link Function       4.632 3.138e-02 Assumptions NOT satisfied!
Heteroscedasticity  9.913 1.641e-03 Assumptions NOT satisfied!

Il test di Bonferroni non evidenzia dati anomali, ma segnala il dato numero 1 come quello che maggiormente si discosta dai rimanenti:

> outlierTest(reglin) # valore p di Bonferonni per la presenza di dati anomali (outliers) 
No Studentized residuals with Bonferonni p < 0.05
Largest |rstudent|:
   rstudent unadjusted p-value Bonferonni p
1 -3.512671         0.00046509      0.43161

Le conclusioni dell'analisi grafica confermano, con i valori delle differenze residue che mostrano una proporzionalità diretta con l'altezza, che i dati in questione violano uno degli assunti del modello di regressione lineare 


e confermano anche la possibile presenza di dati anomali con il grafico delle distanze di Cook e con il grafico dei quantili, dati che sono evidenziati sia direttamente nei grafici, sia nei rispettivi riepiloghi riportati nella Console di R:

> influencePlot(lm(galton$child ~ galton$parent), xlab="t-quantili (il diametro dei cerchi", sub="è proporzionale alla distanza di Cook)", ylab="Residui studentizzati", main="Influenza dei dati") # grafico dell'influenza dei dati sulle conclusioni
       StudRes         Hat       CookD
1   -3.5126706 0.002699826 0.016499436
2   -2.9226403 0.001090010 0.004622768
857  0.4839886 0.008511029 0.001006222
897  2.6611087 0.003740530 0.013207269
898  0.9327550 0.008511029 0.003734739
> #
> qqPlot(lm(galton$child ~ galton$parent), xlab="t-quantili", ylab="Residui studentizzati", main="Quantili vs. residui") # mostra il grafico dei quantili per i residui studentizzati
[1] 1 2

I dati numero 1, 2, 857, 897, 898 forniti dalla funzione influencePlot() stanno di nuovo a indicare i casi che influenzano in modo importante la regressione, casi dei quali sarebbe importante controllare la validità, o che potrebbero essere situati in intervalli di valori per i quali potrebbe essere opportuno acquisire più dati. Anche la funzione qqPlot() fornisce, oltre al grafico, l'indicazione di due punti da controllare, che sono punti 1, 2 già indicati dalla funzione precedente.

Il set di dati galton, oltre a non soddisfare i requisiti fondamentali che si richiedono ai dati per l'applicazione della regressione lineare ordinaria, è anche un esempio di dati nei quali non è chiaro, a dispetto delle conclusioni tratte da Francis Galton di una "regressione verso la media" delle altezze dei figli rispetto a quelle dei padri, quale delle due variabili debba essere considerata la variabile indipendente. Le implicazioni di questo fatto, le conseguenze che esso determina nelle conclusioni tratte dalla regressione lineare, e il calcolo della regressione lineare con modelli alternativi, sono discussi a parte nel post La regressione lineare: assunti e modelli.

Come potete notare entrambi gli script sono stato realizzati in modo da rendere immediato il loro riutilizzo: è sufficiente assegnare alla variabile x (var_x <-) e alla variabile y (var_y <-) i vostri nuovi dati (e personalizzare opportunamente titoli e legende).

Per una guida rapida all'importazione dei dati potete consultare i link:


----------

[1] Bossi A, Cortinovis I, Duca PG, Marubini E. Introduzione alla statistica medica. La Nuova Italia Scientifica, Roma, 1994, ISBN 88-430-0284-8. Il modello statistico nella regressione lineare, pp-305-308.

[2] Snedecor GW, Cochran WG. Statistical Methods. The Iowa State University Press, 1980, ISBN 0-8138-1560-6. The matematical model in linear regression, pp.153-157.

[3] Regressione lineare.
https://it.wikipedia.org/wiki/Regressione_lineare



[6] Vedere il post Il set di dati ais nel quale trovate anche come caricare i dati della tabella senza impiegare il pacchetto DAAG

[7] Digitate help(lm) nella Console di R per la documentazione della funzione lm().

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

[9] Informazioni esaurienti sono contenute nei manuali di riferimento dei pacchetti aggiuntivi qui impiegati, che trovate alla pagina Available CRAN Packages By Name.
https://cran.r-project.org/web/packages/available_packages_by_name.html