Um es noch einmal zusammenzufassen (und falls die OP-Hyperlinks in Zukunft fehlschlagen sollten), betrachten wir einen Datensatz hsb2
als solchen:
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
welche hier importiert werden können .
Wir wandeln die Variable read
in eine geordnete / ordinale Variable um:
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
Jetzt sind wir alle bereit, nur eine reguläre ANOVA durchzuführen - ja, es ist R, und wir haben im Grunde eine stetige abhängige Variable, write
und eine erklärende Variable mit mehreren Ebenen readcat
. In R können wir verwendenlm(write ~ readcat, hsb2)
1. Generieren der Kontrastmatrix:
Die bestellte Variable readcat
hat vier verschiedene Ebenen , also haben wir n−1=3 Kontraste.
table(hsb2$readcat)
(28,40] (40,52] (52,64] (64,76]
22 93 55 30
Lassen Sie uns zuerst das Geld holen und einen Blick auf die integrierte R-Funktion werfen:
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
Lassen Sie uns nun untersuchen, was unter der Haube vor sich ging:
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
⎡⎣⎢⎢⎢⎢1111−1.5−0.50.51.52.250.250.252.25−3.375−0.1250.1253.375⎤⎦⎥⎥⎥⎥
Was ist dort passiert? das outer(a, b, "^")
wirft die Elemente von a
zu den Elementen von auf b
, so dass die erste Spalte aus den Operationen , ( - 0,5 ) 0 , 0,5 0 und 1,5 0 resultiert ; die zweite Spalte von ( - 1,5 ) 1 , ( - 0,5 ) 1 , 0,5 1 und 1,5 1 ; der dritte von ( - 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 und 1,5 2 = 2,25 ; und die vierte, ( - 1,5 ) 3 = - 3,375 , ( - 0,5 ) 3 = - 0,125 , 0,5 3 = 0,125 und 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
Als nächstes führen wir eine orthonormale Zerlegung von dieser Matrix durch und nehmen die kompakte Darstellung von Q ( ). Einige der inneren Abläufe der Funktionen in QR - Faktorisierung verwendet in R verwendet in diesem Beitrag nicht weiter erläutert hier .QRc_Q = qr(X)$qr
⎡⎣⎢⎢⎢⎢−20.50.50.50−2.2360.4470.894−2.502−0.92960−4.5840−1.342⎤⎦⎥⎥⎥⎥
... von denen wir nur die Diagonale speichern ( z = c_Q * (row(c_Q) == col(c_Q))
). Was liegt in der Diagonale: Nur die "unteren" Einträge des Teils des Q RRQR -Zerlegung. Gerade? Nun, nein ... Es stellt sich heraus, dass die Diagonale einer oberen Dreiecksmatrix die Eigenwerte der Matrix enthält!
Als nächstes rufen wir die folgende Funktion auf raw = qr.qy(qr(X), z)
, deren Ergebnis durch zwei Operationen "manuell" repliziert werden kann: 1. Verwandeln der kompakten Form von , dh in Q , eine Transformation, die erreicht werden kann , und 2. Ausführen der Matrixmultiplikation Q z wie in .Qqr(X)$qr
QQ = qr.Q(qr(X))
QzQ %*% z
Entscheidend ist, dass das Multiplizieren von mit den Eigenwerten von R die Orthogonalität der konstituierenden Spaltenvektoren nicht ändert, aber angesichts der Tatsache, dass der absolute Wert der Eigenwerte in abnehmender Reihenfolge von links oben nach rechts unten erscheint, wird die Multiplikation von Q z dazu neigen, die Orthogonalität zu verringern Werte in den Polynomspalten höherer Ordnung: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
Vergleichen Sie die Werte in den späteren Spaltenvektoren (quadratisch und kubisch) vor und nach den -Faktorisierungsoperationen und mit den nicht betroffenen ersten beiden Spalten.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
Zuletzt nennen wir die (Z <- sweep(raw, 2L, apply(raw, 2L, function(x) sqrt(sum(x^2))), "/", check.margin = FALSE))
Umwandlung der Matrix raw
in orthonormale Vektoren:
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
Diese Funktion "normalisiert" einfach die Matrix, indem "/"
jedes Element spaltenweise durch √ geteilt wird ( ) . Es kann also in zwei Schritten zerlegt werden:(i), was dazu führt, dass die Nenner für jede Spalte in(ii) sind,wobei jedes Element in einer Spalte durch den entsprechenden Wert von(i)dividiert wird.∑col.x2i−−−−−−−√(i) apply(raw, 2, function(x)sqrt(sum(x^2)))
2 2.236 2 1.341
(ii)(i) .
Zu diesem Zeitpunkt bilden die Spaltenvektoren eine orthonormale Basis von , bis wir die erste Spalte loswerden, die der Achsenabschnitt sein wird, und das Ergebnis von reproduziert haben :R4contr.poly(4)
⎡⎣⎢⎢⎢⎢−0.6708204−0.22360680.22360680.67082040.5−0.5−0.50.5−0.22360680.6708204−0.67082040.2236068⎤⎦⎥⎥⎥⎥
Die Spalten dieser Matrix sind orthonormal , wie dies beispielsweise durch (sum(Z[,3]^2))^(1/4) = 1
und gezeigt werden kann z[,3]%*%z[,4] = 0
(im Übrigen gilt das Gleiche für Zeilen). Und jede Spalte ist das Ergebnis der Erhöhung der Anfangswerte auf die 1. , 2. und 3. Potenz - dh linear, quadratisch und kubisch .scores - mean123
2. Welche Kontraste (Spalten) tragen wesentlich zur Erklärung der Ebenenunterschiede in der erklärenden Variablen bei?
Wir können einfach die ANOVA starten und uns die Zusammenfassung ansehen ...
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
... um zu sehen, dass es einen linearen Effekt von readcat
on gibt write
, so dass die ursprünglichen Werte (im dritten Codeabschnitt am Anfang des Beitrags) wie folgt reproduziert werden können:
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
... oder...
... oder viel besser ...
Als orthogonale Kontraste die Summe ihrer Komponenten ergänzt Null für ein 1 , ⋯ , ein t Konstanten und das Punktprodukt von zwei von ihnen gleich Null ist . Wenn wir sie uns vorstellen könnten, würden sie ungefähr so aussehen:∑i = 1teinich= 0ein1, ⋯ , at
X0, X1, ⋯ . Xn als Kontraste.
Grafisch ist dies viel einfacher zu verstehen. Vergleichen Sie die tatsächlichen Mittelwerte durch Gruppen in großen quadratischen schwarzen Blöcken mit den vorhergesagten Werten und sehen Sie, warum eine gerade Näherung mit minimalem Beitrag von quadratischen und kubischen Polynomen (mit nur mit Löss angenäherten Kurven) optimal ist:
Wenn die Koeffizienten der ANOVA für den linearen Kontrast für die anderen Näherungen (quadratisch und kubisch) nur aus Gründen der Wirkung so groß gewesen wären, würde die folgende unsinnige Darstellung die Polynomdarstellungen jedes "Beitrags" deutlicher darstellen:
Der Code ist hier .