1 Correlazione

Alcuni esempi artefatti.

X=1:25
Y=5*X+3
cor(X,Y)
plot(X,Y)
Y=X^2
cor(X,Y)
round(cor(X,Y),2)
plot(X,Y)
Y=5*X+1+5*rnorm(25)
round(cor(X,Y),2)
plot(X,Y)
Y=5*X+1+20*rnorm(25)
round(cor(X,Y),2)
plot(X,Y)
Y=5*X+1+50*rnorm(25)
round(cor(X,Y),2)
plot(X,Y)

1.1 Correlazione di un campione casuale

Ci poniamo in questa sezione di quantificare quanto sia una correlazione bassa, ovvero una correlazione alta, in termini di un confronto con un campione casuale di numerosità n=50.

N=1000
n=50
X=matrix(rnorm(n*N),n,N)
Y=matrix(rnorm(n*N),n,N)
res=diag(cor(X,Y))
hist(res,30,xlim=c(-1,1))

Se N è più grande questo non funziona bene perché cor(X,Y) calcola le mutue covarianze tra tutte le colonne, mentre a noi servono solo i termini sulla diagonale. In alternativa,

N=100000
res=rep(0,N)
for(i in 1:N){
  X=rnorm(n)
  Y=rnorm(n)
  res[i]=cor(X,Y)
}
hist(res,100,xlim=c(-1,1),freq=FALSE)

Cerchiamo una banda di confidenza empirica al 95%

quantile(res,0.025)
quantile(res,0.975)

Teoricamente potremmo cercare una distribuzione che si adatta e cercare intervalli di confidenza attraverso la distribuzione, che in questo caso è ovviamente Gaussiana.

hist(res,100,xlim=c(-1,1),freq=FALSE)
lines(sort(res),dnorm(sort(res),mean(res),sd(res)),col="red")

I quantili teorici sono dati da

qnorm(0.025,mean(res),sd(res))
qnorm(0.025,mean(res),sd(res))

2 Regressione lineare semplice

Si importa una tabella contenente i dati di peso e altezza di 500 individui.

PA=read.csv("05pesoaltezza.csv",header=TRUE)

Esploriamo la tabella, scoprendone innanzitutto la classe,

class(PA)

come sono fatti i primi dati (e le etichette delle colonne),

head(PA)

un breve sommario del suo contenuto.

summary(PA)

Valutiamo le correlazioni.

round(cov(PA[,2:3]),2)
round(cor(PA[,2:3]),2)

Diamo una rappresentazione grafica. Ricordiamo che la rappresentazione grafica di un data frame è l’insieme dei grafici di dispersione delle colonne a due a due.

plot(PA)

Diamo una rappresentazione grafica delle prime due colonne con il diagramma di dispersione,

plot(PA$altezza,PA$peso)

Valutiamo il modello di regressione lineare semplice.

pa.lm=lm(PA$peso~PA$altezza)
pa.lm=lm(peso~altezza,data=PA)
summary(pa.lm)

Possiamo ottenere intervalli di confidenza per i coefficienti (nell’ipotesi di modello Gaussiano!)

confint(pa.lm,level=0.95)

Rappresentiamo il diagramma di dispersione includendo la retta di regressione.

plot(PA$altezza,PA$peso)
abline(pa.lm,col="red",lwd=3)

Rappresentiamo i residui.

plot(resid(pa.lm))

La rappresentaziomne dei residui rispetto alle predizioni è più efficace nel rivelare struttura.

plot(predict(pa.lm),resid(pa.lm))

2.1 Standardizzazione di una tabella

Si standardizza la tabella (solo le colonne numeriche).

PA.st=PA
PA.st[,2]=(PA[,2]-mean(PA[,2]))/sd(PA[,2])
PA.st[,3]=(PA[,3]-mean(PA[,3]))/sd(PA[,3])

oppure con

for(i in 2:3){
  PA.st[,i]=(PA[,i]-mean(PA[,i]))/sd(PA[,i])
}
head(PA.st)

La standardizzazione non ha variato il grafico di dispersione.

plot(PA.st)

La stessa operazione può essere svolta usando comandi più raffinati di R,

PA.st[,2:3]=scale(PA[,2:3])

Valutiamo le correlazioni separate per sesso.

PAo<-PA[order(PA$sesso),]
plot(PAo$altezza[1:271],PAo$peso[1:271],col="red",xlim=c(min(PA$altezza),max(PA$altezza)),
     ylim=c(min(PA$peso),max(PA$peso)))
points(PAo$altezza[272:500],PAo$peso[272:500],col="blue")
abline(pa.lm)
abline(lm(peso~altezza,data=PAo[1:271,]),col="red")
abline(lm(peso~altezza,data=PAo[272:500,]),col="blue")

Spesso le dipendenze lineari sono meno ovvie di quanto uno si aspetti.

PB<-read.csv("06pesoaltezza.csv")
head(PB)
cor(PB[,2:4])
plot(PB)
plot(PB$altezza,PB$peso,pch=16)
plot(PB$altezza,PB$peso,col=PB$indice,pch=16)

2.2 Bande empiriche di confidenza per la regressione

Si opera una valutazione della variabilità.

cfc=coef(pa.lm)
res=resid(pa.lm)
qmin=quantile(res,0.025)
qmax=quantile(res,0.975)
c(qmin, qmax)

Rappresentazione delle bande di confidenza empiriche (linee blu) e parametriche (linee verdi).

plot(PA$altezza,PA$peso)
pa.lm=lm(peso~altezza,data=PA)
abline(pa.lm,col="red")
abline(cfc+c(qmin,0),col="blue")
abline(cfc+c(qmax,0),col="blue")
abline(confint(pa.lm)[,1],col="green3")
abline(confint(pa.lm)[,2],col="green3")

2.3 Confronto con la correlazione di un campione casuale

La tabella esaminata presentava una correlazione pari a 0.92 tra altezza e peso. Per capire se tale correlazione sia alta o bassa, confrontiamone il valore con quello di un campione casuale. Ricordiamo che avevamo prodotto un campione di correlazioni con il codice

N=10000
n=500
res=rep(0,N)
for(i in 1:N){
  X=rnorm(n)
  Y=rnorm(n)
  res[i]=cor(X,Y)
}

La versione parametrica permette di stimare il p-value, ovvero la probabilità di avere una correlazione tanto estrema quanto la correlazione tra altezza e peso.

c=cor(PA$altezza,PA$peso)
1 - pnorm(c,mean(res),sd(res))

3 Cenni sull’analisi dei residui

Recuperiamo la tabella su altezza e peso di individui.

PA=read.csv("05pesoaltezza.csv",header=TRUE)
pa.lm=lm(peso~altezza,data=PA)

Valutiamo la varianza spiegata.

1-var(resid(pa.lm))/var(PA$peso)

Rappresentiamo graficamente i residui.

pa.lm.res=resid(pa.lm)
plot(predict(pa.lm),pa.lm.res)

Una misura quantitativa di asimmetria è la skewness, \[ \frac1n\sum_{k=1}^n\Bigl(\frac{x_k-\bar x}\sigma\Bigr)^3. \]

mean(((pa.lm.res-mean(pa.lm.res))/sd(pa.lm.res))^3)

Una misura quantitativa di presenza più rilevante di valori estremi è la kurtosi (il valore 3 è il valore di riferimento per una distribuzione normale), \[ \frac1n\sum_{k=1}^n\Bigl(\frac{x_k-\bar x}\sigma\Bigr)^4. \]

mean(((pa.lm.res-mean(pa.lm.res))/sd(pa.lm.res))^4) - 3

Valutiamo graficamente le frequenze e le confrontiamo con la densità di una normale avente le stesse media e deviazione standard campionarie. In questo caso il numero di dati è basso e non ci aspettiamo informazioni troppo rilevanti.

hist(pa.lm.res,10,freq=F)
lines(sort(pa.lm.res),dnorm(sort(pa.lm.res),mean(pa.lm.res),sd(pa.lm.res)),col="red")

Una analisi quantitativa di vicinanza tra distribuzioni può essere effettuata attraverso il grafico quantile-quantile qqplot. Nel caso del confronto con i quantili teorici di una normale, c’è il comando abbreviato qqnorm. Il comando qqline disegna la retta di riferimento per quantili uguali.

qqnorm(pa.lm.res)
qqline(pa.lm.res)

Infine, esistono test di normalità, quali ad esempio il test di Shapiro-Wilk, un test che ha per ipotesi nulla la normalità dei dati. Nell’output il valore interessante è il p-value, che ci indica (se piccolo) se rigettare l’ipotesi nulla.

shapiro.test(rnorm(100))
shapiro.test(runif(100))
shapiro.test(pa.lm.res)

4 Cenni sulla previsione

Per rendere sensata la previsione, estraiamo le ultime 10 osservazioni dalla tabella peso/altezza, e calibriamo un modello regressivo sulle restanti osservazioni.

PAtr=PA[1:490,]
PAts=PA[491:500,]
patr.lm=lm(peso~altezza,data=PAtr)
summary(patr.lm)

Confrontiamo le predizioni con i valori effettivi, valutando l’affidabilità della previsione.

plot(PAts[,2:3],col="blue",pch=16)
pa.pt <- predict(patr.lm,newdata=PAts)
abline(patr.lm,col="gray")
points(cbind(PAts[,2],pa.pt),col="red",pch=16)

# Valutiamo intervalli di confidenza e predizione.

# intervalli non parametrici
cf=coef(patr.lm)
rs=resid(patr.lm)
abline(cf-c(quantile(rs,0.025)),col="darkgreen")
abline(cf+c(quantile(rs,0.975)),col="darkgreen")

# bande di confidenza
pa.ptc <- predict(patr.lm,newdata=PAts,interval="confidence",level=0.95)
lines(cbind(PAts$altezza,pa.ptc[,2]),col="green")
lines(cbind(PAts$altezza,pa.ptc[,3]),col="green")

# bande di predizione
pa.ptp <- predict(patr.lm,newdata=PAts,interval="prediction",level=0.95)
lines(cbind(PAts$altezza,pa.ptp[,2]),col="blue")
lines(cbind(PAts$altezza,pa.ptp[,3]),col="blue")

5 Regressione non-lineare

5.1 Regressione polinomiale

Si considera un esempio artefatto di regressione non-lineare (un esempio più realistico sarà esaminato nel seguito).

x=-5:5
y=2+5*x+3*x^2+10*rnorm(11)
lr=lm(y~x)
plot(x,y)
abline(lr)
summary(lr)

Struttura nei residui…

plot(predict(lr),resid(lr))

Residui più soddisfacenti.

z=x^2
pr=lm(y~x+z)
summary(pr)
plot(predict(pr),resid(pr))

5.2 Regressione logaritmica

Carichiamo un set di dati standard nell’installazione di R.

library("datasets")

Per maggiori informazioni sui dataset disponibili, si può leggere il risultato del comando library(help=datasets).

Usiamo il dataset EuStockMarkets, che riporta il valore degli indici azionari del mercato tedesco (DAX), svizzero (SMI), francese (CAC) e britannico (FTSE)

class(EuStockMarkets)
esm=data.frame(EuStockMarkets)
head(esm)
summary(esm)

Valutiamo un modello lineare per l’andamento dell’indice SMI rispetto al tempo.

t=1:length(esm$SMI)
plot(esm$SMI,pch=".")
smi.lm=lm(esm$SMI~t)
summary(smi.lm)
abline(smi.lm)

I residui presentano una chiara struttura.

plot(predict(smi.lm),resid(smi.lm),pch=".")

Alla luce dei residui ottenuti, analizziamo un modello non-lineare, passando ai logaritmi dei dati.

plot(log(esm$SMI),pch=".")
lsmi.lm=lm(log(esm$SMI)~t)
abline(lsmi.lm)

I residui presentano ancora una chiara struttura (non dimentichiamo che è una serie temporale).

plot(predict(lsmi.lm),resid(lsmi.lm),pch=".")
summary(lsmi.lm)

Il modello non-lineare si è rivelato più efficace. Non è una conclusione ovvia. Per capirlo, proviamo a studiare l’andamento di \(R^2\) nei due modelli lineare e non-lineare.

l=length(esm$SMI)
rsq=rep(0,l)
lrsq=rep(0,l)
for(i in 2:l){
  t=1:i
  rsq[i] =summary(lm(esm$SMI[1:i]~t))$r.squared
  lrsq[i]=summary(lm(log(esm$SMI)[1:i]~t))$r.squared
}
plot(rsq,type="l",col="blue")
lines(lrsq,col="red")

6 Esercizi

6.0.1

Per capire il ruolo della skewness, generare dei dati casuali artificiosamente simmetrici e asimmetrici, e valutare i corrispondenti valori di skewness.

6.0.2

Per capire il ruolo della kurtosi, generare dei dati casuali che presentino artificiosamente valori estremi, e valutare i corrispondenti valori di kurtosi.

6.0.3

Per valutare il risultato di qqnorm, generare serie di dati casuali con distribuzione normale, e valutare l’aspetto tipico dell’output del grafico quantile-quantile.

6.0.4

Generare un vettore V di numeri casuali di lunghezza 1000. Implementare il calcolo diretto (ovvero senza usare il comando quantile) dei quantili relativi ai dati contenuti in V.

6.0.5

Generare 1000 serie di 10000 numeri casuali con distribuzione \(\chi^2(4)\). Calcolare per ogni serie la frequenza dei valori superiori a 7. Trovare poi un intervallo di confidenza empirico al 95% per la probabilità che una variabile aleatoria \(\chi^2(4)\) sia maggiore di 7.

6.0.6

Generare numeri aleatori con distribuzione esponenziale (e parametro a scelta). Esaminare i dati ottenuti per mezzo dell’analisi dei residui per valutarne l’aderenza ad una distribuzione Gaussiana. Ripetere l’analisi con numeri con distribuzione binomiale, Cauchy, \(\chi^2\), geometrica, lognormale, Poisson, Student e uniforme.

6.0.7

Generare una tabella A con 2 colonne e 10000 righe, in modo che le due colonne siano correlate. Implementare i comandi per tracciare un grafico dei punti con coordinate in A, e per un modello regressivo con fattore di uscita la seconda colonna. Analizzare i residui del modello. Tracciare sul grafico la retta di regressione e due bande di confidenza empiriche al 90%.

6.0.8

Generare una tabella con 2 colonne e 700 righe, in modo tale che la seconda colonna contenga numeri casuali esponenziali di tasso 3, e la prima colonna sia tale che la regressione lineare applicata alla tabella con fattore di uscita la seconda colonna restituisca l’intercetta pari (circa) a -3, la pendenza pari (circa) a 2, e in modo tale che i residui siano non nulli.

6.0.9

Effettuare l’analisi di regressione lineare semplice per la tabella 06pesoaltezza differenziando il campione per indice corporeo.

6.0.10

Analizzare i residui del modello lineare e del modello logaritmico per l’andamento dell’indice SMI.

6.0.11

Scaricare dal sito http://seriestoriche.istat.it la Tavola 2.3 sulla popolazione residente e la Tavola 1.20 sulle emissioni di inquinanti in atmosfera. Comporre una tabella di due colonne contenente nella prima colonna la popolazione dal 1980 al 2010, e nella seconda colonna le corrispondenti emissioni di ammoniaca. Effettuare l’analisi di regressione lineare semplice, comprensiva dell’analisi dei residui. Utilizzare i dati sulla popolazione dal 2011 al 2014 per una previsione delle emissioni inquinanti in atmosfera. Corredare la previsione con bande di confidenza e previsione.