多変量に拡張された平均値の差の検定(ウィルクスのΛ)     Last modified: Aug 21, 2009

目的

多変量に拡張された平均値の差の検定(ウィルクスのΛ)を行う
rrcov の Wilks.test は,method != "mcd" のときにはいつの場合にも「それ以外の場合」のカイ二乗近似を使うようだ

使用法

wilks(dat, g)

引数

dat	データ行列
g	群分け変数

ソース

インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/wilks.R", encoding="euc-jp")

# 多変量に拡張された平均値の差の検定(ウィルクスのΛ)
wilks <- function(   dat,                                    # データ行列
                        g)                                      # 群変数
{
        method <- "多変量に拡張された平均値の差の検定(ウィルクスのΛ)"
        data.name <- paste(deparse(substitute(dat)), "~", deparse(substitute(g)))
        OK <- complete.cases(dat, g)                         # 欠損値を持つケースを除く
        dat <- dat[OK,]
        g <- as.factor(g[OK])
        nv <- ncol(dat)                                              # 変数の個数
        g.case <- table(g)                                   # 各群のケース数
        n <- sum(g.case)                                     # 全ケース数
        k <- length(g.case)                                  # 群の個数

        vars <- by(dat, g, function(x) var(x)*(nrow(x)-1))   # 各群の変動・共変動行列
        w <- matrix(rowSums(mapply("+", vars)), nv)          # 群内変動・共変動行列
        t <- (var(dat)*(n-1))                                        # 全変動・共変動行列

        LAMBDA <- det(w)/det(t)
        sl <- sqrt(LAMBDA)
        if (nv == 2) {                                          # 2 変数データの場合
                f <- (1-sl)*(n-k-1)/sl/(k-1)
                p <- pf(f, df1 <- 2*(k-1), df2 <- 2*(n-k-1), lower.tail=FALSE)
                result <- list(statistic=c("F value"=f), parameter=c("df1"=df1, "df2"=df2))
        }
        else if (k == 2) {                                      # 2 群の場合
                f <- (1-LAMBDA)*(n-k-nv+1)/LAMBDA/nv
                p <- pf(f, nv, df2 <- n-k-nv+1, lower.tail=FALSE)
                result <- list(statistic=c("F value"=f), parameter=c("df1"=nv, "df2"=df2))
        }
        else if (k == 3) {                                      # 3 群の場合
                f <- (1-sl)*(n-k-nv+1)/sl/nv
                p <- pf(f, df1 <- 2*nv, df2 <- 2*(n-k-nv+1), lower.tail=FALSE)
                result <- list(statistic=c("F value"=f), parameter=c("df1"=df1, "df2"=df2))
        }
        else {                                                  # それ以外の場合
                chi.sq <- ((nv+k)/2-n+1)*log(LAMBDA)
                p <- pchisq(chi.sq, df <- nv*(k-1), lower.tail=FALSE)
                result <- list(statistic=c("chi sq. value"=chi.sq), parameter=c("df"=df))
        }
        return(structure(c(result, p.value=p, method=method, data.name=data.name), class="htest"))
}


使用例

> dat <- matrix(c(
+ 	1, 2.9, 161.7, 120.8,
+ 	1, 2.3, 114.8, 85.2,
+ 	1, 2, 128.4, 92,
+ 	1, 3.2, 149.2, 97.3,
+ 	1, 2.7, 126, 81.1,
+ 	1, 4.4, 133.8, 107.6,
+ 	1, 4.1, 161.3, 114,
+ 	1, 2.1, 111.5, 77.3,
+ 	2, 4.8, 198.7, 172.9,
+ 	2, 3.6, 199.3, 157.9,
+ 	2, 2, 188.4, 152.7,
+ 	2, 4.9, 183.6, 164.2,
+ 	2, 3.9, 173.5, 172.2,
+ 	2, 4.4, 184.9, 163.2
+ ), byrow=TRUE, ncol=4)
> 
> wilks(dat[, 2:4], dat[, 1])

	多変量に拡張された平均値の差の検定(ウィルクスのΛ)

data:  dat[, 2:4] ~ dat[, 1] 
F value = 33.805, df1 = 3, df2 = 10, p-value = 1.517e-05

・ 解説ページ


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

Made with Macintosh