실제로 그렇지 않습니다간단한 선형 모델 (예를 들어, 일원 또는 이원 분산 분석 유사 모델)에서 이분산성을 다루는 것은 어렵지 .
ANOVA의 견고성
첫째, 다른 사람들이 지적했듯이 분산 분석은 특히 분산 데이터 (각 그룹의 관측치 수가 동일)가있는 경우 등분 산 가정의 편차에 놀라 울 정도로 강력합니다. 반면에 등분 산에 대한 예비 시험은 그렇지 않습니다 (레벤의 시험은 교과서에서 일반적으로 가르치는 F- 시험보다 훨씬 낫 습니다). 조지 박스는 다음과 같이 말합니다.
차이에 대한 예비 테스트를하는 것은 해로가 항구를 떠날 수있는 조건이 충분히 평온한 지 알아보기 위해 노를 젓는 보트에 바다에 들어가는 것과 같습니다!
분산 분석을 고려하기가 매우 쉽기 때문에 분산 분석은 매우 강력하지만 그렇게하지 않을 이유는 거의 없습니다.
비모수 적 테스트
평균 차이에 관심이있는 경우 비모수 적 테스트 (예 : Kruskal-Wallis 테스트)는 실제로 사용되지 않습니다. 그룹 간 차이를 테스트하지만 평균적으로 차이를 테스트 하지는 않습니다 .
데이터 예
분산 분석을 사용하고 싶지만 등분 산 가정이 사실이 아닌 간단한 데이터 예제를 생성 해 봅시다.
set.seed(1232)
pop = data.frame(group=c("A","B","C"),
mean=c(1,2,5),
sd=c(1,3,4))
d = do.call(rbind, rep(list(pop),13))
d$x = rnorm(nrow(d), d$mean, d$sd)
평균과 분산의 차이가 명확한 세 그룹이 있습니다.
stripchart(x ~ group, data=d)
분산 분석
당연히 일반적인 분산 분석이이를 잘 처리합니다.
> mod.aov = aov(x ~ group, data=d)
> summary(mod.aov)
Df Sum Sq Mean Sq F value Pr(>F)
group 2 199.4 99.69 13.01 5.6e-05 ***
Residuals 36 275.9 7.66
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
어떤 그룹이 다른가요? Tukey의 HSD 방법을 사용합시다 :
> TukeyHSD(mod.aov)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = x ~ group, data = d)
$group
diff lwr upr p adj
B-A 1.736692 -0.9173128 4.390698 0.2589215
C-A 5.422838 2.7688327 8.076843 0.0000447
C-B 3.686146 1.0321403 6.340151 0.0046867
A를 P의 0.26의 -value, 우리는 그룹 A와 B 그리고 우리가 경우에도 사이 (수단)에 차이 주장 할 수 없습니다 하지 않았다 우리는 세 가지 비교했던 것을 고려, 우리는 낮은 얻을 수 없겠죠 P를 - 값 ( P = 0.12) :
> summary.lm(mod.aov)
[…]
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.5098 0.7678 0.664 0.511
groupB 1.7367 1.0858 1.599 0.118
groupC 5.4228 1.0858 4.994 0.0000153 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.768 on 36 degrees of freedom
왜 그런 겁니까? 플롯을 바탕으로, 거기에 있다 꽤 명확한 차이. 그 이유는 ANOVA가 각 그룹에서 동일한 분산을 가정하고 공통 표준 편차 2.77을 추정하기 때문입니다 ( '잔류 표준 오류'로 표시됨).summary.lm
표 되거나 잔차 평균 제곱의 제곱근 (7.66)을 취하여 얻을 수 있음)을 때문입니다. ANOVA 테이블에서).
그러나 그룹 A는 (인구) 표준 편차가 1이고,이 2.77로 과대 평가하면 통계적으로 유의미한 결과를 얻는 것이 어려워집니다 (즉, 저전력 테스트).
분산이 다른 'ANOVA'
그렇다면 분산의 차이를 고려한 적절한 모델을 맞추는 방법은 무엇입니까? R에서는 쉽습니다.
> oneway.test(x ~ group, data=d, var.equal=FALSE)
One-way analysis of means (not assuming equal variances)
data: x and group
F = 12.7127, num df = 2.000, denom df = 19.055, p-value = 0.0003107
따라서 등분 산을 가정하지 않고 R에서 간단한 단방향 'ANOVA'를 실행하려면이 함수를 사용하십시오. 기본적으로 t.test()
분산이 같지 않은 두 샘플에 대한 (Welch)의 확장입니다 .
불행하게도, 그것은 작동하지 않습니다 TukeyHSD()
(또는 대부분의 다른 기능은 당신이에 사용하는 aov
객체) 우리가 확신 거기 그렇게해도 된다 그룹의 차이는, 우리가 모르는 곳 들이 있습니다.
이분산성 모델링
가장 좋은 솔루션은 분산을 명시 적으로 모델링하는 것입니다. 그리고 R에서는 매우 쉽습니다.
> library(nlme)
> mod.gls = gls(x ~ group, data=d,
weights=varIdent(form= ~ 1 | group))
> anova(mod.gls)
Denom. DF: 36
numDF F-value p-value
(Intercept) 1 16.57316 0.0002
group 2 13.15743 0.0001
물론 여전히 중요한 차이점. 그러나 이제 그룹 A와 B의 차이점도 정적으로 중요해졌습니다 ( P = 0.025).
> summary(mod.gls)
Generalized least squares fit by REML
Model: x ~ group
[…]
Variance function:
Structure: Different standard
deviations per stratum
Formula: ~1 | group
Parameter estimates:
A B C
1.000000 2.444532 3.913382
Coefficients:
Value Std.Error t-value p-value
(Intercept) 0.509768 0.2816667 1.809829 0.0787
groupB 1.736692 0.7439273 2.334492 0.0253
groupC 5.422838 1.1376880 4.766542 0.0000
[…]
Residual standard error: 1.015564
Degrees of freedom: 39 total; 36 residual
따라서 적절한 모델을 사용하면 도움이됩니다! 또한 (상대) 표준 편차의 추정치를 얻습니다. 그룹 A에 대한 추정 표준 편차는 결과 하단에서 찾을 수 있습니다 (1.02). 그룹 B의 추정 표준 편차는 2.44 배 또는 2.48이며 그룹 C의 추정 표준 편차는 3.97과 유사합니다 ( intervals(mod.gls)
그룹 B 및 C의 상대 표준 편차에 대한 신뢰 구간을 얻는 유형 ).
여러 테스트에 대한 수정
그러나 실제로 여러 테스트를 수정해야합니다. 'multcomp'라이브러리를 사용하면 쉽습니다. 불행히도, 그것은 'gls'객체를 기본적으로 지원하지 않으므로 먼저 도우미 함수를 추가해야합니다.
model.matrix.gls <- function(object, ...)
model.matrix(terms(object), data = getData(object), ...)
model.frame.gls <- function(object, ...)
model.frame(formula(object), data = getData(object), ...)
terms.gls <- function(object, ...)
terms(model.frame(object),...)
이제 일하자 :
> library(multcomp)
> mod.gls.mc = glht(mod.gls, linfct = mcp(group = "Tukey"))
> summary(mod.gls.mc)
[…]
Linear Hypotheses:
Estimate Std. Error z value Pr(>|z|)
B - A == 0 1.7367 0.7439 2.334 0.0480 *
C - A == 0 5.4228 1.1377 4.767 <0.001 ***
C - B == 0 3.6861 1.2996 2.836 0.0118 *
그룹 A와 그룹 B의 통계적으로 유의미한 차이! ☺ 그리고 그룹 평균의 차이에 대해 (동시) 신뢰 구간을 얻을 수도 있습니다.
> confint(mod.gls.mc)
[…]
Linear Hypotheses:
Estimate lwr upr
B - A == 0 1.73669 0.01014 3.46324
C - A == 0 5.42284 2.78242 8.06325
C - B == 0 3.68615 0.66984 6.70245
대략 정확한 모델을 사용하면 이러한 결과를 신뢰할 수 있습니다!
이 간단한 예에서 그룹 C의 데이터는 그룹 A와 B의 차이에 대한 정보를 실제로 추가하지 않습니다. 각 그룹에 대해 별도의 평균과 표준 편차를 모두 모델링하기 때문입니다. 다중 비교를 위해 수정 된 pairwise t -tests를 사용할 수 있습니다 .
> pairwise.t.test(d$x, d$group, pool.sd=FALSE)
Pairwise comparisons using t tests with non-pooled SD
data: d$x and d$group
A B
B 0.03301 -
C 0.00098 0.02032
P value adjustment method: holm
그러나보다 복잡한 모델, 예를 들어 양방향 모델 또는 많은 예측 변수가있는 선형 모델의 경우 GLS (일반 최소 제곱)를 사용하고 분산 함수를 명시 적으로 모델링하는 것이 가장 좋습니다.
분산 함수는 단순히 각 그룹에서 다른 상수 일 필요는 없습니다. 우리는 그것에 구조를 부과 할 수 있습니다. 예를 들어, 분산 을 각 그룹 평균 의 거듭 제곱 (따라서 하나의 모수, 지수 만 추정 하면 됨) 또는 모형에있는 예측 변수 중 하나의 로그로 모형화 할 수 있습니다. 이 모든 것은 GLS와 gls()
R에서 매우 쉽습니다 .
일반화 된 최소 제곱은 IMHO가 매우 잘 사용되지 않는 통계 모델링 기술입니다. 모형 가정의 편차에 대해 걱정하는 대신 이러한 편차를 모델링하십시오 !
R
여기에서 내 대답을 읽는 것이 도움이 될 수 있습니다.이 분산 데이터에 대한 일원 분산 분석의 대안 .