Sekadar rekap (dan jika hyperlink OP gagal di masa mendatang), kami melihat dataset hsb2
seperti:
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
yang bisa diimpor di sini .
Kami mengubah variabel read
menjadi dan memerintahkan / variabel ordinal:
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
Sekarang kita siap untuk menjalankan ANOVA biasa - ya, itu adalah R, dan kita pada dasarnya memiliki variabel dependen kontinu write
,, dan variabel penjelas dengan beberapa level,readcat
,. Di R bisa kita gunakanlm(write ~ readcat, hsb2)
1. Menghasilkan matriks kontras:
Ada empat level berbeda untuk variabel yang diurutkan readcat
, jadi kita akan memiliki kontras.n - 1 = 3
table(hsb2$readcat)
(28,40] (40,52] (52,64] (64,76]
22 93 55 30
Pertama, mari kita cari uang, dan lihat fungsi R bawaan:
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
Sekarang mari kita membedah apa yang terjadi di bawah tenda:
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⎤⎦⎥⎥⎥⎥
Apa yang terjadi disana? yang outer(a, b, "^")
menaikkan elemen a
ke elemen b
, sehingga kolom pertama dihasilkan dari operasi, , ( - 0.5 ) 0 , 0.5 0 dan 1.5 0 ; kolom kedua dari ( - 1.5 ) 1 , ( - 0.5 ) 1 , 0.5 1 dan 1.5 1 ; yang ketiga dari ( - 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 dan 1,5 2 = 2,25 ; dan yang keempat, ( - 1.5 ) 3 = - 3.375 , ( - 0.5 ) 3 = - 0.125 , 0.5 3 = 0.125 dan 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
Berikutnya kita melakukan ortonormal dekomposisi matriks ini dan mengambil representasi kompak dari Q ( ). Beberapa cara kerja fungsi yang digunakan dalam faktorisasi QR dalam R yang digunakan dalam posting ini dijelaskan lebih lanjut di sini .Q Rc_Q = qr(X)$qr
⎡⎣⎢⎢⎢⎢- 20,50,50,50- 2.2360,4470,894- 2.502- 0,92960- 4.5840- 1.342⎤⎦⎥⎥⎥⎥
... yang kami simpan hanya diagonal ( z = c_Q * (row(c_Q) == col(c_Q))
). Apa yang terletak pada diagonal: Hanya "bawah" entri dari bagian dari Q R dekomposisi. Hanya? baik, tidak ... Ternyata diagonal dari matriks segitiga atas berisi nilai eigen dari matriks!RQ R
Selanjutnya kita memanggil fungsi berikut:, raw = qr.qy(qr(X), z)
hasil yang dapat direplikasi "secara manual" oleh dua operasi: 1. Mengubah bentuk kompak dari , yaitu , menjadi Q , transformasi yang dapat dicapai dengan , dan 2. Melakukan matriks perkalian Q z , seperti dalam .Qqr(X)$qr
QQ = qr.Q(qr(X))
Q zQ %*% z
Krusial, mengalikan dengan nilai eigen dari R tidak mengubah orthogonality dari vektor-vektor kolom konstituen, tetapi mengingat bahwa nilai absolut dari nilai eigen muncul dalam urutan menurun dari kiri atas ke kanan bawah, perbanyakan Q z akan cenderung menurunkan nilai dalam kolom polinomial orde tinggi: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
Membandingkan nilai-nilai dalam vektor kolom kemudian (kuadrat dan kubik) sebelum dan sesudah operasi faktorisasi, dan dengan tidak terpengaruh pertama dua kolom.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
Akhirnya kita sebut (Z <- sweep(raw, 2L, apply(raw, 2L, function(x) sqrt(sum(x^2))), "/", check.margin = FALSE))
mengubah matriks raw
menjadi vektor ortonormal :
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
"/"
∑col.x2saya-------√( i ) apply(raw, 2, function(x)sqrt(sum(x^2)))
2 2.236 2 1.341
( ii )( saya) .
R4contr.poly(4)
⎡⎣⎢⎢⎢⎢- 0,6708204- 0,22360680,22360680,67082040,5- 0,5- 0,50,5- 0,22360680,6708204- 0,67082040,2236068⎤⎦⎥⎥⎥⎥
(sum(Z[,3]^2))^(1/4) = 1
z[,3]%*%z[,4] = 0
skor - rata-rata123
2. Kontras (kolom) mana yang berkontribusi signifikan untuk menjelaskan perbedaan antar level dalam variabel penjelas?
Kami hanya dapat menjalankan ANOVA dan melihat ringkasan ...
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
... untuk melihat bahwa ada efek linear readcat
aktif write
, sehingga nilai asli (dalam potongan kode ketiga di awal posting) dapat direproduksi sebagai:
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
... atau...
... atau jauh lebih baik ...
∑i = 1tSebuahsaya= 0Sebuah1, ⋯ , at
Gagasan di balik kontras ortogonal adalah bahwa kesimpulan yang dapat kita tarik (dalam hal ini menghasilkan koefisien melalui regresi linier) akan menjadi hasil dari aspek independen dari data. Ini tidak akan terjadi jika kita hanya menggunakanX0, X1, ⋯ . Xn sebagai kontras.
Secara grafis, ini jauh lebih mudah dipahami. Bandingkan sarana aktual oleh kelompok-kelompok dalam blok hitam persegi besar dengan nilai-nilai yang ditentukan sebelumnya, dan lihat mengapa perkiraan garis lurus dengan kontribusi minimal polinomial kuadratik dan kubik (dengan kurva yang hanya didekati dengan loess) adalah optimal:
Jika, hanya untuk efek, koefisien ANOVA telah sebesar untuk kontras linier untuk perkiraan lainnya (kuadrat dan kubik), plot nonsensik yang mengikuti akan menggambarkan lebih jelas plot polinomial dari setiap "kontribusi":
Kodenya ada di sini .