分散・共分散行列の同等性の検定     Last modified: Aug 21, 2009

目的

分散・共分散行列の同等性の検定(Box の M 検定)を行う

使用法

BoxM(x, gvar)

引数

x      データ行列(データフレーム)
gvar   データ行列の各行がどのグループに属するかを表すベクトル(factor 化して使われる)

ソース

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

# 分散・共分散行列の同等性の検定
BoxM <- function(    x,                                              # データ行列(データフレーム)
                        gvar)                                           # 群を表す変数
{
        method <- "分散・共分散行列の同等性の検定"
        data.name <- paste(deparse(substitute(x)), "~", deparse(substitute(gvar)))
        x <- as.data.frame(x)
        nv <- ncol(x)                                                        # 変数の個数
        if (nv < 2) stop("分散共分散行列を計算する変数は2個以上必要です")
        gvar <- as.factor(gvar)
        ni <- table(gvar)                                            # 各群のサンプルサイズ
        n <- length(gvar)                                            # サンプルサイズ
        g <- length(ni)                                                      # 群の数
        y <- split(x, gvar)                                          # 群ごとに分割したデータ行列
        Si <- lapply(y, var)                                         # 分散共分散行列
        log.det.Si <- sapply(Si, function(x) log(det(x)))            # 行列式の対数値
        S <- sapply(y, function(x) (nrow(x)-1)*var(x))                       # 変動行列
        S <- matrix(rowSums(S), nv, nv)/(n-g)                                # プールした変動行列
        M <- (n-g)*log(det(S))-sum((ni-1)*log.det.Si)                        # Box の M 統計量
        f1 <- (g-1)*nv*(nv+1)/2                                              # 第 1 自由度
        rho <- 1-(2*nv^2+3*nv-1)/(6*(nv+1)*(g-1))*(sum(1/(ni-1))-1/(n-g))
        tau <- (nv-1)*(nv+2)/(6*(g-1))*(sum(1/(ni-1)^2)-1/(n-g)^2)
        f2 <- (f1+2)/abs(tau-(1-rho)^2)                                      # 第 2 自由度
        gamma <- (rho-f1/f2)/f1
        F <- M*gamma                                                 # F 値
        p <- pf(F, f1, f2, lower.tail=FALSE)                         # P 値
        return(structure(list(statistic=c(M=M, F=F),
                parameter=c(df1=f1, df2=f2), p.value=p,
                method=method, data.name=data.name), class="htest"))
}


使用例

> x <- matrix(c( # 1~3 列がデータ,4 列目はグループ
+ 	2.9, 161.7, 120.8, 1,
+ 	2.3, 114.8,  85.2, 1,
+ 	2.0, 128.4,  92.0, 1,
+ 	3.2, 149.2,  97.3, 1,
+ 	2.7, 126.0,  81.1, 1,
+ 	4.4, 133.8, 107.6, 1,
+ 	4.1, 161.3, 114.0, 1,
+ 	2.1, 111.5,  77.3, 1,
+ 	4.8, 198.7, 172.9, 2,
+ 	3.6, 199.3, 157.9, 2,
+ 	2.0, 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, 2
+ ), byrow=TRUE, ncol=4)
> 
> BoxM(x[,1:3], x[,4])

	分散・共分散行列の同等性の検定

data:  x[, 1:3] ~ x[, 4]
M = 9.7304, F = 1.1535, df1 = 6.000, df2 = 795.195, p-value = 0.3294

・ 解説ページ(2群の場合)


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

Made with Macintosh