X2検定

###########X2検定####################
#2*2のX2検定
matrix(c(14,110,97,44),ncol=2,byrow=T)
chisq.test(matrix(c(14,110,97,44),ncol=2,byrow=T))
chisq.test(table(a1,a3))
my.fisher(matrix(c(14,110,97,44),ncol=2,byrow=T))

#2*1のX2検定
chi<-c(14+44,110+97)
chisq.test(chi)
    #以下の式でも同じ
chisq.test(c(14+44,110+97))

オプションについて
correct=TRUE:イェーツの連続修正を行う


#前後(繰り返し)がある場合は以下の式を用いる。
mcnemar.test


0のセルがある場合や、5以下のセルが複数存在する場合は、フィッシャーの正確確率検定を行う。
理論度数が、5よりも低い度数を含む場合、または、データセットの周辺度数(行ごとの合計または列ごとの合計)がとても異なっている場合、Fisher’の正確検定に頼るのがよい方法です。
カイ2乗検定はFisherの正確検定よりも強力(帰無仮説が偽である場合、それをより棄却しやすい)です。

fisher.test(x)

###############X2検定Part2####################
#2×2 分割表において,フィッシャーの正確確率検定を行う。
#R には fisher.test があるが,この関数では fisher.test が計算する Fisher の方法による P 値と同時に,Pearson の方法による P 値も計算する(オッズ比を基準にするものも計算する)。

#使用法

my.fisher(x)

#引数
#x      2×2 分割表を表す,2×2 行列

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

# 2×2 分割表のフィッシャーの正確確率検定
my.fisher <- function(x)                                     # 2×2 分割表
{
        odds.ratio <- function(a, b, c, d)                   # オッズ比を求める関数
        {
                if (a*b*c*d == 0) {                             # セルのどれかが 0 の場合
                        a <- a+0.5                           # それぞれに 0.5 を加える
                        b <- b+0.5
                        c <- c+0.5
                        d <- d+0.5
                }
                res <- a*d/(b*c)                             # オッズ比
                return(max(res, 1/res))                         # どちらか大きい方を返す
        }

        stats <- function(i) {
                e <- (a <- i[1]) + (b <- i[2])
                f <- (c <- i[3]) + (d <- i[4])
                n <- (g <- a+c) + (h <- b+d)
                return(c(n*(a*d-b*c)^2/(e*f*g*h),               # カイ二乗値
                         odds.ratio(a, b, c, d),                # オッズ比
                         exp(lchoose(e, a)+lchoose(f, c)-lchoose(n, g))))       # 生起確率
        }

        ct <- colSums(x)                                     # 列和
        rt <- rowSums(x)                                     # 行和
        n <- sum(x)                                          # 総合計
        mx <- min(rt[1], ct[1])                                      # a が取り得る最大値
        mi <- max(0, rt[1]+ct[1]-n)                          # a が取り得る最小値
        A <- mi:mx                                           # a のベクトル
        B <- rt[1]-A                                         # b のベクトル
        C <- ct[1]-A                                         # c のベクトル
        D <- ct[2]-B                                         # d のベクトル
        Cell <- cbind(A, B, C, D)                            # 行方向の 4 つの数値が一つの分割表
        result<-apply(Cell, 1, stats)                                # 行方向の 4 つの数値に,stats 関数を適用
        Chi.sq <- result[1,]                                 # カイ二乗値ベクトル
        OddsRatio <- result[2,]                                      # オッズ比ベクトル
        Probability <- result[3,]                            # 生起確率ベクトル
        Cum.Prob1 <- cumsum(Probability)                     # 生起確率の累積和
        Cum.Prob2 <- rev(cumsum(rev(Probability)))           # 逆方向からの生起確率の累積和
        Pearson <- Chi.sq >= stats(c(x))[1]-1e-15            # カイ二乗値から判定した P 値に算入すべきセル
        Fisher <- Probability <= stats(c(x))[3]+1e-15             # フィッシャーの定義による P 値に算入すべきセル
        OR <- OddsRatio >= stats(c(x))[2]-1e-15                      # オッズ比から判定した P 値に算入すべきセル
        p.Pearson <- sum(Probability[Pearson])                       # カイ二乗値から判定した P 値
        p.Fisher <- sum(Probability[Fisher])                 # フィッシャーの定義による P 値
        p.OR <- sum(Probability[OR])                         # オッズ比から判定した P 値
        return(list(result=cbind(Cell, Chi.sq, Probability, OddsRatio, Pearson, Fisher, OR, Cum.Prob1, Cum.Prob2), p.Pearson=p.Pearson, p.Fisher=p.Fisher, p.OR=p.OR))
}


#使用例

my.fisher(matrix(c(10, 13, 16, 61), nc=2, byrow=TRUE))

#出力結果例

> my.fisher(matrix(c(10, 13, 16, 61), nc=2, byrow=TRUE))

# 一行がそれぞれ,可能な2×2分割表
# A, B, C, D は各セルの値
# Chi.sq は,カイ二乗値(連続性の修正なし)
# Probability は,分割表の生起確率
# Pearson は,カイ二乗値が観察された分割表のカイ二乗値以上の場合に 1 を取る(Pearson の基準による)
# Fisher は,生起確率が観察された分割表の生起確率以下の場合に 1 を取る(Fisher の基準による)
# Cum.Prob1, Cum.Prob2 は両端からの累積確率(片側検定の時に利用できる)

コメント

このブログの人気の投稿

subsetで必要なデータだけを、取り出す。

Googleフォームの使い方(基本編)

Rでの、データの基礎統計量の算出(summary,describe)

Googleフォーム使い方(応用編) 回答に応じて分岐、セッションの移動

Googleフォームの使い方(応用編) 設定の使い方