実際、単純な線形モデル(たとえば、一元配置または二元配置のANOVAのようなモデル)で不均一分散を処理することはそれほど難しくありません。
ANOVAの堅牢性
第一に、他の人が注目しているように、ANOVAは、特にほぼバランスの取れたデータ(各グループの観測数が等しい)がある場合、等分散の仮定からの偏差に対して驚くほど堅牢です。一方、等分散の予備検定はそうではありません(ただし、Leveneの検定は、教科書で一般的に教えられているF検定よりもはるかに優れています)。ジョージ・ボックスが言ったように:
変動の予備テストを行うことは、手linerぎボートに乗って海に出て、オーシャンライナーが港を出るのに十分穏やかな状態であるかどうかを調べるようなものです!
ANOVAは非常に堅牢ですが、不均一性を考慮に入れるのは非常に簡単ですが、そうしない理由はほとんどありません。
ノンパラメトリック検定
meanの違いに本当に興味がある場合、ノンパラメトリック検定(Kruskal–Wallis検定など)は実際には役に立ちません。それらはグループ間の違いをテストしますが、一般的には手段の違いをテストしません。
サンプルデータ
ANOVAを使用したいが、分散が等しいという仮定が正しくないデータの簡単な例を生成してみましょう。
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)
3つのグループがあり、平均と分散の両方に(明確な)違いがあります。
stripchart(x ~ group, data=d)
分散分析
当然のことながら、通常のANOVAはこれを非常にうまく処理します。
> 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
Pの 0.26 -値、我々は、グループAとBの間の(平均の)任意の違いを主張することはできませんそして、私たちがしてもいなかった私たちは3つの比較をしたことを考慮し、我々は低得ないでしょう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()
不等分散の2つのサンプルの(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の違いに関する情報を実際には追加しないことに注意してください。多重比較のために修正されたペアワイズt検定を使用することもできます。
> 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(一般化最小二乗法)を使用し、分散関数を明示的にモデリングするのが最適なソリューションです。
そして、分散関数は単に各グループで異なる定数である必要はありません。構造を課すことができます。たとえば、各グループの平均のべき乗として分散をモデル化できます(したがって、1つのパラメーター、指数のみを推定する必要があります)。これはすべてGLS(およびgls()
R)で非常に簡単です。
一般化最小二乗法は、IMHOの非常に不十分な統計モデリング手法です。モデルの仮定からの逸脱を心配する代わりに、それらの逸脱をモデル化してください!
R
私の回答を読むことは有益です。