17/11/2013
Analisi della regressione
L’analisi della regressione è una tecnica statistica per modellare e
investigare le relazioni tra due (o più) variabili.
Nella tavola è riportata la % di purezza di ossigeno,
rilasciata in un processo di distillazione chimica, e il
livello di idrocarbonio, presente nel condensatore principale di unità di distillazione.
Dati
salvati
in
un file
Osservazioni Liv.Idrocarbonio Purezza
1
0,99
90,01
2
1,02
89,05
3
1,15
91,43
4
1,29
93,74
5
1,46
96,73
6
1,36
94,45
7
0,87
87,59
8
1,23
91,77
9
1,55
99,42
10
1,4
93,65
11
1,19
93,54
12
1,15
92,52
13
0,98
90,56
14
1,01
89,54
15
1,11
89,85
16
1,2
90,39
17
1,26
93,25
18
1,32
93,41
19
1,43
94,98
20
0,95
87,33
2
1
17/11/2013
Con questa concatenazione di functions è possibile far leggere i dati in
un file memorizzati sotto forma di tabella e assegnarli ad una variabile.
> dati<-matrix(scan("C:/Programmi/R/R-3.0.2/regressionedati.R",
+ n=20*2),20,2,byrow=TRUE)
Read 40 items
Un primo modo di studiare che tipo
di relazione sussiste tra le popolazioni che hanno generato i dati è
il diagramma di dispersione (scatter
plot).
> datix<-dati[,1]
> datiy<-dati[,2]
> plot(datix,datiy,xlab='purezza
+ ossigeno',ylab='% di idrocarbonio')
3
CONSIDERAZIONI SULLO SCATTER DIAGRAM
Le correlazioni, possibilmente positiva o possibilmente negativa, sono
In forse quando i punti rappresentativi delle coppie di dati, pur disponendosi attorno ad una delle due diagonali del diagramma, presentano
una dispersione piuttosto accentuata tale da far presumere l’esistenza
di altre cause che intervengono a determinare l'effetto studiato.
2
17/11/2013
C’è un modo per misurare il grado di correlazione
tra due variabili aleatorie?
D efin iz io n e
Se µ X = E [X
]
e µ Y = E [Y ] , si d efin isce co va ria n za d i
X e Y , la q u a n tità
C o v (X ,Y ) = E [( X − µ X )(Y − µ Y )].
cov( X , Y ) = E[ XY ] − µ X µY
Teorema : Se X e Y sono indipendenti, Cov( X , Y ) = 0.
Il viceversa non vale.
Controesempio
X
p ( x)
−1
1
3
0
1
3
1
2
1 ⇒Y = X
⇒ Cov ( X , Y ) = 0
3
5
Teorema : Var ( X ± Y ) = Var ( X ) + Var (Y ) ± 2 cov( X , Y )
Definizione
La correlazione tra le variabili aleatorie X e Y è la quantità:
ρ=
σ
cov( X , Y )
= XY
Var ( X )Var (Y ) σ X σ Y
Se la covarianza tra due variabili aleatorie è positiva, negativa o nulla,
anche la correlazione sarà positiva, negativa o nulla.
Teorema : La correlazione tra le variabili aleatorie X e Y gode
della seguente proprietà: -1 ≤ ρ ≤ 1
Teorema : Se ρ = ±1 ⇒ P(Y = aX ± b) = 1
6
3
17/11/2013
Il coefficiente di correlazione non è una misura generale della relazione
tra due variabili, ma esprime solo il grado di linearità della correlazione
in un grafico a dispersione.
Gli outliers possono modificare significativamente il valore
del coefficiente di correlazione.
4
17/11/2013
In R la function per
calcolare il coefficiente
di correlazione è
cor()
Bisogna specificare in
input il tipo di coefficiente
da calcolare: in questo
caso quello di Pearson.
> cor(datix, datiy, method="pearson")
[1] 0.9367154
5
17/11/2013
Se si immagina che la relazione tra X e Y sia lineare, allora bisogna
ricercare i coefficienti della trasformazione
Y = mX + b + ε
• m, b coefficienti di regressione
• X (livello di idrocarbonio) var. aleat. indipendente
• Y (purezza dell'ossigeno) var. aleat. dipendente
• ε (errore casuale), E[ε ] = 0, Var[ε ] = σ 2 .
Come si calcolano i coefficienti?
IL METODO DEI MINIMI QUADRATI
Minimizzare la distanza tra i punti delle osservazioni e la retta stessa.
11
residui
Si cerca il minimo della funzione 

n
2
 rispetto m e b
L ( a, b ) = ∑ ( yi − mxi − b )

i =1

6
17/11/2013
La funzione di R per stimare un modello di regressione lineare è lm
(linear models). L’output di tale funzione è molto complesso: in generale è opportuno salvarlo in una variabile di classe per poi estrarne le
quantità necessarie all’analisi dei dati
>result<-lm( datiy ~ datix)
>summary(result)
Residuals:
Min
1Q
Median
3Q Max
-1.83029 -0.73334 0.04497 0.69969 1.96809
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 74.283
1.593
46.62
< 2e-16 ***
datix
14.947
1.317
11.35 1. 23e-09 ***
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
13
Pertanto il modello lineare stimato è
y=
y = 74.2 + 14.9 x
Possiamo sovrapporre la retta al grafico
con il comando:
> abline(lm(datiy ~ datix))
14
7
17/11/2013
>summary(result)
Residuals:
Min
1Q
Median
3Q Max
-1.83029 -0.73334 0.04497 0.69969 1.96809
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 74.283
1.593
46.62
< 2e-16 ***
datix
14.947
1.317
11.35 1. 23e-09 ***
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
L’errore standard misura il grado di precisione della stima dei parametri.
15
>summary(result)
Residuals:
Min
1Q
Median
3Q Max
-1.83029 -0.73334 0.04497 0.69969 1.96809
Coefficients:
Estimate Std. Error t value Pr(>|t|)
< 2e-16 ***
(Intercept) 74.283
1.593
46.62
datix
14.947
1.317
11.35 1.23e-09 ***
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
E’ l’output di un test per verificare se i valori dei coefficienti sono nulli.
La legenda associa alle stelle un valore numerico: quando questi valori numerici sono inferiori a 0.05, allora si può ritenere non vera l’ipotesi che i coefficienti sono nulli.
16
8
17/11/2013
>summary(result)
…Multiple R-squared: 0.8774, Adjusted R-squared: 0.8706
R^2 è noto nella letteratura come coefficiente di determinazione.
> rho<-cor(datix, datiy, method="pearson")
> rho^2
[1] 0.8774357
Spiega quanta parte della variabilità della Y è imputabile alla variabilità
della X, in questo caso l’87%.
Il valore numerico 0.8706 è ottenuto usando una formula corretta e
più robusta.
I valori vengono riportati entrambi perché grosse discrepanze segnalano
la presenza di valori anomali.
17
> summary(result)
F-statistic: 128.9 on 1 and 18 DF, p-value: 1.227e-09
Questo è un test per stabilire se è valido il modello con predittore
Y = mX + b + ε oppure quello senza predittore Y = b + ε
L’esito del test si legge analogamente a prima.
Si osservi che questo test equivale al test per riconoscere se m = 0.
18
9
17/11/2013
ANALISI DEI RESIDUI
> summary(result)
Residuals:
Min
1Q
Median
3Q
Max
-1.83029 -0.73334 0.04497 0.69969 1.96809
Residual standard error: 1.087 on 18 degrees of freedom
Si definiscono residui le distanze tra i valori della variabile dipendente
ottenuti mediante la retta di regressione e quelli osservati.
ei = yi − yˆi
Anche in questo caso l’errore standard misura la variabilità dell’errore
stocastico ε inserito nel modello
Perchè il modello sia valido è necessario provare che ε ∼ N(0,σ 2 )19
Per ora usiamo due strumenti grafici. Il grafico dei residui e il qqnorm.
> str(result)
List of 12
$ coefficients : Named num [1:2] 74.3 14.9
..- attr(*, "names")= chr [1:2] "(Intercept)" "datix"
$ residuals : Named num [1:20] 0.9287 -0.4797 -0.0429 0.1744 0.6234 ...
..- attr(*, "names")= chr [1:20] "1" "2" "3" "4" ...
$ effects : Named num [1:20] -412.154 12.334 -0.207 -0.084 0.25 ...
..- attr(*, "names")= chr [1:20] "(Intercept)" "datix" "" "" ...
$ rank
: int 2
$ fitted.values: Named num [1:20] 89.1 89.5 91.5 93.6 96.1 ...
..- attr(*, "names")= chr [1:20] "1" "2" "3" "4" ...
$ assign
: int [1:2] 0 1
$ qr
:List of 5
..$ qr : num [1:20, 1:2] -4.472 0.224 0.224 0.224 0.224 ...
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr [1:20] "1" "2" "3" "4" ...
.. .. ..$ : chr [1:2] "(Intercept)" "datix"
.. ..- attr(*, "assign")= int [1:2] 0 1
..$ qraux: num [1:2] 1.22 1.17…
10
17/11/2013
> qqnorm(result$residuals)
>
I punti si distribuiscono lungo
una retta.
> plot(1:20,result$residuals,type='p',
+ main='Grafico dei residui',
+ xlab='residui')
> abline(h=0, lwd=2)
La dispersione non presenta
particolari patterns.
ESEMPI DI GRAFICI DI RESIDUI
Omoschedasticità=
varianza
costante per
l’errore
Eteroschedasticità=
varianza
diversa per
l’errore
11
17/11/2013
La relazione tra due campioni casuali non è sempre lineare. A volte è
possibile trasformare opportunamente le scale di misurazione perché
il modello di regressione lineare sia sufficiente.
Il seguente dataset rappresenta il peso corporeo espresso in kg e il
peso del cervello espresso in gr. per 62 diverse specie di mammiferi.
> cervello<-matrix(scan("C:/Programmi/R/R-3.0.2/cervello.txt",
+ skip=1,n=62*2),62,2,byrow=TRUE)
Read 124 items
Effettuando un diagramma
di dispersione dei dati, si
osserva un andamento molto
lontano da quello lineare.
Provando a rappresentare i dati in scala logaritmica, si ottiene…
> plot(log(cervello[,1]),log(cervello[,2]),type='p',main='Scatter-plot
+ Scala Log',xlab='Peso corporeo',ylab='Peso cervello')
> abline(lm(log(cervello[,2]) ~ log(cervello[,1])) )
>
12
17/11/2013
Torniamo all’esercizio sul fitting dei dati:
Esempio: si misura il tempo di vita di 20 lampadine, che è stato riportato
di seguito. Stimare la funzione guasto, la funzione di affidabilità, la densità di guasto, il tempo medio di vita. Determinare quale modello teorico
potrebbe descrivere il tempo di vita.
10,45
6,10
2,30 19,71 49,81 46,89 69,08
1,01 0,71 3,89 5,38 0,37
0,32 11,36 43,20 3,24
7,29 9,12 17,52 9,60
Usando i probability plotting papers, avevamo stabilito che il modello
di Weibull si adattava bene ai dati. Usando la function fitdistr()
> stima<-fitdistr(dati,"weibull")
> str(stima)
Usando la regressione
sui dati del probability
plotting paper?
List of 5
$ estimate: Named num [1:2] 0.764 13.497
..- attr(*, "names")= chr [1:2] "shape" "scale"
$ sd : Named num [1:2] 0.133 4.176
..- attr(*, "names")= chr [1:2] "shape" "scale"
…
E’ necessario costruire il modello di regressione tra
> source('datiprimoesercizio.r')
> x<-log(sort(dati))
> index<-seq(1,20,1)
> cdf<-(index-0.3)/20.4
> z<-log(log(1/(1-cdf)))
Con fitdistr()
$ estimate: 0.764 13.497
"shape" "scale”
Per ottenere i coefficienti è sufficiente che:
> result<-lm(z ~ x)
> result
Coefficients:
(Intercept)
x
-1.8988
0.7276
Ovviamente questi non sono i parametri
di scala e di forma, perché nella retta di
regressione associata al probability plotting paper è
z = β x − β log α ⇒
m = β e b = − β log α
ossia β = 0.7276 e α =13.59464
13
17/11/2013
Un caso in cui l’uso Del Modello di regressione
è necessario
L’esercizio che segue si riferisce a un campione casuale di 90 tempi di
guasto.
I tempi sono ripartiti in modalità e viene fornita la tabella seguente.
Rank
Tempo guasto
# guasti
Guasti cum.
Median rank %
1
600
23
23
25.1
2
1200
9
32
35.1
3
1800
2
34
37.3
4
2400
3
37
40.6
5
3000
11
48
52.8
6
3600
6
54
59.4
7
4200
3
57
62.7
8
4800
6
63
69.4
9
5400
4
67
73.8
10
6600
3
70
77.1
11
6900
4
74
81.5
12
7200
8
82
90.4
13
7800
3
85
93.7
14
8400
0
85
93.7
15
9000
1
86
94.8
16
9600
2
88
97.0
17
10200
2
90
99.2
14
17/11/2013
Un altro modo per
leggere le tabelle di
dati…
In R, aprire un file dove
riportare i dati e salvarlo con estensione .csv.
Questi file, una volta
letti con il comando
read.csv() producono
delle matrici con
la stessa struttura di
quella usata nel file
> guasti<-read.csv("C:/Programmi/R/guasti.csv",header=F,sep=",")
Per costruire il probability plotting paper relativo al modello di Weibull
> guasti
V1 V2
1 600 23
2 1200 9
3 1800 2
4 2400 3
5 3000 11
6 3600 6
7 4200 3
8 4800 6
9 5400 4
10 6600 3
11 6900 4
12 7200 8
13 7800 3
14 8400 0
15 9000 1
16 9600 2
17 10200 2
> x=log(guasti[,1])
> cdf=(cumsum(guasti[,2])-0.3)/(90+0.4)
> y=log(log(1/(1-cdf)))
Grafico
Non
Corretto
15
17/11/2013
Anche ricostruendo il campione casuale a partire dalla tabella…
> dati<-c(rep(guasti[1,1],guasti[1,2]))
> dati
[1] 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600
[20] 600 600 600 600
> for (i in 2:17) {
+ dati<-c(dati, rep(guasti[i,1],guasti[i,2]))
+}
> dati
[1] 600 600 600 600 600 600 600 600 600 600 600 600
[13] 600 600 600 600 600 600 600 600 600 600 600 1200
[25] 1200 1200 1200 1200 1200 1200 1200 1200 1800 1800 2400 2400
[37] 2400 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000 3000
[49] 3600 3600 3600 3600 3600 3600 4200 4200 4200 4800 4800 4800
[61] 4800 4800 4800 5400 5400 5400 5400 6600 6600 6600 6900 6900
[73] 6900 6900 7200 7200 7200 7200 7200 7200 7200 7200 7800 7800
[85] 7800 9000 9600 9600 10200 10200
>
Il grafico che ne risulta non consente di ritenere adeguato il modello
di Weibull…
…perché vi sono molti dati che si ripetono
16
17/11/2013
Nel grafico originale invece riconosciamo tre andamenti:
Rank
Tempo guasto
1
600
# guasti
23
Guasti cum.
23
Median rank %
25.1
2
1200
9
32
35.1
3
1800
2
34
37.3
4
2400
3
37
40.6
5
3000
11
48
52.8
6
3600
6
54
59.4
7
4200
3
57
62.7
8
4800
6
63
69.4
9
5400
4
67
73.8
10
6600
3
70
77.1
11
6900
4
74
81.5
12
7200
8
82
90.4
13
7800
3
85
93.7
14
8400
0
85
93.7
15
9000
1
86
94.8
16
9600
2
88
97.0
17
10200
2
90
99.2
17
17/11/2013
Num.prova
Tempo guasto
# guasti
Guasti cum.
Median rank %
1
600
23
23
60.7
2
1200
9
32
84.8
3
1800
2
34
90.1
4
2400
3
37
98.1
5
3000
11
48
28.6
6
3600
6
54
44.7
7
4200
3
57
52.7
8
4800
6
63
68.7
9
5400
4
67
79.4
10
6600
3
70
87.4
11
6900
4
74
98.1
12
7200
8
82
47.0
13
7800
3
85
65.3
14
8400
0
85
65.3
15
9000
1
86
71.3
16
9600
2
88
83.6
17
10200
2
90
95.8
Num.prova
Tempo guasto
# guasti
Guasti cum.
Median rank %
1
600
23
23
60.7
2
1200
9
32
84.8
3
1800
2
34
90.1
4
2400
3
37
98.1
5
3000
11
11
28.6
6
3600
6
17
44.7
7
4200
3
20
52.7
8
4800
6
26
68.7
9
5400
4
30
79.4
10
6600
3
33
87.4
11
6900
4
37
98.1
12
7200
8
8
47.0
13
7800
3
11
65.3
14
8400
0
11
65.3
15
9000
1
12
71.3
16
9600
2
14
83.6
17
10200
2
16
95.8
18
17/11/2013
> dati1<-dati[1:37]
> dati2<-dati[38:74]
> dati3<-dati[74:90]
> library(MASS)
> stima1<-fitdistr(dati1,'weibull')
Error in fitdistr(dati1, "weibull") : optimization failed
In addition: Warning messages:
1: In densfun(x, parm[1], parm[2], ...) : NaNs produced
2: In densfun(x, parm[1], parm[2], ...) : NaNs produced
Il motivo dell’errore è che nella formula che stima uno dei due parametri della Weibull, compaiono le distanze tra i dati al denominatore.
Si può ovviare all’inconveniente usando la regressione lineare.
Una procedura più corretta consiste nell’uso dei cosiddetti modelli lineari generalizzati. Tuttavia ci “accontentiamo” di costruire un modello di regressione per ciascuno dei 3 sottogruppi trovati.
Per il primo gruppo:
> guasti1<-guasti[1:4,1]
> x<-log(sort(guasti1))
> fas<-guasti[1:4,2]
> cdf<-(cumsum(fas)-0.3)/37.4
> z<-log(log(1/(1-cdf)))
> result<-lm(z ~ x)
> result
Coefficients:
(Intercept)
x
-6.352
0.980
Con la trasformazione vista prima:
β =0.980 e α = 653.0363
19
17/11/2013
Per il secondo gruppo:
> guasti2<-guasti[5:11,1]
> x<-log(sort(guasti2))
> fas<-guasti[5:11,2]
> cdf<-(cumsum(fas)-0.3)/37.4
> z<-log(log(1/(1-cdf)))
> result<-lm(z ~ x)
> result
Coefficients:
(Intercept)
x
-22.249
2.643
Con la trasformazione vista prima:
β =2.643 e α = 4528.226
>
Per il terzo gruppo:
> guasti3<-guasti[12:17,1]
> x<-log(sort(guasti3))
> fas<-guasti[12:17,2]
> cdf<-(cumsum(fas)-0.3)/37.4
> z<-log(log(1/(1-cdf)))
> result<-lm(z ~ x)
> result
Coefficients:
(Intercept)
x
-20.791
2.183
Con la trasformazione vista prima:
β =2.183 e α = 13436.44
>
20
17/11/2013
L’esempio mostra come per questo componente le informazioni circa il
tasso di guasto siano ripartite lungo l’arco temporale. La affidabilità totale è una somma di affidabilità, ciascuna si riferisce a un periodo della
vita, secondo dei pesi che restituiscono il peso di quel tasso di guasto
lungo l’arco temporale
R (t ) = a1 R1 (t ) + a2 R2 (t ) + a3 R3 (t )
con a1 + a2 + a3 = 1
f (t ) = a1 f1 (t ) + a2 f 2 (t ) + a3 f3 (t )
Iperesponenziale
MISTURE
F (t ) = a1 F1 (t ) + a2 F2 (t ) + a3 F3 (t )
Nell’esempio è:
β1
β2
 t 
 t 
 t 
37
37
16
R(t ) = exp  −  + exp  −  + exp  − 
90
90
90
 α1 
 α2 
 α3 
β3
21
Scarica

Regressione lineare