ダネットの方法による多重比較 Last modified: Oct 22, 2012
目的
ダネットの方法による多重比較を行う。
R の multcomp ライブラリで,glht を使うという手もある(aov も使う)。
使用法
dunnett(data, group)
引数
data データベクトル
group 群変数ベクトル
ソース
インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/dunnett.R", encoding="euc-jp")
# ダネットの方法による多重比較
dunnett <- function( data, # データベクトル
group) # 群変数ベクトル
{
get.rho <- function(ni) # ρを計算する
{
k <- length(ni)
rho <- outer(ni, ni, function(x, y) { sqrt(x/(x+ni[1])*y/(y+ni[1])) })
diag(rho) <- 0
sum(rho[-1, -1])/(k-2)/(k-1)
}
pdunnett <- function(x, a, df, r) # P 値を計算する
{
corr <- diag(a-1)
corr[lower.tri(corr)] <- r
1-pmvt(lower=-x, upper=x, delta=numeric(a-1), df=df, corr=corr, abseps=0.0001)
}
OK <- complete.cases(data, group) # 欠損値を持つケースを除く
data <- data[OK]
group <- factor(group[OK]) # 群変数は factor に変換
ni <- table(group) # 各群のデータ数
a <- length(ni) # 群の数
n <- length(data) # 全体のデータ数
mi <- tapply(data, group, mean) # 各群の平均値
vi <- tapply(data, group, var) # 各群の不偏分散
Vw <- sum(vi*(ni-1))/(n-a) # 群内分散
rho <- get.rho(ni) # ρ
t <- (abs(mi-mi[1])/sqrt(Vw*(1/ni+1/ni[1])))[2:a] # 対照群と各群の比較における t 値
p <- sapply(t, pdunnett, a, n-a, rho) # P 値
result <- cbind(t, p)
rownames(result) <- paste(1, 2:a, sep=":")
return(result)
}
使用例
data <- c(
14, 15, 14, 16, 15, 17, 17, # 第 1 群(対照群)のデータ,7 例
17, 16, 17, 16, 15, 18, 19, 15, # 第 2 群(処理群)のデータ,8 例
18, 19, 20, 19, 17, 17, # 第 3 群(処理群)のデータ,6 例
20, 21, 19, 20, 19, 22, 20, # 第 4 群(処理群)のデータ,7 例
19, 20, 19, 17, 17, 17, 18 # 第 5 群(処理群)のデータ,7 例
)
group <- rep(1:5, c(7, 8, 6, 7, 7)) # 群を表す数値
library(mvtnorm)
dunnett(data, group)
出力結果例
> library(mvtnorm) # mvtnorm を利用するために,R を起動するごとに必要
> dunnett(data, group)
t p
1:2 1.854090 2.156676e-01
1:3 4.187543 8.023633e-04
1:4 7.073685 5.706414e-08
1:5 4.072727 1.169213e-03
注:この dunnett 関数は,P 値を求めるために,pdnunnett 関数の中で pmvt 関数を呼んでいる。
pmvt 関数は乱数を発生させて P 値を求めているため,毎回の P 値は変わる。
大幅に変わるわけではなく,その精度も制御できる(現在は bseps=0.0001)としているが,
この数値を小さくすれば精度は高くなる。
しかし,P 値の性質上,むやみに精度を上げても意味はないし,計算時間もかかる。
# aov, glht を使う
> library(multcomp)
> factor.group <- factor(group)
> ans <- glht(aov(data~factor.group), linfct=mcp(factor.group="Dunnett"))
> summary(ans)
Simultaneous Tests for General Linear Hypotheses
Multiple Comparisons of Means: Dunnett Contrasts
Fit: aov(formula = data ~ factor.group)
Linear Hypotheses:
Estimate Std. Error t value Pr(>|t|)
2 - 1 == 0 1.1964 0.6453 1.854 0.21560
3 - 1 == 0 2.9048 0.6937 4.188 < 0.001 ***
4 - 1 == 0 4.7143 0.6665 7.074 < 0.001 ***
5 - 1 == 0 2.7143 0.6665 4.073 0.00115 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Adjusted p values reported -- single-step method)
解説ページ
直前のページへ戻る
E-mail to Shigenobu AOKI