Podsumowując (i w przypadku, gdy hiperłącza OP nie będą działać w przyszłości), patrzymy na taki zestaw danych hsb2
jako taki:
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
które można zaimportować tutaj .
Przekształcamy zmienną read
w zmienną uporządkowaną / porządkową:
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
Teraz wszystko jest gotowe, aby po prostu uruchomić regularną ANOVA - tak, to jest R, a my w zasadzie mają zmienną zależną ciągły, write
oraz zmienną objaśniającą z wieloma poziomami, readcat
. W R możemy użyćlm(write ~ readcat, hsb2)
1. Generowanie macierzy kontrastu:
Istnieją cztery różne poziomy uporządkowanej zmiennej readcat
, więc będziemy mieli kontrasty.n−1=3
table(hsb2$readcat)
(28,40] (40,52] (52,64] (64,76]
22 93 55 30
Najpierw chodźmy po pieniądze i spójrz na wbudowaną funkcję R:
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
Teraz przeanalizujmy, co działo się pod maską:
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⎤⎦⎥⎥⎥⎥
Co tu się stało? outer(a, b, "^")
podnosi elementów a
z elementami b
tak, że pierwsze wyniki z kolumny z operacji, , ( - 0,5 ) 0 , 0,5 0 , a 1,5 0 ; druga kolumna z ( - 1,5 ) 1 , ( - 0,5 ) 1 , 0,5 1 i 1,5 1 ; trzeci z ( - 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 i 1,5 2 = 2,25 ; i czwarty, ( - 1,5 ) 3 = - 3,375 , ( - 0,5 ) 3 = - 0,125 , 0,5 3 = 0,125 i 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
Następnie wykonać ortonormalną rozkład tej macierzy i ma kompaktową reprezentację Q ( ). Niektóre z wewnętrznych funkcji funkcji używanych w rozkładzie QR w R używanych w tym poście są wyjaśnione tutaj .Q R.c_Q = qr(X)$qr
⎡⎣⎢⎢⎢⎢- 20,50,50,50- 2,2360,4770,894- 2,502)- 0,92960- 4.5840- 1,342⎤⎦⎥⎥⎥⎥
... z których zapisujemy tylko przekątną ( z = c_Q * (row(c_Q) == col(c_Q))
). Co leży w przekątna: tylko „dolne” wpisy z część Q R rozkładu. Właśnie? no nie ... Okazuje się, że przekątna górnej trójkątnej macierzy zawiera wartości własne macierzy!RQ R.
Następnie wywołujemy następującą funkcję: raw = qr.qy(qr(X), z)
wynik z których mogą być replikowane „ręcznie” przez dwie operacje: 1. Włączanie zwartą postać , tj , do Q , transformację, jaką można uzyskać z , i 2. Przeprowadzenie mnożenie macierzy Q z , jak w .Qqr(X)$qr
QQ = qr.Q(qr(X))
Q zQ %*% z
Co najważniejsze, pomnożenie przez wartości własne R nie zmienia ortogonalności składowych wektorów kolumnowych, ale biorąc pod uwagę, że wartość bezwzględna wartości własnych pojawia się w porządku malejącym od góry z lewej strony do prawej u dołu, mnożenie Q z będzie miało tendencję do zmniejszania wartości w kolumnach wielomianowych wyższego rzędu:QRQ z
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
Porównać wartości w kolejnych wektorów kolumny (kwadratowe i sześcienne) przed i po tym, jak operacji faktoryzacji, i niedotkniętych chorobą pierwszych dwóch kolumn.Q R.
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
Wreszcie nazywamy (Z <- sweep(raw, 2L, apply(raw, 2L, function(x) sqrt(sum(x^2))), "/", check.margin = FALSE))
przekształcanie macierzy raw
w wektory ortonormalne :
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
Ta funkcja po prostu „normalizuje” macierz, dzieląc ( "/"
) kolumnowo każdy element przez . Można go zatem rozłożyć na dwa etapy:(i), w wyniku czego, które są mianownikami dla każdej kolumny w(ii),gdzie każdy element w kolumnie jest podzielony przez odpowiednią wartość(i).∑przełęcz.x2)ja-------√( i ) apply(raw, 2, function(x)sqrt(sum(x^2)))
2 2.236 2 1.341
( ii )( i )
W tym momencie wektory kolumnowe stanowią podstawę ortonormalną z , aż pozbędziemy pierwszej kolumny, która będzie przechwytywać i mamy powielana wynik :R4contr.poly(4)
⎡⎣⎢⎢⎢⎢- 0,6708204- 0,22360680,22360680,67082040,5- 0,5- 0,50,5- 0,22360680,6708204- 0,67082040,2236068⎤⎦⎥⎥⎥⎥
Kolumny tej macierzy są ortonormalne , co może być pokazane na przykład przez (sum(Z[,3]^2))^(1/4) = 1
i z[,3]%*%z[,4] = 0
(nawiasem mówiąc, to samo dotyczy wierszy). Każda kolumna jest wynikiem podniesienia początkowych do 1. , 2. i 3. mocy, tj. Liniowej , kwadratowej i sześciennej .wyniki - średnie12)3)
2. Które kontrasty (kolumny) znacząco przyczyniają się do wyjaśnienia różnic między poziomami w zmiennej objaśniającej?
Możemy po prostu uruchomić ANOVA i spojrzeć na podsumowanie ...
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
... aby zobaczyć, że istnieje liniowy efekt readcat
on write
, dzięki czemu oryginalne wartości (w trzeciej części kodu na początku postu) można odtworzyć jako:
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
... lub ...
... lub znacznie lepiej ...
Będąc ortogonalnych kontrastów sumą ich składników dodaje się do zera dla a 1 , ⋯ , a t stałych, a produkt kropka dowolnych dwóch z nich jest równa zero. Gdybyśmy mogli je wizualizować, wyglądałyby mniej więcej tak:∑i = 1tzaja= 0za1, ⋯ , at
X0, X1, ⋯ . Xn
Graficznie jest to znacznie łatwiejsze do zrozumienia. Porównaj rzeczywiste średnie według grup w dużych kwadratowych czarnych blokach z przewidywanymi wartościami i zobacz, dlaczego optymalne przybliżenie linii prostej przy minimalnym udziale kwadratowych i sześciennych wielomianów (z krzywymi aproksymowanymi tylko metodą less) jest optymalne:
Gdyby, dla samego efektu, współczynniki ANOVA były tak duże dla kontrastu liniowego dla innych przybliżeń (kwadratowych i sześciennych), przedstawiony poniżej nonsensowny wykres wyraźniej przedstawiłby wykresy wielomianowe każdego „wkładu”:
Kod jest tutaj .