一元配置分散分析(二次データ) Last modified: Aug 25, 2015
目的
二次データに基づいて,一元配置分散分析を行う。
注: 一次データが利用できる場合には,R に本来用意されている oneway.test を使うことができる
使用法
my.oneway.ANOVA(n, m, u, var.equal=FALSE)
summary.my.oneway.ANOVA(obj, digits=5)
引数
n 各群のデータ個数のベクトル
m 各群の平均値のベクトル
u 各群の不偏分散のベクトル
var.equal 各群の分散が等しいと仮定するとき TRUE
各群の分散が等しいと仮定しないとき FALSE
デフォルトは FALSE
obj my.oneway.ANOVA が返すオブジェクト
digits 表示桁数
ソース
インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/my_oneway_ANOVA.R", encoding="euc-jp")
# 二次データに基づき,一元配置分散分析を行う
my.oneway.ANOVA <- function( n, # サンプルサイズ
m, # 平均値
u, # 不偏分散
var.equal=FALSE) # 等分散を仮定するとき TRUE
{
data.name <- sprintf("%s for sample sizes, %s for means and %s for variances",
deparse(substitute(n)), deparse(substitute(m)), deparse(substitute(u)))
ng <- length(n) # 群の数
stopifnot(ng > 1, length(m) == ng, length(u) == ng, n > 1, floor(n) == n, u > 0)
if (var.equal) { # 分散が等しいと仮定する場合
method <- "二次データに基づく一元配置分散分析(分散が等しいと仮定する場合)"
nc <- sum(n) # 全サンプルサイズ
sw <- sum(u*(n-1)) # 群内変動
sb <- sum(n*(m-sum(n*m)/nc)^2) # 群間変動
ss <- c(sb, sw, sb+sw) # 平方和(変動)
df <- c(ng-1, nc-ng, nc-1) # 自由度
ms <- ss/df # 平均平方
f <- p <- rep(NA, 3)
f[1] <- ms[1]/ms[2] # F 値
p[1] <- pf(f[1], df[1], df[2], lower.tail = FALSE) # P 値
anova.table <- cbind(ss, df, ms, f, p) # 分散分析表
colnames(anova.table) <- c("平方和", "自由度", "平均平方", "F 値", "P 値")
rownames(anova.table) <- c("群間", "群内", "合計")
return(structure(list(statistic=c(F=f[1]), parameter=c("num df"=df[1], "denom df"=df[2]),
p.value=p[1], method=method, data.name=data.name, anova.table=anova.table),
class=c("htest", "my.oneway.ANOVA")))
}
else { # 分散が等しいと仮定しない場合(R ではこちらがデフォルト)
method <- "二次データに基づく一元配置分散分析(分散が等しいと仮定しない場合)"
w <- n/u
sum.w <- sum(w)
m0 <- sum(w*m)/sum.w
temp <- sum((1-w/sum.w)^2/(n-1))/(ng^2-1)
f <- sum(w*(m-m0)^2)/((ng-1)*(1+2*(ng-2)*temp)) # F 値
df1 <- ng-1
df2 <- 1/(3*temp)
p <- pf(f, df1, df2, lower.tail=FALSE) # P 値
return(structure(list(statistic=c(F=f), parameter=c("num df"=df1, "denom df"=df2), p.value=p,
method=method, data.name=data.name), class="htest"))
}
}
# summary メソッド(分散分析表の表示。ただし,等分散を仮定するときのみ)
summary.my.oneway.ANOVA <- function ( obj,
digits=5)
{
print(obj$anova.table, na.print="", digits=digits)
}
使用例
> n <- c(8, 11, 22, 6)
> m <- c(135.83, 160.49, 178.35, 188.06)
> SD <- c(19.59, 12.28, 15.01, 9.81)
> (a <- my.oneway.ANOVA(n, m, SD^2, var.equal=TRUE)) # 分散が等しいと仮定する場合
二次データに基づく一元配置分散分析(分散が等しいと仮定する場合)
data: n for sample sizes, m for means and SD^2 for variances
F = 20.8282, num df = 3, denom df = 43, p-value = 1.737e-08
> summary(a) # summary メソッドで分散分析表を表示できる
平方和 自由度 平均平方 F 値 P 値
群間 13669.4 3 4556.47 20.828 1.7375e-08
群内 9406.8 43 218.76
合計 23076.2 46 501.66
> my.oneway.ANOVA(n, m, SD^2) # 分散が等しいと仮定しない場合
二次データに基づく一元配置分散分析(分散が等しいと仮定しない場合)
data: n for sample sizes, m for means and SD^2 for variances
F = 17.5646, num df = 3.000, denom df = 16.504, p-value = 2.192e-05
解説ページ
直前のページへ戻る
E-mail to Shigenobu AOKI