一元配置分散分析(二次データ)     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

Made with Macintosh