Contrasti polinomiali per la regressione


17

Non riesco a capire l'uso dei contrasti polinomiali nella misura della regressione. In particolare, mi riferisco a una codifica utilizzata Rper esprimere una variabile di intervallo (variabile ordinale con livelli equidistanti), descritta in questa pagina .

Nell'esempio di quella pagina , se ho capito bene, R adatta un modello per una variabile di intervallo, restituendo alcuni coefficienti che pesano la sua tendenza lineare, quadratica o cubica. Quindi, il modello montato dovrebbe essere:

write=52.7870+14.2587X0.9680X20.1554X3,

dove dovrebbe assumere i valori , , o 4 in base al diverso livello della variabile intervallo.X1234

È corretto? E, in caso affermativo, quale era lo scopo dei contrasti polinomiali?


7
No, quei coefficienti sono per i termini polinomiali ortogonali : hai scritto il modello per i termini polinomiali grezzi . Sostituisci , e , rispettivamente con i valori di , e (dalla tabella di ricerca). X 2 X 3 L Q CXX2X3LQC
Scortchi - Ripristina Monica

1
Caro @Scortchi, grazie per la tua risposta. Immagino di capire cosa intendi, ma poi non ho capito onestamente come funzionano questi termini polinomiali ortogonali. : P
Pippo,

1
A livello notazionale, quello che hai non è proprio il modello montato. O hai bisogno di un 'cappello' gigante su write (o E [write]), che significa il valore previsto di write o il valore atteso di write; oppure hai bisogno di un '+ e' alla fine per indicare i residui.
gung - Ripristina Monica

@Scortchi Che cos'è o come si trova la "tabella di consultazione"?
Antoni Parellada

2
@AntoniParellada: è la tabella nella pagina a cui l'OP è stato collegato: ats.ucla.edu/stat/r/library/contrast_coding.htm#ORTHOGONAL . e contr.poly
andò d'accordo

Risposte:


29

Solo per ricapitolare (e nel caso in cui i collegamenti ipertestuali OP falliscano in futuro), stiamo esaminando un set hsb2di dati in quanto tale:

   id     female race ses schtyp prog read write math science socst
1  70        0    4   1      1    1   57    52   41      47    57
2 121        1    4   2      1    3   68    59   53      63    61
...
199 118      1    4   2      1    1   55    62   58      58    61
200 137      1    4   3      1    2   63    65   65      53    61

che può essere importato qui .

Trasformiamo la variabile readin variabile ordinata / ordinata:

hsb2$readcat<-cut(hsb2$read, 4, ordered = TRUE)
(means = tapply(hsb2$write, hsb2$readcat, mean))
 (28,40]  (40,52]  (52,64]  (64,76] 
42.77273 49.97849 56.56364 61.83333 

Ora siamo tutti insieme a basta eseguire un'ANOVA regolare - sì, è R, e abbiamo praticamente avere una variabile dipendente continua, writee una variabile esplicativa con più livelli, readcat. In R possiamo usarelm(write ~ readcat, hsb2)


1. Generazione della matrice di contrasto:

Esistono quattro livelli diversi per la variabile ordinata readcat, quindi avremo contrasti.n1=3

table(hsb2$readcat)

(28,40] (40,52] (52,64] (64,76] 
     22      93      55      30 

Innanzitutto, andiamo per i soldi e diamo un'occhiata alla funzione R integrata:

contr.poly(4)
             .L   .Q         .C
[1,] -0.6708204  0.5 -0.2236068
[2,] -0.2236068 -0.5  0.6708204
[3,]  0.2236068 -0.5 -0.6708204
[4,]  0.6708204  0.5  0.2236068

Ora analizziamo cosa è successo sotto il cofano:

scores = 1:4  # 1 2 3 4 These are the four levels of the explanatory variable.
y = scores - mean(scores) # scores - 2.5

y=[1.5,0.5,0.5,1.5]

seq_len(n) - 1=[0,1,2,3]

n = 4; X <- outer(y, seq_len(n) - 1, "^") # n = 4 in this case

[11.52.253.37510.50.250.12510.50.250.12511.52.253.375]

Cosa è successo la? la outer(a, b, "^")solleva gli elementi aagli elementi b, in modo che la prima colonna risultati delle operazioni, , ( - 0,5 ) 0 , 0,5 0 e 1,5 0 ; la seconda colonna tra ( - 1,5 ) 1 , ( - 0,5 ) 1 , 0,5 1 e 1,5 1 ; il terzo da ( - 1,5 ) 2 = 2,25(1.5)0(0.5)00.501.50(1.5)1(0.5)10.511.51(1.5)2=2.25, , 0,5 2 = 0,25 e 1,5 2 = 2,25 ; e il quarto, ( - 1,5 ) 3 = - 3,375 , ( - 0,5 ) 3 = - 0,125 , 0,5 3 = 0,125 e 1,5 3 = 3,375 .(0.5)2=0.250.52=0.251.52=2.25(1.5)3=3.375(0.5)3=0.1250.53=0.1251.53=3.375

Quindi facciamo una decomposizione ortogonale di questa matrice e prendiamo la rappresentazione compatta di Q ( ). Alcuni dei meccanismi interni delle funzioni utilizzate nella fattorizzazione QR in R utilizzati in questo post sono ulteriormente spiegati qui .QRc_Q = qr(X)$qr

[202.500.52.23604.5840.50.447200.50.8940.92961.342]

... di cui salviamo solo la diagonale ( z = c_Q * (row(c_Q) == col(c_Q))). Ciò che si trova in diagonale: solo le voci "dal basso" della parte del Q R decomposizione. Appena? bene, no ... Si scopre che la diagonale di una matrice triangolare superiore contiene gli autovalori della matrice!RQR

Successivamente chiamiamo la seguente funzione: raw = qr.qy(qr(X), z)il cui risultato può essere replicato "manualmente" da due operazioni: 1. Trasformare la forma compatta di , ovvero in Q , una trasformazione che può essere realizzata con , e 2. Effettuare il moltiplicazione di matrici Q z , come in .Qqr(X)$qrQQ = qr.Q(qr(X))QzQ %*% z

Fondamentalmente, moltiplicando dai autovalori di R non cambia l'ortogonalità dei vettori colonna costituente, ma dato che il valore assoluto degli autovalori appare in ordine decrescente dall'alto verso sinistra a destra, la moltiplicazione di Q z tenderà a diminuire la valori nelle colonne polinomiali di ordine superiore:QRQz

Matrix of Eigenvalues of R
     [,1]      [,2] [,3]      [,4]
[1,]   -2  0.000000    0  0.000000
[2,]    0 -2.236068    0  0.000000
[3,]    0  0.000000    2  0.000000
[4,]    0  0.000000    0 -1.341641

Confronta i valori nei vettori di colonna successivi (quadratici e cubici) prima e dopo le operazioni di fattorizzazione e con le prime due colonne non interessate.QR

Before QR factorization operations (orthogonal col. vec.)
     [,1] [,2] [,3]   [,4]
[1,]    1 -1.5 2.25 -3.375
[2,]    1 -0.5 0.25 -0.125
[3,]    1  0.5 0.25  0.125
[4,]    1  1.5 2.25  3.375


After QR operations (equally orthogonal col. vec.)
     [,1] [,2] [,3]   [,4]
[1,]    1 -1.5    1 -0.295
[2,]    1 -0.5   -1  0.885
[3,]    1  0.5   -1 -0.885
[4,]    1  1.5    1  0.295

Alla fine chiamiamo (Z <- sweep(raw, 2L, apply(raw, 2L, function(x) sqrt(sum(x^2))), "/", check.margin = FALSE))trasformare la matrice rawin vettori ortonormali :

Orthonormal vectors (orthonormal basis of R^4)
     [,1]       [,2] [,3]       [,4]
[1,]  0.5 -0.6708204  0.5 -0.2236068
[2,]  0.5 -0.2236068 -0.5  0.6708204
[3,]  0.5  0.2236068 -0.5 -0.6708204
[4,]  0.5  0.6708204  0.5  0.2236068

Questa funzione "normalizza" semplicemente la matrice dividendo ( "/") per colonna ogni elemento per . Quindi può essere scomposto in due fasi:(i), risultante, che sono i denominatori di ciascuna colonna in(ii)dove ogni elemento in una colonna è diviso per il valore corrispondente di(i).col.xi2(i) apply(raw, 2, function(x)sqrt(sum(x^2)))2 2.236 2 1.341(ii)(i)

A questo punto i vettori di colonna formano una base ortonormale di , fino a quando non ci liberiamo della prima colonna, che sarà l'intercettazione, e abbiamo riprodotto il risultato di :R4contr.poly(4)

[0.67082040.50.22360680.22360680.50.67082040.22360680.50.67082040.67082040.50.2236068]

Le colonne di questa matrice sono ortonormali , come può essere mostrato da (sum(Z[,3]^2))^(1/4) = 1e z[,3]%*%z[,4] = 0, ad esempio (per inciso, lo stesso vale per le righe). E, ogni colonna è il risultato di aumentare le iniziali al 1 -esimo, 2 -nd e 3 potere -rd rispettivamente - cioè lineare, quadratica o cubica .scores - mean123


2. Quali contrasti (colonne) contribuiscono in modo significativo a spiegare le differenze tra i livelli nella variabile esplicativa?

Possiamo semplicemente eseguire ANOVA e guardare il riepilogo ...

summary(lm(write ~ readcat, hsb2))

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  52.7870     0.6339  83.268   <2e-16 ***
readcat.L    14.2587     1.4841   9.607   <2e-16 ***
readcat.Q    -0.9680     1.2679  -0.764    0.446    
readcat.C    -0.1554     1.0062  -0.154    0.877 

... per vedere che c'è un effetto lineare di readcaton write, in modo che i valori originali (nel terzo blocco di codice all'inizio del post) possano essere riprodotti come:

coeff = coefficients(lm(write ~ readcat, hsb2))
C = contr.poly(4)
(recovered = c(coeff %*% c(1, C[1,]),
               coeff %*% c(1, C[2,]),
               coeff %*% c(1, C[3,]),
               coeff %*% c(1, C[4,])))
[1] 42.77273 49.97849 56.56364 61.83333

... o...

enter image description here

... o molto meglio ...

enter image description here

Essendo contrasti ortogonali la somma dei loro componenti aggiunge a zero per a 1 , , a t costanti e il prodotto punto di uno qualsiasi dei due è zero. Se potessimo visualizzarli sembrerebbero qualcosa del genere:i=1tai=0a1,,at

enter image description here

X0,X1,.Xn

Graficamente, questo è molto più facile da capire. Confronta le medie effettive per gruppi in grandi blocchi quadrati neri con i valori previsti e vedi perché un'approssimazione in linea retta con un contributo minimo di polinomi quadratici e cubici (con curve solo approssimate con loess) è ottimale:

enter image description here

Se, solo per effetto, i coefficienti dell'ANOVA fossero stati così grandi per il contrasto lineare per le altre approssimazioni (quadratica e cubica), il diagramma senza senso che segue rappresenterebbe più chiaramente i grafici polinomiali di ciascun "contributo":

enter image description here

Il codice è qui .


+1 Wow. Questa risposta (finora non l'ho letta fino in fondo) può essere vista come una risposta alla mia vecchia domanda dimenticata troppo stats.stackexchange.com/q/63639/3277 ?
ttnphns,

(+1) @ttnphns: Probabilmente si adatterebbe ancora meglio lì.
Scortchi - Ripristina Monica

Un consiglio: potresti commentarmi lì con un link qui; o inviare una risposta lì - che probabilmente accetterò.
ttnphns,

1
@ttnphns e @Scortchi Grazie! Ho trascorso un bel po 'di tempo cercando di dare un senso a questi concetti e non mi aspettavo molte reazioni. Quindi è una sorpresa molto positiva. Penso che ci siano alcune rughe da chiarire riguardo alla spiegazione della qr.qy()funzione, ma proverò sicuramente a vedere se posso dire qualcosa di minimamente coerente sulla tua domanda non appena avrò del tempo.
Antoni Parellada,

1
@Elvis Ho provato a scegliere una buona frase di riepilogo e posizionarla da qualche parte nel post. Penso che questo sia un buon punto e richiede una bella spiegazione matematica, ma potrebbe essere troppo a questo punto per elaborare ulteriormente.
Antoni Parellada,

5

Userò il tuo esempio per spiegare come funziona. L'uso di contrasti polinomiali con quattro gruppi produce seguenti.

Ewriote1=μ-0.67L+0.5Q-0.22CEwriote2=μ-0.22L-0.5Q+0.67CEwriote3=μ+0.22L-0.5Q-0.67CEwriote4=μ+0.67L+0.5Q+0.22C

Where first equation works for the group of lowest reading scores and the fourth one for the group of best reading scores. we can compare these equations to the one given using normal linear regression (supposing readi is continous)

Ewritei=μ+readiL+readi2Q+readi3C

Usually instead of L,Q,C you would have β1,β2,β3 and written at first position. But this writing resembles the one with polynomial contrasts. So numbers in front of L,Q,C are actually instead of readi,readi2,readi3. You can see that coefficients before L have linear trend, before Q quadratic and before C cubic.

Then R estimates parameters μ,L,Q,C and gives you

μ^=52.79,L^=14.26,Q^=0.97,C^=0.16
Where μ^=14i=14Ewritei and estimated coefficients μ^,L^,Q^,C^ are something like estimates at normal linear regression. So from the output you can see if estimated coefficients are significantly different from zero, so you could anticipate some kind of linear, quadratic or cubic trend.

In that example is significantly non-zero only L^. So your conclusion could be: We see that the better scoring in writing depends linearly on reading score, but there is no significant quadratic or cubic effect.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.