Quando la Varianza segue la Media: i GLS

Seppur noi umani amiamo etichettare tutti gli eventi e i processi usando categorie ben definite, la realtà è molto più polimorfa. Questa natura delle cose si registra anche in Statistica.

Difatti, abbiamo parlato finora di regressione avendo come modello:

\hat{y} = \beta_{0} + \beta_{1}x + \epsilon ~ N(0,1)

Una delle principali assunzioni di questo modello riguarda gli errori \epsilon che vengono considerati come distribuiti secondo una Normale con media 0 e deviazione standard di 1. In questo caso dunque non esiste alcuna relazione tra la media e la varianza.

Nella vita reale però, lavorando con dati reali, questa assunzione può essere tutto fuorché vera: ci sono molte situazioni in cui tra la media e la varianza esiste una relazione, ossia:

\sigma^{2}_{i} = f(\hat{y_{i}})

In questi casi, ci vengono in aiuto i GLS (Generalized Least Squares). I GLS introducono una forma funzionale esplicita per la varianza degli errori. Le più comuni presentano una relazione positiva fra le due variabili:

  • Relazione di Potenza\hat{y} = \beta_{0} + \beta_{1}x + \epsilon ~ N(0,\sigma^{2}|\hat{y}_{i}|^{2m_{1}})
  • Relazione Esponenziale\hat{y} = \beta_{0} + \beta_{1}x + \epsilon ~ N(0,\sigma^{2}exp(2m_{2}\hat{y_{i}}))

m_{1}m_{2} sono due parametri che devono essere stimati col GLS.

Selezione Automatica di Variabili

In questo articolo vi darò la notizia che ciascuno di voi aspettava. La grandiosità del calcolo matematico unito al potere di calcolo automatico: la selezione automatica di variabili. Ossia, è possibile far selezionare dal computer la combinazione di variabili ottimale per un modello.

L’argomento si innesta su quello dell’articolo precedente, in cui abbiamo illustrato la collinearità.

Esistono tre metodi si selezione automatica di variabili:

  • Eliminazione all’indietro
  • Selezione in avanti
  • Selezione progressiva

Ognuno di questi metodi ha i suoi vantaggi e svantaggi:

Eliminazione all’indietro

Inizia con il creare il modello più complesso possibile, ossia introducendo tutte le variabili disponibili. Ad ogni passo elimina la variabile ‘meno importante’ fino a raggiungere un punto di ottimo usando una certa misura (vedi dopo).

Selezione in avanti

Inizia con il modello più semplice che esiste: solo con l’intercetta. Ad ogni passaggio aggiunge una variabile ‘importante’ fino al raggiungimento di un punto di ottimo.

Selezione progressiva

Combina i due metodi precedenti, cercando ad ogni passo variabili da escludere ed includere. È significativamente più calcolo intensivo.

Se tuttavia vogliamo automatizzare questi algoritmi, ‘l’importanza’ di ogni variabile deve essere misurata in modo oggettivo. Per fare ciò esistono innumerevoli metriche; quella più semplice ed usata si chiama AIC (Aikake Information Criterion). L’AIC è una misura di bontà di predizione penalizzata dal numero di variabili contenute nel modello. Quindi un AIC piccolo segnala un modello migliore. Bisogna tuttavia ricordare che l’AIC è una misura relativa e non assoluta. Formalmente:

AIC = -2 logL + 2p

dove:

  • logL (log-likelihood) è una misura di bontà (ne parleremo in seguito)
  • p è il numero di variabili nel modello statistico.

Un’altra misura molto usata è la BIC (Bayesian Information Criterion), che utilizza un penalità che cambia con la grandezza del campione:

BIC = -2 logL + log(N)p

Dove:

  • è la grandezza totale del campione.

Gli algoritmi di selezione automatica usano quindi queste misura (e altre simili) per dare un rango ad ogni modello (ognuno con una diversa combinazione di variabili) e scegliere quello migliore.

Ovviamente, questi algoritmi automatici sono totalmente indipendenti dal contesto in cui il modello viene creato, i.e. non tengono in considerazione l’ambito scientifico del modello. È qui che il Data Scientist deve usare la sua esperienza ed arte per decidere come agire. L’analista deve dunque capire se prediligere la capacità predittiva (e quindi rischiare di introdurre troppi parametri) o scegliere la capacità descrittiva ed includere solo variabili scientificamente significative.

Largo ad R!

AIC e BIC possono essere calcolati usando queste funzioni, entrambe nel pacchetto {stats}

AIC(object, ...)
BIC(object, ...)

Per la selezione automatica si usa invece questa, sempre nel pacchetto {stats}:

step(object, scope, scale = 0,
direction = c("both", "backward", "forward"),
trace = 1, keep = NULL, steps = 1000, k = 2, ...)

È anche possibile utilizzare la funzione dredge nel pacchetto {MuMIn} che permette la scelta di misure diverse oltre all’AIC.

Ecco un esempio completo di Selezione Progressiva usando il dataset freeny:
Il codice
linearAll = lm(y~., data = freeny)
step.linearALL = step(linearAll, direction = "both")

e l’output

Come vediamo, il modello migliore è con tutte le variabili tranne lag.quarterly.revenue: non includerla produce il più basso AIC possibile.

Collinearità

Una volta costruito un modello lineare col metodo di Maximum Likelihood come si può decidere quali variabili introdurre nel modello? Ovviamente, noi vogliamo introdurre variabili dipendenti che:

  1. abbiano una relazione genuina con la variabile dipendente
  2. aggiungono informazione al modello, considerando le altre indipendenti già presenti nel modello.

Ovviamente, vorremmo allo stesso tempo escludere variabili che forniscono la stessa informazione di quelle già presenti; ossia, vogliamo evitare la collinearità.

Collinearità

Quando variabili collinari sono inserite insieme in un modello, quest’ultimo risulta instabile e otterremo errori standard maggiorati per i parametri. La collinearità può essere individuata tramite i Variance Inflation Factors (VIFs).

I VIFs si calcolano costruendo un modello lineare tra ogni covariata e tutte le altre covariate. Ad esempio, per la prima variable indipendente

x_{1i} = \delta_{0} + \delta_{1}x_{2i} + \cdots + \delta_{p}x_{pi} + u_{i}

dove u_{i} è l’errore.

Un modello di questo tipo è costruito per ogni indipendente e prendendo l’R2 si calcola il VIF:

VIF_{j} = \frac{1}{1-R^{2}_{j}}

per le covariate j = 1, . . ., p.

Grandi VIFs indicano collinearità. Tuttavia non ci sono regole ben precise sul ‘grandi’: la regola più comune è di considerarli problematici quando VIF > 4, perché l’intervallo di confidenza (IC) del parametro j sarà grande il doppio del normale (ossia \sqrt{VIF} indica quanto sarà dilatato l’IC)

Facciamo un esempio in R:

LinearAll = lm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, data = iris) # Creiamo il modello lineare
library(car) # Carichiamo la libreria per la funzione 'vif'
vif(LinearAll)

Ecco l’output:

Sepal.Width Petal.Length Petal.Width
1.270815    15.097572   14.234335

Come possiamo vedere le variabili ‘Petal.Length’ e ‘Petal.Width’ sono altamente collineari: se le togliessimo otterremo una maggiore stabilità del modello

Un’altra prova del fatto che che il modello sia affetto da collinearità sono parametri il cui valore cambia sostanzialmente quando nuove variabili sono aggiunte al modello.

Come risolvere la collinearità? La soluzione più semplice è di rimuovere le variabili collinari: molto spesso questo accade automaticamente quando si usano algoritmi di selezione automatica.

Iniziare come Data Scientist

Fino ad ora si è parlato in generale riguardo la Data Science e dintorni. Ma naturalmente il vero Data Scientist non vuole accontentarsi solo di teoria: anzi, la pratica è la forza trainante di questa materia. In questo articolo (abbastanza lungo) si parla proprio di questo: quali sono i passi da intraprendere per diventare un Data Scientist (e analizzare ‘sti famigerati Big Data)

Fase I: MaIoNonSoNienteDiStatistica!

Partendo dal principio (ossia, assumendo che tu, lettore, non sappia nulla sull’argomento), la prima cosa da fare per entrare in questo fantastico mondo è di rinfrescarsi (o imparare) la statistica di base. Quindi:

  • Campionamento
  • Rappresentazioni grafiche di dati
  • Probabilità base (numeri aleatori, almeno le distribuzioni Normale e Binomiale)
  • Indici di posizione (media, moda, mediana et cet.)
  • Indici di variabilità (varianza et cet.)
  • Intervalli di confidenza
  • Test di ipotesi (almeno i t-test e il chi-squared)
  • Regressione lineare semplice

Mi sarò sicuramente dimenticato qualcosa. In ogni caso questa lista rappresenta già un buon punto di partenza: consiglio di iniziare col vecchio metodo carta e penna; è molto meglio delle macchine per fissare i meccanismi matematici. Ovviamente, il modo più efficace sarebbe seguire un corso universitario di statistica base. Invece, per i pochi tra noi con abbastanza palle da procedere da soli, ci sono innumerevoli risorse, sia online che fisiche.

Come libro di testo consiglio Statistica di P. Newbold et al. Qui il libro su Amazon. Lo so, viene 40 palanche. Ne vale la pena comunque: è stato il mio primo libro di statistica ed è diventato un po’ la mia Bibbia parte I (aka Il Vecchio Testamento. Il nuovo è un altro libro di cui parlerò più avanti).

Vedo ora che in italiano non esistono siti con corsi di statistica gratuiti (magari ci faccio un pensierino di farne partire uno). Se cercate in inglese, ne troverete a camionate: uno tra i più importanti è KhanAcademy.

Fase II: La Programmazione

La statistica, come il resto della matematica, è già bella e pura di per sè. Per questo meriterebbe di essere studiata for its own sake. Ma i Data Scientist non si accontentato di contemplare la bellezza: vogliono anche averla. Per questo vengono in aiuto quegli individui oscuri che sono gli informatici: la programmazione (e le macchine) permettono alla statistica di entrare con il botto in mezzo ai dati e di generare risultati tangibili. Senza i computer, la statistica avrebbe un valore pratico molto basso (vi vorrei vedere a fare una regressione con un 1Gb di dati. A mano).

Imparare a programmare da zero senza aiuto di alcun tipo è fattibile: ci sono numerosi tutorial online, anche in italiano. Ma sarà un’impresa non semplice: il segreto per riuscirci è senza alcun dubbio la perseveranza. Imparare a programmare consiste, sostanzialmente, a smadonnare per ore ed ore cercando di trovare il bug. Che poi nel 70% dei casi, si rivela essere un errore di battitura. A quel punto smadonnerete ancora di più, rimpiangento le ore buttate al vento.

Il linguaggio con cui consiglio di inziare è R: totalmente gratuito, potete scaricarlo da qui per Windows, da qui per Mac o da qui per Linux. R è perfetto per l’analisi dei dati perchè è stato creato proprio con la statistica in mente. Essendo un linguaggio Open Source, sono disponibili una miriade di librerie che permettono al Data Scientist di eseguire azioni più disparate. Per esempio: se volessi calcolare l’indice V di Cramér non posso utilizzare il semplice R. Per farlo devo prima installare questa libreria (o pacchetto) che contiene una funzione (ossia un programma) atto al calcolo di quell’indice. R è un linguaggio interpretato e ad oggetti.

Dopo aver installato R, consiglio vivamente di scaricare ed installare questa GUI (Graphic User Interface): oltre ad essere gratis e bella esteticamente, aumenta notevolmente gli strumenti in mano all’analista. Di sequito, ecco come appare:

Screenshot di RStudio

Il linguaggio che si vede nei riquadri a sinistra è proprio R. La schermata è composta da 4 riquadri. Partendo da sinistra in alto e in senso orario:

  • Script: il programma che stiamo scrivendo
  • Workspace & Cronologia: indicano tutti gli oggetti esistenti nella sessione corrente e la cronologia dello script.
  • Files, Plot, Packages & Help: l’albero di directory della sessione, gli eventuali grafici creati, le librerie installate e la finestra di aiuto. Per installare un nuovo pacchetto, è necessario andare nella finestra Librerie, cliccare su Installa nuovo e seguire lo wizard.
  • Console: mostra il codice e i suoi  risultati quando viene eseguito.

Se non si volesse installare RStudio, bisognerà allora programmare usando la semplice GUI di R, che offre molti meno strumenti.

Una volta installati questi software, i.e. la GUI e la lingua vera e propria (o meglio il traduttore da R a linguaggio-macchina), siete pronti per partire. Nei prossimi articoli comincerò a portare degli esempi, complicati e non, di analisi dati in R [successivamente anche in Python] con tanto di codice al seguito.