ダネットの方法による多重比較     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

Made with Macintosh