🐍
【Pythonで実装】江島の分散分析における必要サンプルサイズ計算(通常型/Cohen's f)
江島の通常型分散分析(Cohen's f)によるサンプルサイズ計算【Python実装あり】
はじめに
前回の記事では、バイオエクイバレンス試験における江島の方法をPythonで実装しました。
今回はその通常分散分析型(Cohen's f)に焦点を当て、必要サンプルサイズの求め方を解説します。
※本記事は実務や統計勉強に役立てるために、できるだけ直感的に解説します。
分散分析におけるサンプルサイズの概要
- 分散分析(ANOVA)では、効果量(ここでは f)・有意水準・検出力・群数・残差分散をもとに必要サンプルサイズを算出します。
- 江島の方法は、通常の理論に基づきながらも、臨床試験向けに整理された明快な定式化が魅力です。
前提となるパラメータ
| パラメータ | 意味 |
|---|---|
| α | 有意水準(例:0.05) |
| power | 目標検出力(例:0.8) |
| k | 群数(2以上の整数) |
| MSR | 群間平均平方 |
| MSW | 群内平均平方(残差MS) |
数式とアルゴリズム
江島の通常分散分析型では、非心F分布の累積確率に基づき、必要サンプルサイズ n を反復的に求めます。
- 非心パラメータ λ = n × f²
- 自由度: df1 = k - 1、df2 = k(n - 1)
- 検出力が目標値になるまで n を増加させて反復
Pythonによる実装例
# coding: UTF-8
""" 江島ら論文によるサンプルサイズ算出(通常試験、分散分析の効果量f使用) """
""" インポート """
import numpy as np
from scipy.stats import f, ncf
from scipy.optimize import brentq
from loguru import logger
# ===========================================================================================
# 実行関数
# n
def numbers() -> int:
return 3
# 自由度
def degree_of_freedom(n: int, group_num: int) -> int:
return (n - 1) * group_num
# 両側検定臨界値(f)
def f_critical(alpha: float, dof: int, k: int) -> float:
return f.ppf(1 - alpha, k - 1, dof)
# 検出力誤差関数
def power_diff(delta: float, alpha: float, dof: int, group_num: int, power_target: float):
f_crit = f.ppf(1 - alpha, group_num - 1, dof)
power = 1 - ncf.cdf(f_crit, group_num - 1, dof, delta)
return power - power_target
# 効果量f
def effect_f(msr: float, msw: float) -> float:
return np.sqrt(abs(msr / msw - 1))
# λcalc
def lambda_calc(n: int, eff_f: float) -> float:
return n * (eff_f ** 2)
# ===========================================================================================
""" Main """
if __name__ == "__main__":
# パラメータ設定
alpha: float = 0.05
beta: float = 0.2
power_target: float = 1 - beta
group_num: int = 3
msr: float = 537.361904761905
msw: float = 140.145658263305
## 実行処理
# 基準サンプルサイズ
n = numbers()
# 表のδを超えるまで繰り返す
while True:
# 分布表の値
# 自由度
dof = degree_of_freedom(n=n, group_num=group_num)
# 検定臨界値(f)※必ず右側検定となるため片側
f_crit = f_critical(alpha=alpha, dof=dof, k=group_num)
# δを求める(非心度)
delta = brentq(power_diff, 0, 10000, args=(alpha, dof, group_num, power_target))
# 効果量f
eff_f = effect_f(msr=msr, msw=msw)
lam_c = 0
# 実際の値(λcalc)
lam_c = lambda_calc(n=n, eff_f=eff_f)
if lam_c >= delta:
logger.debug("収束しました。")
break
else:
n += 1
# デバッグ
logger.debug(f"=============================================")
logger.debug(f"n={n}")
logger.debug(f"dof={dof}")
logger.debug(f"effect size={eff_f}")
logger.debug(f"f critical={f_crit: 4f}")
logger.debug(f"分布表に値するδ={delta: 4f}")
logger.debug(f"λcalc={lam_c: 4f}、n={n}")
実行結果
2025-07-07 23:23:42.241 | DEBUG | __main__:<module>:85 - 収束しました。
2025-07-07 23:23:42.241 | DEBUG | __main__:<module>:91 - =============================================
2025-07-07 23:23:42.241 | DEBUG | __main__:<module>:92 - n=5
2025-07-07 23:23:42.241 | DEBUG | __main__:<module>:93 - dof=12
2025-07-07 23:23:42.241 | DEBUG | __main__:<module>:94 - effect size=1.6835409236408254
2025-07-07 23:23:42.241 | DEBUG | __main__:<module>:95 - f critical= 3.885294
2025-07-07 23:23:42.241 | DEBUG | __main__:<module>:96 - 分布表に値するδ= 12.502873
2025-07-07 23:23:42.241 | DEBUG | __main__:<module>:97 - λcalc= 14.171550、n=5
この結果から、3群間で効果量f ≒ 1.68を想定した場合、サンプルサイズ n=5 で目標検出力(80%)を満たすことがわかります。
注意点と実務での使いどころ
この手法は汎用性が高い一方で、実務で使う際にはいくつかの注意点があります。
⚠ 効果量 f の推定に注意
効果量 f は過去の研究やパイロット試験から推定する必要があります。
推定が不正確だと、サンプルサイズも過小・過大になり、検出力の設計ミスにつながるおそれがあります。
- 例:実際の差が小さいのに f を大きく見積もると、サンプルサイズが不十分になる。
- Cohenの目安(小: 0.1、中: 0.25、大: 0.4)を参考にする場合も、領域による調整が必要です。
⚠ 群内分散(MSW)の信頼性
MSW(群内誤差の分散)は、サンプル数が少ないとばらつきが大きくなります。
そのため、Pilotデータや過去試験からなるべく信頼性の高い推定を行うことが望まれます。
💡 適用シーンの具体例
本手法は以下のようなケースで有効に機能します。
- バイオエクイバレンス(BE)試験:医薬品の群間比較を行う設計
- 教育・心理学分野の実験:複数の指導法・処置条件を比較
- 医療系臨床試験:治療群間の平均効果比較(例:3群比較)
🛠 実務での応用ポイント
- Pythonによる自動化が可能なため、社内用の設計ツールや検出力検討資料の作成に応用しやすい
- パラメータの柔軟な変更に対応できるため、感度分析にも向いている
まとめ
今回紹介した江島の方法(分散分析型Cohen's f)は、臨床試験や実験研究において重要な「群間差の検出力設計」に直結する考え方です。
Python実装により、繰り返しの計算やパラメータ変更にも柔軟に対応できるため、統計解析の自動化にも役立ちます。
効果量fの推定を適切に行い、分散の信頼性を確保すれば、より現実的なサンプル設計が可能になります。
おわりに
Zennでは、統計解析やツール開発、PythonやVBAなどの実務Tipsを発信しています。 よろしければフォローお願いします。
✅ 補足:読者ターゲット
- 医薬系・臨床系のエンジニア/統計職
- Pythonユーザー(初〜中級)
- サンプルサイズ計算を自動化・内製化したい人
Discussion