
データの準備と要約

Fisherの正確検定、Fisherの正確確率検定、Fisherの直接確率検定、Fisherの直接法などと呼ばれています。ここでは、Fisherの正確確率検定をタイトルとして使用します。
新たなトレーニング方法が開発され、運動障害を持つ患者(軽度群、重度群)に対して実施された。軽度群と比較して、重度群に対する新トレーニング法の効果について検証した。
オッズの定義
研究目的に応じてオッズ、オッズ比を定義してください
$オッズ=\frac{新トレーニングの効果あり}{新トレーニングの効果なし}$
$オッズ比=\dfrac{重度群のオッズ}{軽度群のオッズ}$
サンプル(架空のサンプルです)
障害レベル; severity(severe=重度, mild=軽度)
効果; effect(yes=あり, no=なし)
severity <- c(rep("severe", 12), rep("mild", 6), rep("severe", 3), rep("mild", 8))
severity <- factor(severity, levels=c("severe", "mild"))
levels(severity)
#[1] "severe" "mild"
effect <- c(rep("yes", 18), rep("no", 11))
effect <- factor(effect, levels=c("yes", "no"))
levels(effect)
#[1] "yes" "no"
tab <- xtabs( ~ severity + effect)
print(tab)
> print(tab)
effect
severity yes no
severe 12 3
mild 6 8
factor()
関数は名義変数をカテゴリカル変数(因子型変数)に変換し、データのカテゴリーは「水準」として定義されます。levels()
関数で表示されるカテゴリカル変数の水準のうち、最初に表示されるカテゴリーがデフォルトで基準カテゴリー(参照カテゴリー)となり、統計モデルでの比較の基点として機能します。relevel()
関数や factor()
関数の levels
引数を使用することで、レベルの順序を指定し、基準カテゴリーを変更することが可能です。
重度群のオッズは$\frac{12}{3}=4$、軽度群のオッズは$\frac{6}{8}=0.75$となります。この比率が「1」か「1ではない」かということを調べるために、下記のオッズ比を利用します。
$オッズ比 =\dfrac{重度群のオッズ}{軽度群のオッズ}= 5.33$
5.33なのでオッズ比は1より大きい結果となりました。オッズ比が高くなると重度群の効果割合が軽度群の効果割合より高いことを意味します。
仮説
帰無仮説 H0: オッズ比=1(重度群のオッズ = 軽度群のオッズ)
対立仮説1 H1: オッズ比 > 1(重度群のオッズ > 軽度群のオッズ)➡ 上側検定
対立仮説2 H1: オッズ比 < 1(重度群のオッズ < 軽度群のオッズ)➡ 下側検定
対立仮説3 H1: オッズ比 ≠1(重度群のオッズ ≠ 軽度群のオッズ)➡ 両側検定

サンプルから考えると「仮説2」と「仮説3」は不要と思われますが、統計学備忘録として3つの仮説を取り上げます。
Rで分割表の作成
分割表の操作については、以下の記事を参照ください。
分割表の周辺合計
addmargins(tab)
> addmargins(tab)
effect
severity yes no Sum
severe 12 3 15
mild 6 8 14
Sum 18 11 29
周辺合計を固定した場合に、考えられる全ての分割表を求めます。
# Define a function to generate and display contingency tables
print_tables <- function() {
total_severe <- 15
total_mild <- 14
total_yes <- 18
total_no <- 11
# Calculate the possible range of values for a
# a corresponds to severe & yes
for (a in max(0, total_yes - total_mild):min(total_yes, total_severe)) {
b <- total_severe - a # severe & no
c <- total_yes - a # mild & yes
d <- total_no - b # mild & no
# Check if b, c, and d are all non-negative integers
if (b >= 0 && c >= 0 && d >= 0 && c <= total_mild && d <= total_mild) {
# Print only the contingency table
cat(sprintf("Effect\n"))
cat(sprintf("Severity Yes No\n"))
cat(sprintf("Severe %d %d\n", a, b))
cat(sprintf("Mild %d %d\n\n", c, d))
}
}
}
# Run the function to display all contingency tables
print_tables()
> print_tables()
Effect
Severity Yes No
Severe 4 11
Mild 14 0
Effect
Severity Yes No
Severe 5 10
Mild 13 1
Effect
Severity Yes No
Severe 6 9
Mild 12 2
Effect
Severity Yes No
Severe 7 8
Mild 11 3
Effect
Severity Yes No
Severe 8 7
Mild 10 4
Effect
Severity Yes No
Severe 9 6
Mild 9 5
Effect
Severity Yes No
Severe 10 5
Mild 8 6
Effect
Severity Yes No
Severe 11 4
Mild 7 7
Effect
Severity Yes No
Severe 12 3
Mild 6 8
Effect
Severity Yes No
Severe 13 2
Mild 5 9
Effect
Severity Yes No
Severe 14 1
Mild 4 10
Effect
Severity Yes No
Severe 15 0
Mild 3 11
考えられる分割表は12組あります。これでFisherの正確検定の準備は完了、有意水準5%で検定してみましょう。研究計画(何を立証したいのか)に従い、以下から適切な検定方法を選択します。
関数 fisher.test で検定を実行
> addmargins(tab)
effect
severity yes no Sum
severe 12 3 15
mild 6 8 14
Sum 18 11 29
片側検定(上側),alternative = “greater”
対立仮説1 H1: オッズ比 > 1(severe グループのオッズが mild グループよりも大きい)。これは、重度群の効果ありの人数が12人以上になる確率を求める検定です。
fisher.test(tab, alternative = "greater")
Fisher's Exact Test for Count Data
data: tab
p-value = 0.04601
alternative hypothesis: true odds ratio is greater than 1
95 percent confidence interval:
1.029929 Inf
sample estimates:
odds ratio
5.003853
X≧12、つまりX=12, 13, 14, 15 となる確率を求めます。
P(X) = P(X≧12 | severe=15, mild=14, yes=18 ) という条件付き確率になります。
P(X=12) + P(X=13) + P(X=14) + P(X=15)=0.046
この確率は超幾何分布を使って求めます(後で出てきます)。
p値 が0.046(p<0.0.5)のため、帰無仮説(重症群と軽度群の間に差がない)を棄却します。これは、重症群の効果が軽度群と比較して統計的に有意である可能性が高いことを意味します。
- p-value(p値)= 0.046
- alternative hypothesis(対立仮説): Rは対立仮説を出力します。ここでの対立仮説は、「真のオッズ比は1ではない」。すなわち・・・p値<0.05なので「重症群と軽度群には有意差があり、重症群のオッズは有意に高い」という結果になります。
- 95 percent confidence interval: 下記のオッズ比の95%信頼区間。
- odds ratio(オッズ比)5.003853: これは単純な割り算のオッズ比(5.33)ではありません。条件付き最尤推定から算出されています。詳細は奥村晴彦先生のページをご参照ください。
片側検定(下側),alternative = “less”
対立仮説2 H1: オッズ比 < 1(severe グループのオッズが mild グループよりも小さい)。これは、重度群の効果ありの人数が12人以下になる確率を求める検定です。
fisher.test(tab, alternative = "less")
Fisher's Exact Test for Count Data
data: tab
p-value = 0.9935
alternative hypothesis: true odds ratio is less than 1
95 percent confidence interval:
0.00000 29.77609
sample estimates:
odds ratio
5.003853
X≦12、つまり X=12, 11, 10, ・・・, 4 となる条件付き確率を求めます。
P(X≦12 | severe=15, mild=14, yes=18 )
=P(X=12) + P(X=11) + ・・・ + P(X=4)
=0.9935
p値は0.99なので帰無仮説が棄却できません。つまり、「severe グループのオッズが mild グループよりも低い」とは統計的には言えません。
両側検定, alternative = “two.sided”
対立仮説3 H1: オッズ比 ≠1(evere グループのオッズと mild グループのオッズは異なる)。severityのカテゴリー(severeとmild)とeffect(yesまたはno)の間における独立性の検定になります。
fisher.test(tab, alternative = "two.sided")
Fisher's Exact Test for Count Data
data: tab
p-value = 0.06043
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.8163182 40.7244582
sample estimates:
odds ratio
5.003853
P=0.06 なので有意差はありません。このp値は後半で説明します。
コメント欄 『間違い』や『分かりにくい部分』などのご意見もお寄せください
記事を拝見させていただきました。
Fisherの正確確率検定とオッズ比は無関係です。
オッズ比はオッズ比の検定があり、2×2の集計表ではロジスティック回帰分析がオッズ比の検定に対応します。ロスマンの疫学(https://shinoharashinsha.co.jp/?page_id=3534)を参照いただければ参考になります。
Rではなぜか無関係な統計量が出てくるので、必要な統計量を自分で判断しなければなりません。計算機は自分の命令で正しく使用し、勝手な計算に騙されてはいけないということです。
また、2×2の集計表で fisher.test では Mid-P value method つまり、近似法を使用するのでP値は不正確になることがあります。離散分布なので、左右対称の分布ではないためです。package.exact2x2 を使用してfisher.exact(.Table,tsmethod=”central”)
を使用するのが正しいです。(https://cran.r-project.org/web/packages/exact2x2/index.html)
この例のオッズ比の検定のp値は0.046703368、=CHISQ.DIST.RT((LN(12)+LN(8)-LN(3)-LN(6))^2/(1/12+1/8+1/6+1/3),1)となります。オッズ比の95%信頼区間は(1.024721572, 27.75821767)になります。
リスク差(2群間の出現率の差)の検定としてFisherの正確確率検定CentralではExcelシートで=2*HYPGEOM.DIST(3,15,11,29,TRUE)=0.09202767
Rでは通常 fisher.exact() を使用します。
しかし、Fisherの正確確率検定はサンプルサイズが、m(この例では29)で周辺度数が固定された場合の現実的に使用しない仮定の時のP値なので、つまり、フィッシャーの正確検定は母集団が特定の例数の時のものなので、この原理を用いて普遍性のある推定をするのは困難です。通常は無限母集団からの標本集団に対して Pearson のχ2検定(連続修正有り)(この例では0.093544431で近似もそれほど悪くはない)などを使用し、普遍性のある推定を行います。
疫学でいうリスク差の検定にFisherの正確確率検定、Pearson のχ2検定(連続修正有り)、連続修正を加えたマンテル・ヘンツェルの検定が適用されます。
この例ではリスク差の95%信頼区間は(-0.026515826, 0.769372969)です。
統計的仮説検定を行いたい時は理論度数とは無関係にFisherの正確確率検定ではなく出現率の差の正規近似検定つまりχ2検定を用いるべきです。
3群以上の場合は、r×2のように出現率の差を計算できる場合に限り、Bonferroni型の検定と95%同時信頼区間で評価が可能です。2ページ目の例では1行目と3行目でp値0.013、(0.100,0.816 )、2行目と3行目でp値0.035、(0.044, 0.806), 1行目と2行目でp値0.84、(-0.29, 0.36)となります。帰無仮説:レベル1, 2, 3のyesまたはnoの出現率は等しいとなります。下記のExcelシートなどを参考にしていただければ幸いです。
https://researchmap.jp/multidatabases/multidatabase_contents/detail/1119559/a8966183061200a85e9901f90838df08?frame_id=1951737
一般のa×b型の場合はPearson のχ2検定を使用することになります。そして、2項分布などを使用できないため、各セルの出現率で度数の食い違いを比較するようになります。つまり多重比較は行わないことになります。
一般に検定結果と推定結果は一致するとは限りませんので、検定と推定で結果が異なることがあります。
以上参考になれば幸いです。