Sadece özetlemek gerekirse (ve gelecekte OP köprüleri başarısız olursa), bir veri kümesine şu şekilde bakıyoruz hsb2
:
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
burada ithal edilebilir .
Değişkeni read
ve sıralı / sıralı değişkene dönüştürürüz:
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
Şimdi hepimiz sadece düzenli bir ANOVA çalıştırmaya hazırız - evet, bu R ve temelde sürekli bağımlı write
bir değişkenimiz ve çok seviyeli açıklayıcı bir değişkenimiz var readcat
. R de kullanabilirizlm(write ~ readcat, hsb2)
1. Kontrast matrisinin oluşturulması:
Sıralı değişkenin dört farklı seviyesi vardır readcat
, bu yüzden kontrastımız olacaktır.n−1=3
table(hsb2$readcat)
(28,40] (40,52] (52,64] (64,76]
22 93 55 30
İlk olarak, para için gidelim ve yerleşik R işlevine bir göz atalım:
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
Şimdi kaputun altında neler olup bittiğini inceleyelim:
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⎤⎦⎥⎥⎥⎥
Orada ne oldu? outer(a, b, "^")
elemanlarını yükseltir a
elemanlarına b
, yani bu operasyonlardan ilk sütun sonuçları, , ( - 0.5 ) 0 , 0.5 0 ve 1.5 0 ; ( - 1.5 ) 1 , ( - 0.5 ) 1 , 0.5 1 ve 1.5 1 ' den ikinci sütun ; üçüncüsü ( - 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 ve 1.5 2 = 2.25 ; ve dördüncü, ( - 1.5 ) 3 = - 3.375 , ( - 0.5 ) 3 = - 0.125 , 0.5 3 = 0.125 ve 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
Bir dahaki bu matrisin ortonormal ayrışmasını ve Q'nun kompakt temsil alır ( ). Bu yazıda kullanılan R'de QR çarpanlarına ayırmada kullanılan fonksiyonların iç çalışmalarından bazıları burada daha ayrıntılı olarak açıklanmaktadır .QRc_Q = qr(X)$qr
⎡⎣⎢⎢⎢⎢−20.50.50.50−2.2360.4470.894−2.502−0.92960−4.5840−1.342⎤⎦⎥⎥⎥⎥
... sadece diyagonalini kaydettik ( z = c_Q * (row(c_Q) == col(c_Q))
). Diyagonalde ne var: Q R ayrışmasının kısmının sadece "alt" girdileri . Sadece? iyi, hayır ... Bir üst üçgen matrisin köşegeninin matrisin özdeğerlerini içerdiği ortaya çıktı!RQR
Aşağıdaki işlev çağrısı Sonraki: raw = qr.qy(qr(X), z)
1. kompakt bir yapıya Dönüş: bunun sonucu, iki işlem ile "elle" çoğaltılmış olabilir , yani içine, Q , ile elde edilebilir bir dönüşüm ve 2. yapılması matris çarpımı Q z , olduğu gibi .Qqr(X)$qr
QQ = qr.Q(qr(X))
QzQ %*% z
En önemlisi, çarparak ve öz-değerlerle R kurucu sütun vektörlerinin ortogonalliği değişmez, ancak özdeğerler mutlak değeri alt soldan sağa doğru yukarıdan azalan görünür göz önüne alındığında, bir çarpma S z azaltma eğilimi gösterecektir yüksek sıralı polinom sütunlarındaki değerler: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
Önce ve sonra (Kuvadratik ve kübik), daha sonra sütun vektörleri değerleri karşılaştır ve etkilenmemiş ilk iki sütununa çarpanlarına işlemleri.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
Nihayet dediğimiz (Z <- sweep(raw, 2L, apply(raw, 2L, function(x) sqrt(sum(x^2))), "/", check.margin = FALSE))
matrisi dönüm raw
bir içine ortonormal vektörler:
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
Bu işlev (bölünmesiyle matris "normalize" "/"
), her bir eleman columnwise . Dolayısıyla, iki adımda ayrıştırılabilir:(i), sonuç olarak,(ii) 'deki bir sütundaki her elemanın(i)'nin karşılık gelen değerine bölündüğüher bir sütun için payda olansonuç.Σcol.x2ben-------√( i ) apply(raw, 2, function(x)sqrt(sum(x^2)))
2 2.236 2 1.341
( ii )( i )
Bu noktada sütun vektörler bir ortonormal temelini oluşturur biz kesişme olacak ilk sütunda, kurtulana kadar, ve biz sonuca çoğaltılmış var :R,4contr.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
puanlar - ortalama123
2. Açıklayıcı değişkendeki seviyeler arasındaki farkları açıklamak için hangi kontrastlar (sütunlar) önemli ölçüde katkıda bulunur?
Sadece ANOVA'yı çalıştırabilir ve özete bakabiliriz ...
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
... readcat
üzerinde doğrusal bir etki olduğunu görmek için write
, orijinal değerler (postanın başlangıcındaki üçüncü kod yığınında) şu şekilde çoğaltılabilir:
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
... ya da ...
... ya da daha iyisi ...
Σi = 1tbirben= 0bir1, ⋯ , at
X0,X1,⋯.Xn
Grafiksel olarak, bunu anlamak çok daha kolaydır. Gerçek araçları büyük kare siyah bloklardaki gruplarla öngörülen değerlerle karşılaştırın ve kuadratik ve kübik polinomların minimum katkısı ile (sadece loess ile yaklaşık eğrilerle) düz bir çizgi yaklaşımının neden en uygun olduğunu görün:
Sadece etki için, ANOVA katsayıları diğer yaklaşımlar (kuadratik ve kübik) için doğrusal kontrast için büyük olsaydı, takip eden saçma sapan her "katkının" polinom parsellerini daha açık bir şekilde tasvir ederdi:
Kod burada .