「治療前後の効果」「施策による意識の変化」など、同じ対象者の2つの時点での変化を知りたいとき、マクネマー検定が役立つ。この検定は2値データ(はい/いいえなど)の変化を分析するのに最適。
この記事では、マクネマー検定の基本から、Rを使った計算例、さらには適切なサンプル数の見積もり方まで、初心者にも分かりやすく解説。Rで手軽に統計分析を始め、データの真実を明らかにしよう!
マクネマー検定とは
マクネマー検定は、ある処置の前と後で、同じ対象者の二値の応答がどのように変化したかを分析するのに用いる統計手法だ。
例えば、新しい薬の服用前後で病気の有無がどう変化したか、あるいは広告を見た前後で商品購入意欲がどう変化したかなどを評価できる。
どんなときに使うかの具体例
この検定は、変化の方向性や、変化した人々の割合が有意であるかを判断するのに適しており、対応のある二項データの分析に特化している。
具体的には、処置前と後で「はい」から「いいえ」に変わった人数と、「いいえ」から「はい」に変わった人数の間に有意な差があるかをカイ二乗分布に基づいて評価する。
変化がなかったケースは考慮せず、変化があったケースのみに着目する点が特徴である。
例:治療による疾患の重症度の変化
ある疾患の患者さんに対し、特定の治療を行った結果、重症度がどのように変化したかを評価するケースを考えよう。ここでは、重症度を「軽度」と「重度」の2つのカテゴリに分けて測定する。
治療後:軽度 | 治療後:重度 | |
治療前:軽度 | a | b |
治療前:重度 | c | d |
- a: 治療前も治療後も軽度だった患者数
- b: 治療前は軽度だったが、治療後は重度になった患者数(悪化)
- c: 治療前は重度だったが、治療後は軽度になった患者数(改善)
- d: 治療前も治療後も重度だった患者数
マクネマー検定は特に「変化があった」患者、すなわちb
(悪化)とc
(改善)のセルに注目し、治療によって「改善した」患者(c)と「悪化した」患者(b)の割合に有意な差があるかを検定する。
# 1. データの準備
# 仮のデータを作成します。
# 例として、以下のような結果が得られたとします。
# - 治療前も治療後も軽度: 65人 (a)
# - 治療前は軽度だったが治療後は重度: 15人 (b)
# - 治療前は重度だったが治療後は軽度: 40人 (c)
# - 治療前も治療後も重度: 30人 (d)
# 症例数:150人(= 65 + 15 + 40 + 30)
# 2x2の分割表をmatrix形式で作成します。
# 行を「治療前」、列を「治療後」とします。
data_matrix_severity <- matrix(c(
65, 15, # 治療前 軽度 (治療後 軽度, 治療後 重度)
40, 30 # 治療前 重度 (治療後 軽度, 治療後 重度)
), nrow = 2, byrow = TRUE)
# 行名と列名を設定すると、結果が分かりやすくなります
rownames(data_matrix_severity) <- c("治療前: 軽度", "治療前: 重度")
colnames(data_matrix_severity) <- c("治療後: 軽度", "治療後: 重度")
print("疾患重症度変化の分割表:")
print(data_matrix_severity)
# 2. マクネマー検定の実行
# correct = TRUE (デフォルト) で連続性の補正を行います。
result_mcnemar_severity <- mcnemar.test(data_matrix_severity, correct = TRUE)
# 結果の表示
print("\nマクネマー検定の結果 (重症度の変化):")
print(result_mcnemar_severity)
# 3. 結果の解釈
# p-valueに注目します。
# この例では、治療前は重度だったが治療後に軽度になった患者 (c=40) が、
# 治療前は軽度だったが治療後に重度になった患者 (b=15) よりも多いことを示唆しています。
# もしp-valueが有意水準(例えば0.05)を下回れば、この差は統計的に有意であると判断でき、
# 治療によって重症度が有意に改善したと言えるでしょう。
分割表は以下のとおり。
軽度から重度(b) は、15人/150 人=10%
重度から軽度(c) は、40人/150 人=27%
> print("疾患重症度変化の分割表:")
[1] "疾患重症度変化の分割表:"
> print(data_matrix_severity)
治療後: 軽度 治療後: 重度
治療前: 軽度 65 15
治療前: 重度 40 30
結果は以下のとおり、有意水準を 0.05 とすると、P 値が 0.05 を下回り、治療前と治療後には差がないとする帰無仮説は棄却され、有意に改善したと言える。
> print(result_mcnemar_severity)
McNemar's Chi-squared test with continuity correction
data: data_matrix_severity
McNemar's chi-squared = 10.473, df = 1, p-value = 0.001211
マクネマー検定に必要なサンプル数計算
マクネマー検定のサンプルサイズ計算は、他の多くの統計検定と同様に、いくつかのパラメータを事前に設定する必要がある。特にマクネマー検定の場合、discordant pairs(不一致ペア)の割合が重要な要素になる。
マクネマー検定のサンプルサイズ計算に必要な情報
有意水準 (Alpha, α): タイプIエラー(帰無仮説が真であるにもかかわらず棄却してしまう誤り)を許容する確率。一般的に0.05(5%)が用いられる。
検出力 (Power, 1−β): タイプIIエラー(帰無仮説が偽であるにもかかわらず受容してしまう誤り)を避ける確率。通常0.80(80%)または0.90(90%)が設定される。
効果量 (Effect Size): 期待される治療効果の大きさ。マクネマー検定においては、以下の2つの不一致ペアの割合が特に重要。
- π01: 治療前は「なし」(例:重度)だが、治療後は「あり」(例:軽度)になる確率 (セル
c
の割合)。改善の方向性 - π10: 治療前は「あり」(例:軽度)だが、治療後は「なし」(例:重度)になる確率 (セル
b
の割合)。悪化の方向性 - これらの割合は、先行研究やパイロットスタディ、または臨床的な経験に基づいて推定する必要がある。
帰無仮説と対立仮説:
- 帰無仮説 (H0): π01=π10 (変化の方向性、つまり、改善または悪化に差がない)
- 対立仮説 (H1): π01≠π10 (変化の方向性、つまり、改善または悪化に差がある)
- 片側検定か両側検定かも考慮するが、一般的には両側検定が用いられる。
サンプルサイズ計算の基本的な考え方
マクネマー検定は、不一致ペア(bとc)の数に着目する。この不一致ペアの総数 (b+c) がある程度大きい場合にカイ二乗近似が成り立つ。帰無仮説の下では、bとcは等しい二項分布に従うと考えることができる。
Rでのサンプルサイズ計算
設定するパラメータは以下のとおり。
- 有意水準 (α): 0.05 (両側検定)
- 検出力 (1−β): 0.80
- 治療前重度から治療後軽度への改善の割合 (π01): 0.27 (全被験者数に対する割合)
- 治療前軽度から治療後重度への悪化の割合 (π10): 0.10 (全被験者数に対する割合)
exact2x2
パッケージの powerPaired2x2()
関数を使った例を示す。
# McNemar検定のサンプルサイズを直接計算するカスタム関数
# これはMiettinen (1968) の漸近近似に基づく一般的な式です。
calculate_mcnemar_sample_size <- function(p01, p10, alpha = 0.05, power = 0.80, two.sided = TRUE) {
# p01: 治療前が陰性で治療後が陽性の割合 (cの割合)
# p10: 治療前が陽性で治療後が陰性の割合 (bの割合)
# z値
z_alpha <- qnorm(1 - alpha / ifelse(two.sided, 2, 1))
z_beta <- qnorm(power)
# 不一致ペアの総確率
p_discordant <- p01 + p10
# 不一致ペアの差の確率
p_diff <- abs(p01 - p10)
# サンプルサイズ計算式
# Miettinen (1968) の近似式
N_miettinen = ((z_alpha * sqrt(p_discordant) + z_beta * sqrt(p_discordant - p_diff^2/p_discordant))^2) / p_diff^2
return(ceiling(N_miettinen)) # 切り上げ
}
計算例を示す。
# 計算例
# 治療前重度 -> 治療後軽度 (改善) の割合 = 0.27 (cの割合)
# 治療前軽度 -> 治療後重度 (悪化) の割合 = 0.10 (bの割合)
# ここでの割合は、総被験者数に対する割合です。
# つまり、150人中40人が改善、15人が悪化する、といった仮定です。
required_n <- calculate_mcnemar_sample_size(p01 = 0.27, p10 = 0.10, alpha = 0.05, power = 0.80)
print(paste("必要なサンプルサイズ (ペア数):", required_n))
Miettinen の式で計算すると、94 ペア必要と返ってくる。
> print(paste("必要なサンプルサイズ (ペア数):", required_n))
[1] "必要なサンプルサイズ (ペア数): 94"
最終的には、脱落率を考慮する。臨床研究では、患者の途中の脱落が起こりえる。計算されたサンプルサイズに、予想される脱落率(例:10%)を考慮して上乗せすることが一般的である。
まとめ
マクネマー検定のサンプルサイズ計算は、特に治療による悪化 (π10)と改善 (π01)の割合を事前にどれだけ正確に見積もるかにかかっている。これらの値を現実的に設定し、必要に応じて複数のシナリオで計算を行うことで、適切なサンプルサイズを決定することができる。
コメント