目的 二次データに基づいて,一元配置分散分析を行う。 注: 一次データが利用できる場合には,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 解説ページ