各処理群ごとに,対照群と平均値に差があるかどうかの検定のみに関心がある場合には,ダネットの方法(Dunnett 1955,1964)が有効である。しかし,あらゆる平均値の比較を行う場合には,最初から対比較・線形比較を用いるべきである。
例題:
「5 種類の飼料で飼育した魚の体長の平均値が表 1 のようであった。飼料 A 〜飼料 D のそれぞれを対照群と比較して平均値に差があるといえいるか,有意水準 5% で検定しなさい。」
匹数 | 平均値 | 不偏分散 | |
---|---|---|---|
対照群 | 20 | 25.7 | 2.5 |
飼料 A | 20 | 35.6 | 5.6 |
飼料 B | 20 | 32.7 | 4.6 |
飼料 C | 20 | 29.4 | 4.9 |
飼料 D | 20 | 27.9 | 3.7 |
全体 | 100 | 30.26 | 16.53 |
検定手順:
\[ \left | \bar{X}_t - \bar{X}_c \right | \pm d \sqrt{V_w}\ \sqrt{\frac{1}{n_t}+\frac{1}{n_c}} \]
例題の解:
> n.i <- rep(20, 5) > Mean.i <- c(25.7, 35.6, 32.7, 29.4, 27.9) > Var.i <- c(2.5, 5.6, 4.6, 4.9, 3.7) > k <- length(n.i) > n <- sum(n.i) > Mean <- sum(n.i*Mean.i)/n > Sb <- sum(n.i*(Mean.i-Mean)^2) > Sw <- sum((n.i-1)*Var.i) > St <- (Sb+Sw)/(n-1) > dfb <- k-1 > dfw <- n-k > Vb <- Sb/dfb > Vw <- Sw/dfw > F <- Vb/Vw > P <- pf(F, dfb, dfw, lower.tail=FALSE) > Ps <- format.pval(P) > cat(sprintf("F = %.5f(%i, %i), P %s%s\n", F, dfb, dfw, ifelse(substring(Ps, 1, 1)=="<", "", "="), Ps)) F = 72.26761(4, 95), P < 2.22e-16
> Vw [1] 4.26 > dfw [1] 95
> nu.a <- 60 > a <- 2.51 > nu.c <- 120 > c <- 2.47 > nu.b <- 95 > d <- a-(a-c)*(1/nu.a-1/nu.b)/(1/nu.a-1/nu.c) > d [1] 2.480526
> diff <- abs(Mean.i[2:5]-Mean.i[1]) > SE <- sqrt(Vw)*sqrt(1/n.i[2:5]+1/n.i[1]) > lower <- diff-d*SE > upper <- diff+d*SE > data.frame(diff, lower, upper) diff lower upper 1 9.9 8.2809933 11.519007 2 7.0 5.3809933 8.619007 3 3.7 2.0809933 5.319007 4 2.2 0.5809933 3.819007
比較する群 | 平均値の差 | 95% 信頼区間 | 判定 |
---|---|---|---|
飼料 A | 9.9 | [ 8.280993 ,11.51901 ] | 有意な差である |
飼料 B | 7.0 | [ 5.380993 ,8.619007 ] | 有意な差である |
飼料 C | 3.7 | [ 2.080993 ,5.319007 ] | 有意な差である |
飼料 D | 2.2 | [ 0.580993 ,3.819007 ] | 有意な差である |
[R による計算プログラム]によれば,
> # データを再現する(本当のデータではないが,平均値,不偏分散は表 1 に示されたものと同じになる) > n.i <- rep(20, 5) > Mean.i <- c(25.7, 35.6, 32.7, 29.4, 27.9) > Var.i <- c(2.5, 5.6, 4.6, 4.9, 3.7) > data <- mapply(function(n, v, m) c(scale(rnorm(n))*sqrt(v)+m), n.i, Var.i, Mean.i) > data [,1] [,2] [,3] [,4] [,5] [1,] 27.44489 36.03663 32.32625 28.82010 29.34327 [2,] 25.17521 38.90546 33.38308 30.33822 28.04991 [3,] 24.39793 34.59178 30.53276 26.72185 27.96165 [4,] 28.55847 38.04829 29.87004 30.91803 28.49038 [5,] 26.01307 33.39172 31.55247 29.00199 26.73114 [6,] 24.07109 33.36879 34.25772 29.05738 30.69118 [7,] 24.78360 33.65421 33.11500 29.63991 29.62892 [8,] 22.75709 31.76294 36.17742 28.82967 25.76821 [9,] 26.01198 34.00233 30.27184 26.70152 27.92164 [10,] 25.99516 40.20536 32.26772 31.04629 27.66308 [11,] 27.39708 34.78678 37.57392 29.97032 27.74809 [12,] 26.00918 38.86186 32.11273 24.23982 30.63102 [13,] 26.96409 35.71035 33.68013 31.98496 26.00846 [14,] 24.64677 34.75720 33.60452 28.63074 29.41766 [15,] 24.48767 36.27121 34.97363 30.28508 28.07175 [16,] 25.24359 33.39627 32.17666 30.46506 27.44650 [17,] 28.83124 38.18133 34.24452 27.95919 30.48866 [18,] 25.24484 32.64976 28.93742 27.10572 27.96583 [19,] 26.30222 37.41242 30.72537 32.77763 24.26720 [20,] 23.66484 36.00534 32.21679 33.50652 23.70544 > apply(data, 2, mean) [1] 25.7 35.6 32.7 29.4 27.9 > apply(data, 2, var) [1] 2.5 5.6 4.6 4.9 3.7 > data2 <- c(data) > data2 [1] 27.44489 25.17521 24.39793 28.55847 26.01307 24.07109 24.78360 22.75709 26.01198 [10] 25.99516 27.39708 26.00918 26.96409 24.64677 24.48767 25.24359 28.83124 25.24484 [19] 26.30222 23.66484 36.03663 38.90546 34.59178 38.04829 33.39172 33.36879 33.65421 [28] 31.76294 34.00233 40.20536 34.78678 38.86186 35.71035 34.75720 36.27121 33.39627 [37] 38.18133 32.64976 37.41242 36.00534 32.32625 33.38308 30.53276 29.87004 31.55247 [46] 34.25772 33.11500 36.17742 30.27184 32.26772 37.57392 32.11273 33.68013 33.60452 [55] 34.97363 32.17666 34.24452 28.93742 30.72537 32.21679 28.82010 30.33822 26.72185 [64] 30.91803 29.00199 29.05738 29.63991 28.82967 26.70152 31.04629 29.97032 24.23982 [73] 31.98496 28.63074 30.28508 30.46506 27.95919 27.10572 32.77763 33.50652 29.34327 [82] 28.04991 27.96165 28.49038 26.73114 30.69118 29.62892 25.76821 27.92164 27.66308 [91] 27.74809 30.63102 26.00846 29.41766 28.07175 27.44650 30.48866 27.96583 24.26720 [100] 23.70544 > group <- rep(1:5, each=20) > group [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 [42] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 [83] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 > library(mvtnorm) > dunnett(data2, group) # P 値は実行のたびに少し変化する t p 1:2 15.168072 0.000000e+00 1:3 10.724900 0.000000e+00 1:4 5.668876 1.010806e-06 1:5 3.370683 4.062457e-03
multcomp の glht を使う場合
> library(multcomp) > factor.group <- factor(group) > ans <- glht(aov(data2~factor.group), linfct=mcp(factor.group="Dunnett"), abseps=0.0001) > summary(ans) # P 値は実行のたびに少し変化する Simultaneous Tests for General Linear Hypotheses Multiple Comparisons of Means: Dunnett Contrasts Fit: aov(formula = data2 ~ factor.group) Linear Hypotheses: Estimate Std. Error t value Pr(>|t|) 2 - 1 == 0 9.9000 0.6527 15.168 < 0.001 3 - 1 == 0 7.0000 0.6527 10.725 < 0.001 4 - 1 == 0 3.7000 0.6527 5.669 < 0.001 5 - 1 == 0 2.2000 0.6527 3.371 0.00411 (Adjusted p values reported -- single-step method)
演習問題:
応用問題: