요약하자면 (그리고 미래에 OP 하이퍼 링크가 실패 할 경우) 다음 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
여기에서 가져올 수 있습니다 .
변수 read
를 순서 / 순서 변수로 바꿉니다.
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
이제 우리는 모두 정규 분산 분석을 실행하도록 설정되었습니다. 예, R입니다. 기본적으로 연속적인 종속 write
변수와 여러 수준의 설명 변수가 있습니다 readcat
. R에서는 사용할 수 있습니다lm(write ~ readcat, hsb2)
1. 대비 매트릭스 생성
readcat
n−1=3
table(hsb2$readcat)
(28,40] (40,52] (52,64] (64,76]
22 93 55 30
먼저 돈을 벌고 내장 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
이제 후드 아래에서 무슨 일이 있었는지 해보자.
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⎤⎦⎥⎥⎥⎥
outer(a, b, "^")
a
b
(−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.250.52=0.251.52=2.25(−1.5)3=−3.375(−0.5)3=−0.1250.53=0.1251.53=3.375
QRc_Q = qr(X)$qr
⎡⎣⎢⎢⎢⎢−20.50.50.50−2.2360.4470.894−2.502−0.92960−4.5840−1.342⎤⎦⎥⎥⎥⎥
z = c_Q * (row(c_Q) == col(c_Q))
RQR
raw = qr.qy(qr(X), z)
Qqr(X)$qr
QQ = qr.Q(qr(X))
QzQ %*% z
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
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
마지막으로 (Z <- sweep(raw, 2L, apply(raw, 2L, function(x) sqrt(sum(x^2))), "/", check.margin = FALSE))
행렬 raw
을 직교 법선 벡터 로 변환합니다 .
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.x2i−−−−−−−√(i) apply(raw, 2, function(x)sqrt(sum(x^2)))
2 2.236 2 1.341
(ii)(i)
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
scores - mean123
2. 설명 변수의 수준 간 차이를 설명하는 데 어떤 대비 (열)가 크게 기여합니까?
ANOVA를 실행하고 요약을 볼 수 있습니다 ...
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
on 의 선형 효과가 있음 을 write
확인하여 원래 값 (포스트 시작 부분의 세 번째 코드 청크)을 다음과 같이 재현 할 수 있습니다.
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
... 또는 ...
또는 훨씬 더 나은 ...
∑i=1tai=0a1,⋯,at
X0,X1,⋯.Xn
그래픽 적으로 이해하기가 훨씬 쉽습니다. 큰 정사각형 검은 색 블록의 그룹 별 실제 평균을 미리 지정된 값과 비교하고 2 차 및 3 차 다항식의 기여도가 가장 적은 직선 근사 (왜곡 만 근사한 곡선 만 있음)가 최적인지 확인하십시오.
효과를 위해 ANOVA의 계수가 다른 근사치 (2 차 및 3 차)에 대한 선형 대비에 대해 큰 경우, 다음의 무의미한 플롯은 각 "기여"의 다항식 플롯을 더 명확하게 나타냅니다.
코드는 여기에 있습니다 .