分散・共分散行列の同等性の検定 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