スタートページJavaScript他言語R言語

分割表の検定  chisq.test、fisher.test


2×2分割表の検定

下はある質問の賛成比率です。男性と女性により賛成比率に差があるかを検討したいのです、

       賛成  反対
   男性    40(a)  10(b)
   女性     4(c)  16(d)

このような問題を「2×2分割表の検定」といいます。

考え方
  p1(男性の賛成/反対比率)= 40/10 = 4
  p2(女性の賛成/反対比率)= 4/16 = 0.25
p1/p2 = 4/9,25 = 16 これを odds という。
  この p1/p2 が1に近ければ「差がない」といえます。
それには、
  対立仮説:p1/p2 ≠ 1 比率に差がある
  帰無仮説:p1/p2 = 1 比率に差がない
として、P値を求め
、   P<0.05 帰無仮説の発生確率は低い→差があるといえる。
  P>0.05 帰無仮説の発生確率はかなりある→差があると決めつけられない。
   とすればよいのです。

すなわち、「2×2分割表の検定」とは、上の表の a~dのデータからPを計算することです。

それには、カイ2乗検定(chisq.test)とフィッシャーの正確確率検定(fisher.test)があります。
chisq.test は、χ2を計算してχ2からP値を算出します。χ2を介するために正確度が劣ります。
それに対して、fisher.test は直接にP値を計算します、精度はよいのですが、複雑な計算を伴うので大規模な問題には非効率です(2×2では問題はありませんが)。
なお、2×2分割表では、横・縦の合計がわかっているならば、a~dの1つを決めれば他の値も決まります。自由に値を決められるのは1つだけなので、自由度は1になります。

chisq.test

       賛成  反対
   男性     40     10
   女性      4     16
男性と女性により賛成比率に差があるか
chisq.test(matrix(c(40,10, 4,16), nrow=2, byrow=T))
    #           男性 ┘     └ 女性

    #   Pearson's Chi-squared test with Yates' continuity correction
    #  data:  matrix(c(40, 10, 4, 16), nrow = 2, byrow = T)
    # X-squared = 19.533, df = 1, p-value = 9.888e-06 < 0.05 帰無仮説は棄却→差がある
    #

fisher.test

〓〓〓 上の問題(明らかに差がある例)

fisher.test(matrix(c(40,10, 4,16), nrow=2, byrow=T))

    #   Fisher's Exact Test for Count Data
    # data:  matrix(c(40, 10, 4, 16), nrow = 2, byrow = T)
    # p-value = 4.719e-06   < 0.05 帰無仮説は棄却→差がある
    # alternative hypothesis: true odds ratio is not equal to 1
    #     ↑                         └ = ad/cb = p1/p2
    #     └ 対立仮説:p1/p2 ≠ 1 比率に差がある
    #     ⇔ 帰無仮説:p1/p2 = 1 比率に差がない
    # 95 percent confidence interval: odds(p1/p2) の95%信頼区間
    #  3.84091   76.66866   4/9,25 = 16 はこの範囲に入っている ★
    #  信頼下限 信頼上限
    # sample estimates:
    # odds ratio 
    #  15.16792  標本から計算した p1/p2

    # chisq.test より fisher.test のほうが得られる情報が多い

# 〓〓〓 差がないと明らかな例)

  #     賛成  反対
  # 男性     26     24
  # 女性     10     10
    # odds = p1/p2 = ad/cb = (26*10)/(10*24) = 1.08


fisher.test(matrix(c(26,24, 10,10), nrow=2, byrow=T))

    #   Fisher's Exact Test for Count Data
    # data:  matrix(c(26, 24, 10, 10), nrow = 2, byrow = T)
    # p-value = 1   > 0.05 帰無仮説は棄却されない→差があるとはいえない ★
    # alternative hypothesis: true odds ratio is not equal to 1
    # 95 percent confidence interval: odds(p1/p2) の95%信頼区間
    #  0.3370891 3.4775463   1,08 はこの範囲に入っている
    #  信頼下限 信頼上限
    # sample estimates:
    # odds ratio 
    #  1.082094  標本から計算した odds

# 〓〓〓 男性のほうが賛成比率が大だといえるか(上側検定)

fisher.test(matrix(c(40,10, 4,16), nrow=2, byrow=T), alternative="g")

    #   Fisher's Exact Test for Count Data
    # data:  matrix(c(40, 10, 4, 16), nrow = 2, byrow = T)
    # p-value = 4.719e-06 < 0.05 →大だといえる ★
    # alternative hypothesis: true odds ratio is greater than 1
    # 95 percent confidence interval:
    # 4.586901      Inf
    # sample estimates:
    # odds ratio 
    #  15.16792 

# 〓〓〓 男性のほうが賛成比率が小だといえるか(下側検定)

fisher.test(matrix(c(40,10, 4,16), nrow=2, byrow=T), alternative="l")

    #   Fisher's Exact Test for Count Data
    # data:  matrix(c(40, 10, 4, 16), nrow = 2, byrow = T)
    # p-value = 1       < 0.05 →大だとはいえない ★
    # alternative hypothesis: true odds ratio is greater than 1
    # 95 percent confidence interval:
    #   0.00000 59.63688
    # sample estimates:
    # odds ratio 
    #  15.16792 

2変数の独立性検定

    # ケースA
    # matrix(c(10, 12,  8, 14, 12,     計算による理論値   
    #          11, 11,  9, 13, 13),  実験による計測値
    #        nrow=2, byrow=T)
    # 計測値は理論値に合致しているといえるか(両側検定)

    # ケースB
    #          --- 項目 ---
    # matrix(c(10, 12,  8, 14, 12,     対策前       
    #          15, 18, 17, 10, 10),  対策後
    #        nrow=2, byrow=T)
    # 対策により向上したといえるか(上側検定)

〓〓〓 ケースA chisq.test 
chisq.test(matrix(c(10, 12,  8, 14, 12,
                    11, 12,  9, 13, 13),
                  nrow=2, byrow=T))

    # Pearson's Chi-squared test
    # data:  matrix(c(10, 12, 8, 14, 12, 11, 12, 9, 13, 13), nrow = 2, byrow = T)
    # X-squared = 0.14844, df = 4, p-value = 0.9974 > 0.05 → 差があるとはいえない →合致している

〓〓〓 ケースA fisher.test

fisher.test(matrix(c(10, 12,  8, 14, 12,
                     11, 12,  9, 13, 13),
                  nrow=2, byrow=T))

    #   Fisher's Exact Test for Count Data
    # data:  matrix(c(10, 12, 8, 14, 12, 11, 12, 9, 13, 13), nrow = 2, byrow = T)
    # p-value = 1    > 0.05 差があるとはいえない →合致している
    # alternative hypothesis: two.sided    両側検定

    # 2x2 と異なり、P値しか得られません。

〓〓〓 ケースB fisher.test

fisher.test(matrix(c(10, 12,  8, 14, 12,
                     15, 18, 17, 10, 10),
                  nrow=2, byrow=T),
            alternative="g")

    #   Fisher's Exact Test for Count Data
    # data:  matrix(c(10, 12, 8, 14, 12, 15, 18, 17, 10, 10), nrow = 2, byrow = T)
    # p-value = 0.3178    > 0.05  → 差があるといえる → 改善されたといえる
    # alternative hypothesis: g 上側検定