ボンフェローニの方法および関連する手法による平均値の多重比較 Last modified: Aug 05, 2004
目的
ボンフェローニの方法,ホルムの方法,シェイファーの方法,ホランド・コペンハーバーの方法による多重比較を行う。
使用法
Bonferroni(data, group, method="Bonferroni", "Holm", "Shaffer", "Holland-Copenhaver"), alpha=0.05)
引数
data 観察値ベクトル
group 群変数ベクトル
method 有意水準の調整方法。標準値は Bonferroni。
alpha 有意水準(デフォールトは 0.05)
ソース
インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/Bonferroni.R", encoding="euc-jp")
# ボンフェローニの方法および関連する手法による多重比較
Bonferroni <- function( data, # 観察値ベクトル
group, # 群変数ベクトル
method=c("Bonferroni", "Holm", "Shaffer", "Holland-Copenhaver"),
# ボンフェローニ,ホルム,シェーファー,ホランド・コペンハーバー
alpha=0.05) # 有意水準
{
OK <- complete.cases(data, group) # データと群変数がともに欠損値ではないデータを抽出する
data <- data[OK]
group <- factor(group[OK])
method <- match.arg(method) # method に与えられた略語による指定を補完する
# ボンフェローニ法 Bonferroni
n <- table(group) # 各群のデータ数
a <- length(n) # 群の数
k <- a*(a-1)/2 # 2 群の総当たり数
m <- tapply(data, group, mean) # 各群の平均値
v <- tapply(data, group, var) # 各群の不偏分散
phi <- length(data)-a # 自由度
V <- sum((n-1)*tapply(data, group, var))/phi # 誤差分散
t <- combn(a, 2, function(ij) abs(diff(m[ij]))/sqrt(sum(V/n[ij]))) # abs(m[i]-m[j])/sqrt(V*(1/n[i]+1/n[j])))
P <- pt(t, phi, lower.tail=FALSE)*2 # P 値を計算
result1 <- cbind("n"=n, "mean"=m, "variance"=v) # 各群の,標本サイズ,平均値,不偏分散
rownames(result1) <- paste("Group", 1:a, sep="") # 表側を作る
result2 <- cbind("t value"=t, "P value"=P) # 二群の比較結果の,t 値,P 値
rownames(result2) <- combn(a, 2, paste, collapse=":") # 表側を作る
if (method == "Bonferroni") { # ボンフェローニ法 Bonferroni のとき,
P.threshold <- alpha/k # P 値の限界値と,
judge <- result2[,2] <= P.threshold # 判定(有意のときには 1,有意でないときには 0 が表示される)
}
else { # ボンフェローニ法以外のとき
result2 <- result2[order(result2[,2]),]
if (method != "Holm" && a > 9) { # ホルムの方法以外で,群数が 9 より大きいときには対応できないのでホルムの方法にする
warning("Too many groups. Use Holm.")
method = "Holm"
}
if (method == "Holm") { # ホルムの方法 Holm のとき
P.threshold <- alpha/(k:1) # P 値の限界値を設定
}
else {
h <- c(3,1,1, 6,rep(3,3),2,1, 10,rep(6,4),4,4:1, 15,rep(10,5),rep(7,3),6,4,4:1,
21,rep(15,6),rep(11,4),10,9,7,7:1, 28,rep(21,7),rep(16,5),15,13,13:1,
36,rep(28,8),rep(22,6),21,rep(18,3),16,16,15,13,13:1)[(a*(a-1)*(a-2)/6):((a^3-a)/6-1)]
P.threshold <- if (method == "Shaffer") alpha/h else 1-(1-alpha)^(1/h) # P 値の限界値を設定
}
judge <- cumprod(result2[,2] <= P.threshold) != 0 # 判定(有意のときには 1,有意でないときには 0 が表示される)
if (method == "Holm" || method == "Shaffer" || method == "Holland-Copenhaver") {
min.pos <- which.min(judge) # 途中で有意でないものが出てきたら,それ以降は全て結果を保留
if (judge[min.pos] == 0) { # 初めて出てくる 0 の位置
judge[min.pos:k] <- NA # 保留を表すという意味で NA を代入
}
}
}
result2 <- cbind(result2, # 結果の追加
"P threshold"=P.threshold, "judge"=judge)
return(list(method=method, alpha=alpha, n.of.tests=k, result2=result2,
remark="judge=1 significant, judge=0 not significant, judge=NA suspend", result1=result1, phi=phi, V=V))
}
使用例
data <- c(
10.7, 9.7, 8.5, 9.4, 8.8, 8.4, 10.6, # 第 1 群のデータ,7 例
8.1, 8.3, 8.7, 6.9, 5.7, 9.5, 6.7, # 第 2 群のデータ,7 例
7.9, 7.5, 7.4, 9.2, 5.7, 8.3, 9.7, # 第 3 群のデータ,7 例
6.2, 7.1, 5.5, 4.7, 6.3, 6.9, 7.5 # 第 4 群のデータ,7 例
)
group <- rep(1:4, each=7) # 群を表す数値
Bonferroni(data, group) # ボンフェローニの方法
Bonferroni(data, group, method="Holm") # ホルムの方法
Bonferroni(data, group, method="Shaffer") # シェイファーの方法
Bonferroni(data, group, method="Holland-Copenhaver") # ホランド・コペンハーバーの方法
出力結果例
> Bonferroni(data, group) # ボンフェローニの方法
$method
[1] "Bonferroni"
$alpha
[1] 0.05
$n.of.tests
[1] 6
$result2
t value P value P threshold judge
1:2 2.8351656 9.148816e-03 0.008333333 0
1:3 2.4168625 2.362029e-02 0.008333333 0
1:4 5.0893546 3.315126e-05 0.008333333 1
2:3 0.4183031 6.794449e-01 0.008333333 0
2:4 2.2541890 3.358738e-02 0.008333333 0
3:4 2.6724921 1.331927e-02 0.008333333 0
$remark
[1] "judge=1 significant, judge=0 not significant, judge=NA suspend"
$result1
n mean variance
Group1 7 9.442857 0.8961905
Group2 7 7.700000 1.7333333
Group3 7 7.957143 1.7195238
Group4 7 6.314286 0.9414286
$phi
[1] 24
$V
[1] 1.322619
> Bonferroni(data, group, method="Holm") # ホルムの方法
$method
[1] "Holm"
: 中略
$result2
t value P value P threshold judge
1:4 5.0893546 3.315126e-05 0.008333333 1
1:2 2.8351656 9.148816e-03 0.010000000 1
3:4 2.6724921 1.331927e-02 0.012500000 NA
1:3 2.4168625 2.362029e-02 0.016666667 NA
2:4 2.2541890 3.358738e-02 0.025000000 NA
2:3 0.4183031 6.794449e-01 0.050000000 NA
: 後略
> Bonferroni(data,group, method="Shaffer") # シェイファーの方法
$method
[1] "Shaffer"
: 中略
$result2
t value P value P threshold judge
1:4 5.0893546 3.315126e-05 0.008333333 1
1:2 2.8351656 9.148816e-03 0.016666667 1
3:4 2.6724921 1.331927e-02 0.016666667 1
1:3 2.4168625 2.362029e-02 0.016666667 NA
2:4 2.2541890 3.358738e-02 0.025000000 NA
2:3 0.4183031 6.794449e-01 0.050000000 NA
: 後略
> Bonferroni(data,group, method="Holland-Copenhaver") # ホランド・コペンハーバーの方法
$method
[1] "Holland-Copenhaver"
: 中略
$result2
t value P value P threshold judge
1:4 5.0893546 3.315126e-05 0.008512445 1
1:2 2.8351656 9.148816e-03 0.016952428 1
3:4 2.6724921 1.331927e-02 0.016952428 1
1:3 2.4168625 2.362029e-02 0.016952428 NA
2:4 2.2541890 3.358738e-02 0.025320566 NA
2:3 0.4183031 6.794449e-01 0.050000000 NA
: 後略
参考文献
永田靖・吉田道弘(1997)「統計的多重比較法の基礎」サイエンティスト社
直前のページへ戻る
E-mail to Shigenobu AOKI