giovedì 14 febbraio 2019

Regressione lineare semplice non parametrica

La caratteristica saliente dei metodi di regressione lineare non parametrica è costituita dalla loro robustezza. Questo significa che si tratta di metodi che risentono poco della eventuale presenza di dati apparentemente anomali, ma che non possono essere esclusi a priori dal calcolo della regressione.

Essendo n il numero delle coppie di dati/punti esistono n · (n - 1) / 2 modi di connettere due punti qualsiasi con una retta, cioè esistono n · (n - 1) / 2 possibili coefficienti angolari [1]. Nel caso più semplice il coefficiente angolare b della retta di regressione è la mediana di questi valori e l'intercetta a è la mediana degli n valori possibili calcolati mediante il coefficiente angolare trovato. Questi sono concettualmente i principi alla base della regressione lineare non parametrica, con possibili varianti da metodo a metodo.

Qui vediamo, confrontati con la regressione lineare semplice parametrica (regressione lineare ordinaria), tre modelli di regressione lineare non parametrica:
→ la regressione lineare di Thiel-Sen;
→ la regressione lineare di Siegel;
→ la regressione quantilica.

Da notare che questi tre modelli di regressione lineare non parametrica assumono la x come variabile indipendente analogamente alla regressione lineare ordinaria.

Le funzioni necessarie per il calcolo delle tre regressioni lineari non parametriche sono incluse in due pacchetti aggiuntivi, mblm e quantreg, che devono essere scaricati dal CRAN. Trovate come al solito la documentazione dei pacchetti e in particolare il loro manuale di riferimento sul repository della documentazione [2].

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

# REGRESSIONE LINEARE ORDINARIA E NON PARAMETRICA DI THEIL-SEN, DI SIEGEL, QUANTILICA
#
library(mblm) # carica il pacchetto per le regressioni di Theil-Sen e Siegel
library(quantreg) # carica il pacchetto per la regressione quantilica
#
var_x <- c(18, 46, 104, 72, 24, 63, 23, 58, 36, 82, 94) # variabile in ascisse
var_y <- c(21, 42, 109, 64, 102, 78, 19, 66, 42, 89, 91) # variabile in ordinate
#
regpar_yx <- lm(var_y ~ var_x) # regressione lineare ordinaria x variabile indipendente
a_yx <- regpar_yx$coefficients[1] # intercetta a
b_yx <- regpar_yx$coefficients[2] # coefficiente angolare b
#
reg_TS <- mblm(var_y ~ var_x, repeated=FALSE) # regressione lineare di Theil-Sen
a_TS <- reg_TS$coefficients[1] # intercetta a
b_TS <- reg_TS$coefficients[2] # coefficiente angolare b
#
reg_S = mblm(var_y ~ var_x, repeated=TRUE) # regressione lineare di Siegel
a_S <- reg_S$coefficients[1] # intercetta a
b_S <- reg_S$coefficients[2] # coefficiente angolare b
#
reg_q <- rq(var_y ~ var_x, tau=0.5) # regressione lineare quantilica
a_q <- reg_q$coefficients[1] # intercetta a
b_q <- reg_q$coefficients[2] # coefficiente angolare b
#
# traccia il grafico dei dati con le rette di regressione e aggiunge una legenda
#
windows() # apre una nuova finestra
plot(var_x, var_y, xlim = c(0,120), ylim = c(0,120), pch=1, xlab="Variabile x", ylab="Variabile y", main="Regressioni ordinaria, Theil-Sen, Siegel, quantilica", cex.main = 0.9) # grafico dei dati
abline(a_yx, b_yx, col="blue", lty=4) # retta regressione ordinaria
abline(a_TS, b_TS, col="red", lty=4) # retta regressione di Theil-Sen
abline(a_S, b_S, col="green", lty=1) # retta regressione di Siegel
abline(a_q, b_q, col="orange", lty=1) # retta regressione quantilica
legend(60, 30, legend=c("Regressione ordinaria", "Regressione di Theil-Sen", "Regressione di Siegel", "Regressione quantilica"), col=c("blue", "red", "green", "orange"), lty=c(4,4,1,1), cex=0.8) # aggiunge al grafico la legenda
#
# crea una tabella con intercetta e coefficiente angolare delle quattro rette di regressione
#
cells <- c(a_yx,b_yx,a_TS,b_TS,a_S,b_S,a_q,b_q) # genera l'array cells con i valori numerici di a e di b
rnames <- c("Regressione ordinaria", "Regressione di Theil-Sen", "Regressione di Siegel", "Regressione quantilica") # genera l'array rnames con i nomi delle righe
cnames <- c("Intercetta a", "Coefficiente angolare b") # genera l'array cnames con i nomi delle colonne
tabris <- matrix(cells, nrow=4, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames)) # costruisce la tabella con i risultati a partire dagli array cells, rnames, cnames
tabris # mostra la tabella con i risultati
#

Questo è il grafico di dispersione (xy) dei dati, con le rette calcolate:


I risultati delle quattro equazioni

y = a + b · x

sono così riportati nella Console di R:

> tabris # mostra la tabella con i risultati
                         Intercetta a Coefficiente angolare b
Regressione ordinaria       24.078677               0.7389267
Regressione di Theil-Sen     6.529412               0.9852941
Regressione di Siegel        5.873402               1.0042750
Regressione quantilica       2.581395               1.0232558

Le cose da notare sono:
→ è evidente la presenza di un dato che si discosta in modo importante da tutti gli altri;
→ i risultati dei tre metodi non parametrici sono simili tra loro;
→ i risultati delle regressione ordinaria (parametrica) si discostano da quelli delle regressioni non parametriche.

Per verificare quanto il dato, chiaramente anomalo, influenzi le regressioni, eseguiamo nuovamente lo script, sostituendo la terza e la quarta riga con queste due, nelle quali è stato eliminato il dato, il quinto, quello con le coordinate (x,y) uguali a (24, 102):

var_x <- c(18, 46, 104, 72, 63, 23, 58, 36, 82, 94) # variabile in ascisse
var_y <- c(21, 42, 109, 64, 78, 19, 66, 42, 89, 91) # variabile in ordinate

Ora i grafici delle rette sono praticamente sovrapposti (e difficilmente distinguibili tra loro)


mentre i risultati sono diventati i seguenti:

> tabris # mostra la tabella con i risultati
                         Intercetta a Coefficiente angolare b
Regressione ordinaria        1.337096                1.019512
Regressione di Theil-Sen     2.729167                1.020833
Regressione di Siegel        2.654334                1.022497
Regressione quantilica       2.581395                1.023256

Come si vede dal confronto con i risultati precedenti, con l'eliminazione del dato anomalo i risultati della regressione ordinaria sono cambiati: e questa fornisce ora risultati sovrapponibili a quelli dei tre metodi non parametrici. Poco sono cambiati, rispetti ai precedenti, i risultati della regressione di Thiel-Sen e di Siegel, mentre la regressione quantilica ha addirittura fornito identici valori nei due casi, un fatto molto interessante. I metodi non parametrici confermano la loro robustezza, mentre viene documentato quanto un singolo dato anomalo possa influire sulla regressione lineare ordinaria.


----------

[1] Per 100 coppie di dati il numero dei coefficienti angolari (sui quali calcolare la mediana) è uguale quindi a 4 950. Con 500 dati passiamo a 124 740. Con 1 000 dati passiamo a 499 500. 

[2] Available CRAN Packages By Name. URL consultato il 20/10/2018: https://goo.gl/hLC9BB

Nessun commento:

Posta un commento