ダネットの方法による多重比較     Last modified: Oct 27, 2009

目的

ダネットの方法による多重比較を行う。

R の multcomp ライブラリで,simtest(formula, type="Dunnett") を使うという手もある。
同時に,simtest(formula, type="Williams") もチェックのこと。
注:multcomp の中には simtest はなくなった(少なくとも R 2.10.0 では)

使用法

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 値の性質上,むやみに精度を上げても意味はないし,計算時間もかかる。

multcomp の中には simtest はなくなった(少なくとも R 2.10.0 では)

SimComp の中の SimTestDiff が該当するのかな(シミュレーションによる検定なので,上の dunnett 関数の結果とはずいぶん違う)

> 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))     # 群を表す数値
> d <- data.frame(data=data, group=factor(group))
> library(SimComp)
> SimTestDiff(d, "group", "data", type="Dunnett")
 
Test for differences of means of multiple endpoints 
Assumption: Heterogeneous covariance matrices for the groups 
Alternative hypotheses: True differences not equal to the margins 
 
  comparison endpoint margin estimate statistic p.value.raw p.value.adj
1      2 - 1     data      0    1.196     1.729      0.1076      0.2927
2      3 - 1     data      0    2.905     4.211      0.0015      0.0057
3      4 - 1     data      0    4.714     7.505      0.0000      0.0000
4      5 - 1     data      0    2.714     4.082      0.0015      0.0061
 
> SimTestDiff(d, "group", "data", type="Williams")
 
Test for differences of means of multiple endpoints 
Assumption: Heterogeneous covariance matrices for the groups 
Alternative hypotheses: True differences not equal to the margins 
 
  comparison endpoint margin estimate statistic p.value.raw p.value.adj
1        C 1     data      0    2.714     4.082      0.0015      0.0040
2        C 2     data      0    3.714     6.517      0.0000      0.0001
3        C 3     data      0    3.471     6.347      0.0001      0.0001
4        C 4     data      0    2.821     5.275      0.0005      0.0011

・ 解説ページ


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh