MENU

【無料プレゼント付き】学会発表・論文投稿に必要な統計を最短で学ぶことができる無料メルマガ

R でマクネマー検定に必要なサンプル数を計算する方法

「治療前後の効果」「施策による意識の変化」など、同じ対象者の2つの時点での変化を知りたいとき、マクネマー検定が役立つ。この検定は2値データ(はい/いいえなど)の変化を分析するのに最適。

この記事では、マクネマー検定の基本から、Rを使った計算例、さらには適切なサンプル数の見積もり方まで、初心者にも分かりやすく解説。Rで手軽に統計分析を始め、データの真実を明らかにしよう!

>>もう統計で悩むのは終わりにしませんか? 

↑1万人以上の医療従事者が購読中

目次

マクネマー検定とは

マクネマー検定は、ある処置の前と後で、同じ対象者の二値の応答がどのように変化したかを分析するのに用いる統計手法だ。

例えば、新しい薬の服用前後で病気の有無がどう変化したか、あるいは広告を見た前後で商品購入意欲がどう変化したかなどを評価できる。

どんなときに使うかの具体例


この検定は、変化の方向性や、変化した人々の割合が有意であるかを判断するのに適しており、対応のある二項データの分析に特化している。

具体的には、処置前と後で「はい」から「いいえ」に変わった人数と、「いいえ」から「はい」に変わった人数の間に有意な差があるかをカイ二乗分布に基づいて評価する。

変化がなかったケースは考慮せず、変化があったケースのみに着目する点が特徴である。

例:治療による疾患の重症度の変化

ある疾患の患者さんに対し、特定の治療を行った結果、重症度がどのように変化したかを評価するケースを考えよう。ここでは、重症度を「軽度」「重度」の2つのカテゴリに分けて測定する。

治療後:軽度治療後:重度
治療前:軽度ab
治療前:重度cd
  • 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%)を考慮して上乗せすることが一般的である。

>>もう統計で悩むのは終わりにしませんか? 

↑1万人以上の医療従事者が購読中

まとめ

マクネマー検定のサンプルサイズ計算は、特に治療による悪化 (π10​)改善 (π01​)の割合を事前にどれだけ正確に見積もるかにかかっている。これらの値を現実的に設定し、必要に応じて複数のシナリオで計算を行うことで、適切なサンプルサイズを決定することができる。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

リサーチクエスチョン探し?データ分析?論文投稿?、、、で、もう悩まない!

第1章臨床研究ではなぜ統計が必要なのか?計画することの重要性
  • 推定ってどんなことをしているの?
  • 臨床研究を計画するってどういうこと?
  • どうにかして標本平均を母平均に近づけられないか?
第2章:研究目的をどれだけ明確にできるのかが重要
  • データさえあれば解析でどうにかなる、という考え方は間違い
  • 何を明らかにしたいのか? という研究目的が重要
  • 研究目的は4種類に分けられる
  • 統計専門家に相談する上でも研究目的とPICOを明確化しておく
第3章:p値で結果が左右される時代は終わりました
  • アメリカ統計協会(ASA)のp値に関する声明で指摘されていること
  • そうは言っても、本当に有意差がなくてもいいの…?
  • なぜ統計専門家はp値を重要視していないのか
  • 有意差がない時に「有意な傾向があった」といってもいい?
  • 統計を放置してしまうと非常にまずい
第4章:多くの人が統計を苦手にする理由
  • 残念ながら、セミナー受講だけで統計は使えません。
  • インプットだけで統計が使えない理由
  • どうやったら統計の判断力が鍛えられるか?
  • 統計は手段なので正解がないため、最適解を判断する力が必要
第5章:統計を使えるようになるために今日から何をすれば良いか?
  • 論文を読んで統計が使えるようになるための5ステップ
第6章:統計を学ぶために重要な環境
  • 統計の3つの力をバランスよく構築する環境

以下のボタンをクリックして、画面に出てくる指示に従って、必要事項を記入してください。

この記事を書いた人

統計 ER ブログ執筆者

元疫学研究者

コメント

コメントする

目次