新しい治療法が既存のものと同等であることを証明したい。そんな時、従来の「優れているか」を問う研究だけでは不十分である。本記事では、臨床現場で役立つ同等性検定の基本から、医師が直面する具体的なケースでの活用法、そして研究の成功に不可欠な必要サンプル数の算出方法までを、Rを用いた実践的な計算例を交えて詳しく解説する。あなたの臨床研究をより確実なものにするための実践的知識がここにある。
同等性検定の概要
臨床研究において、新しい治療法や薬剤が既存のものと同等であるかを検証したい場合がある。例えば、副作用が少ない新しい薬剤が、既存の薬剤と同等の効果を持つことを示したい場合などがこれに該当する。このような状況で用いられるのが「同等性検定(Equivalence Test)」である。
従来の優越性検定(Superiority Test)が「新しい治療法が既存の治療法よりも優れているか」を問うのに対し、同等性検定は「2つの治療法間に臨床的に意味のある差がないか」を問う。ここで重要なのは、「臨床的に意味のある差」という概念である。統計的に有意差がない場合でも、その差が臨床的に許容範囲内であるかどうかは別途考慮する必要がある。この許容範囲を「同等性マージン(Equivalence Margin)」と呼び、通常、事前に臨床的な判断に基づいて設定されなければならない。
同等性検定では、帰無仮説(H0)と対立仮説(H1)の設定が優越性検定とは逆になる。
優越性検定の場合:
- H0: 2群間に差がない
- H1: 2群間に差がある
同等性検定の場合:
- H0: 2群間に臨床的に意味のある差がある(つまり、同等ではない)
- H1: 2群間に臨床的に意味のある差がない(つまり、同等である)
同等性検定の主な手法としては、Two One-Sided Tests (TOST) プロシージャが広く用いられる。これは、事前に設定された同等性マージン(Δ)を用いて、以下の2つの片側検定を同時に行い、両方の検定で帰無仮説が棄却された場合に同等であると結論づける方法である。
- 治療Aが治療Bより−Δ以上大きいか
- 治療Aが治療Bより+Δ以下小さいか
臨床研究の具体例
整形外科医のA医師は、変形性膝関節症の患者に対する新しいリハビリテーションプログラム(プログラムY)を検討している。既存のリハビリテーションプログラム(プログラムX)と比較して、プログラムYはより短期間で実施でき、患者の通院負担が少ないというメリットがある。A医師は、プログラムYがプログラムXと同等な疼痛改善効果(VASスコアの変化量)をもたらすことを確認したいと考えている。ここで、プログラムYはプログラムXよりも平均でわずかに低い(例えば2ポイント低い)疼痛改善効果を示す可能性があるものの、その差が臨床的に許容範囲内であれば、プログラムYを導入する価値があると考えている。
研究デザイン:
- 対象疾患: 変形性膝関節症
- 介入: 新しいリハビリテーションプログラムY
- 対照: 既存のリハビリテーションプログラムX
- 主要評価項目: 8週時点でのVASスコアの変化量(ベースラインからの改善度)
- VASスコアは0(痛みなし)から100(想像しうる最悪の痛み)で評価される。変化量はベースラインスコアから8週後スコアを引いた値とする(値が大きいほど改善が大きい)。
- 同等性マージン: 臨床的に許容できるVASスコア変化量の差を±7ポイントと設定した。これは、プログラムYのVASスコア変化量がプログラムXと比較して7ポイント以上悪化しなければ、臨床的に同等とみなすという判断である。
- 期待される平均差: プログラムXの平均VASスコア変化量を40ポイント、プログラムYの平均VASスコア変化量を38ポイント(Xより2ポイント低いが、臨床的に許容範囲内)と仮定する。
この研究の目的は、プログラムYがプログラムXに優れていることを示すことではなく、プログラムYがプログラムXの疼痛改善効果と同等であり、わずかな劣性が臨床的に許容される範囲内であることを示すことである。
具体例における同等性検定 Rでの計算例
上記の例に基づき、Rでの同等性検定の計算例を示す。ここでは、平均値に対する同等性検定を行う。Rのequivalence
パッケージを使用する。
まず、架空のデータを作成し、tost
関数を用いて同等性検定を実行する。
必要なパッケージをインストール(初回のみ)
# install.packages("equivalence")
library(equivalence)
# データ作成
# プログラムX群のVASスコア変化量 (改善度)
set.seed(1) # 再現性のためのシード設定
n_x <- 50 # 各群の患者数
mean_x <- 40 # 期待される平均VAS変化量
sd_x <- 15 # 標準偏差
# プログラムY群のVASスコア変化量 (改善度)
n_y <- 50 # 各群の患者数
mean_y <- 38 # 期待される平均VAS変化量
sd_y <- 15 # 標準偏差 (両群で同じと仮定)
# 正規分布に従うランダムデータを生成
data_x <- rnorm(n_x, mean = mean_x, sd = sd_x)
data_y <- rnorm(n_y, mean = mean_y, sd = sd_y)
# データの要約
cat("プログラムX群 平均VAS変化量:", mean(data_x), ", 標準偏差:", sd(data_x), "\n")
cat("プログラムY群 平均VAS変化量:", mean(data_y), ", 標準偏差:", sd(data_y), "\n")
cat("両群の平均差:", mean(data_y) - mean(data_x), "\n\n")
# 同等性マージンを定義
# 臨床的に許容できる差を7ポイントと設定
epsilon <- 7
# 2群の平均値の同等性検定 (TOST)
# `tost`関数を使用
# H0: diff <= -epsilon or diff >= epsilon
# H1: -epsilon < diff < epsilon (差が同等性マージン内に収まる)
# alpha = 有意水準 (TOSTでは、各片側検定に alpha が割り当てられるため、両側で alpha * 2)
# conf.level = 信頼水準 (1 - alpha_total)
# default_alphaは0.05。TOSTでは、両側検定の信頼水準を1-alphaとしたい場合、
# 片側検定の有意水準をalpha/2に設定する必要がある。
# tostのconf.levelは両側信頼区間の信頼水準を指定する。
# ここでは、信頼水準90% (片側有意水準0.05) で同等性検定を行う。
result_equivalence <- tost(
x = data_x,
y = data_y,
epsilon = epsilon, # 同等性マージン
conf.level = 0.90 # 両側信頼区間90% (各片側検定で有意水準0.05に対応)
)
print(result_equivalence)
# 結果の解釈
# 90%信頼区間 (confidence interval) が [-epsilon, +epsilon] の範囲に完全に含まれているかを確認します。
実行結果:
> cat("プログラムX群 平均VAS変化量:", mean(data_x), ", 標準偏差:", sd(data_x), "\n")
プログラムX群 平均VAS変化量: 41.50672 , 標準偏差: 12.47091
> cat("プログラムY群 平均VAS変化量:", mean(data_y), ", 標準偏差:", sd(data_y), "\n")
プログラムY群 平均VAS変化量: 39.7599 , 標準偏差: 14.53242
> cat("両群の平均差:", mean(data_y) - mean(data_x), "\n\n")
両群の平均差: -1.746827
> print(result_equivalence)
Welch Two Sample TOST
data: data_x and data_y
df = 95.793
sample estimates:
mean of x mean of y
41.50672 39.75990
Epsilon: 7
90 percent two one-sided confidence interval (TOST interval):
-1.747962 5.241616
Null hypothesis of statistical difference is: rejected
TOST p-value: 0.0276767
両群の平均差は、-1.7 と 約 2 である。同等性マージンを 7 として、TOST を実行すると、平均差の 90% 信頼区間が、-1.7 から 5.2 であり、-7 から +7 に収まっており、両側とも5%で統計学的有意に同等性マージンを超えないことがわかる。ゆえに、片側5%の2つの検定、上側・下側ともに有意である。
したがって、この結果から「プログラムXとプログラムYの疼痛改善効果は同等である」と結論づけられる。
必要サンプル数 Rでの計算例
同等性検定を行うにあたり、適切なサンプル数を事前に算出することは非常に重要である。サンプル数が不足していると、たとえ真に同等であっても同等性を証明できない(タイプIIエラー)可能性が高まる。
ここでは、平均値の同等性検定における必要サンプル数を計算する。TOSTプロシージャの考え方に基づき、pwr
パッケージのpwr.t.test
関数を応用した例を示す。
必要サンプル数計算の前提条件:
- プログラムXの期待されるVAS変化量: 40ポイント
- プログラムYの期待されるVAS変化量: 38ポイント(差が-2ポイントと仮定)
- 期待される標準偏差 (σ): 15ポイント(両群で同じと仮定)
- 同等性マージン (Δ): 7ポイント
- 有意水準 (α): 0.05 (片側検定ごとに0.05、TOSTでは両側で0.10、つまり片側0.05が2回)
- 検出力 (Power): 0.80 (80%)
同等性検定のサンプルサイズ計算では、真の差が同等性マージンの一方の端にあるときに、その仮説を棄却できるパワーを確保するという考え方をする。
# 必要サンプル数計算のためのパラメータ設定
mean_x_expected <- 40 # プログラムXの期待される平均
mean_y_expected <- 38 # プログラムYの期待される平均 (期待される差は -2)
sd_pooled <- 15 # プールされた標準偏差 (両群で同じと仮定)
epsilon_margin <- 7 # 同等性マージン
alpha_one_sided <- 0.05 # 片側検定の有意水準
power_target <- 0.80 # 目標とする検出力
# TOSTプロシージャにおける必要サンプル数計算の考え方
# 2つの片側検定のそれぞれに対して必要サンプル数を計算する。
# この場合、真の差が -epsilon_margin の時に、
# 差が -epsilon_margin より大きいことを示す検定のパワーを計算。
# または、真の差が +epsilon_margin の時に、
# 差が +epsilon_margin より小さいことを示す検定のパワーを計算。
# effect size (Cohen's d) の計算
# d = |(mu1 - mu2) - delta| / sigma_pooled
# ここでは、期待される真の差を -2 と設定しているため、
# 以下の2つのシナリオで最も大きいサンプル数を採用する。
# シナリオ1: (mu_Y - mu_X) が -epsilon_margin のときに、検出力0.80でその差が-epsilon_marginより大きいことを示す。
# 真の差は -2 と仮定。
# 検出したい差 (delta) = (期待される真の差) - (-epsilon_margin) = -2 - (-7) = 5
d1 <- abs((mean_y_expected - mean_x_expected) - (-epsilon_margin)) / sd_pooled
# または
# 検出したい差 (delta) = epsilon_margin - (期待される真の差) = 7 - (-2) = 9 (これは差が +epsilon_margin からどれだけ離れているか)
d2 <- abs(epsilon_margin - (mean_y_expected - mean_x_expected)) / sd_pooled
# どちらか大きい方の効果量で計算する
# effect_size <- max(d1, d2) # ここでは、真の差を考慮しないシンプルなケースで計算
# ここでは、真の差を0として、epsilon_marginの差を検出するパワー計算とは異なる。
# 同等性検定におけるサンプルサイズは、通常、
# 「真の差が同等性マージンの端(例: -epsilon_margin または +epsilon_margin)にあり、
# かつ検出力が目標値であるときに、同等性が棄却されない(つまり、信頼区間がマージン内に収まる)
# ために必要なサンプル数」として計算される。
# より厳密な同等性検定のサンプルサイズ計算
# pwr.t.testでは直接同等性検定のサンプルサイズを計算できないため、
# TOSTの考え方に基づいて、片側検定のパワー計算を応用する。
# Scenario 1: H0: mu_Y - mu_X <= -epsilon_margin
# Alternative: mu_Y - mu_X > -epsilon_margin
# effect size = (真の差 - H0の境界値) / 標準偏差
# = (-2 - (-7)) / 15 = 5 / 15 = 0.333
d_scenario1 <- (mean_y_expected - mean_x_expected - (-epsilon_margin)) / sd_pooled
print(d_scenario1)
# Scenario 2: H0: mu_Y - mu_X >= epsilon_margin
# Alternative: mu_Y - mu_X < epsilon_margin
# effect size = (H0の境界値 - 真の差) / 標準偏差
# = (7 - (-2)) / 15 = 9 / 15 = 0.6
d_scenario2 <- (epsilon_margin - (mean_y_expected - mean_x_expected)) / sd_pooled
print(d_scenario2)
# 両方の片側検定でパワーが目標値に達する必要があるため、より厳しい条件(effect sizeが小さい方)で計算する。
# ただし、pwr.t.testのdelta引数は、期待される差の絶対値。
# ここでは、TOSTのサンプルサイズ計算のロジックに基づいて、最も厳しいシナリオで計算する。
# つまり、真の差が期待される差(-2)の時に、
# 信頼区間が [-7, 7] の範囲に収まる確率を計算する。
# 簡易的な計算として、pwr.t.testを応用する。
# effect sizeとして、同等性マージンと期待される差の間の距離を用いる。
# 例えば、期待される差が -2、同等性マージンが 7 の場合、
# -7 と -2 の差 (5) または +7 と -2 の差 (9) のうち、より小さい方の差を検出できるようなサンプル数を求める。
# これらを標準偏差で割ったものがCohen's d。
# 同等性検定におけるサンプルサイズ計算の一般的なロジック
# H0: |mu1 - mu2| >= epsilon_margin
# H1: |mu1 - mu2| < epsilon_margin
# 検出力は、真の差がdelta_0のときにH1を採択する確率
# Cohen's d for equivalence test
# d_equiv = (epsilon - |mu1 - mu2|) / sigma_pooled
# ここでは、期待される真の差を `mean_y_expected - mean_x_expected` と設定
# `delta` in `pwr.t.test` is `mean1 - mean2`.
# 同等性検定では、`delta = epsilon_margin - expected_diff` または `expected_diff - (-epsilon_margin)`
# のうち、小さい方の絶対値を取る。
# d = min(abs(epsilon_margin - (mean_y_expected - mean_x_expected)), abs(-epsilon_margin - (mean_y_expected - mean_x_expected))) / sd_pooled
# d = min(abs(7 - (-2)), abs(-7 - (-2))) / 15
# d = min(abs(9), abs(-5)) / 15
# d = 5 / 15 = 0.3333
d_calc <- min(abs(epsilon_margin - (mean_y_expected - mean_x_expected)), abs(-epsilon_margin - (mean_y_expected - mean_x_expected))) / sd_pooled
print(d_calc)
# サンプルサイズ計算のために pwr パッケージを呼び出す
# install.packages("pwr") # 未インストールであれば初回のみ実行
library(pwr)
# 各群の必要サンプル数
n_each_group <- pwr.t.test(
d = d_calc, # 効果量
sig.level = alpha_one_sided, # 片側検定の有意水準
power = power_target, # 目標検出力
type = "two.sample",
alternative = "greater" # TOSTの片側検定の一つを想定 (H0: diff <= -epsilon を棄却する)
)$n
cat("各群の必要サンプル数 (近似値): ", ceiling(n_each_group), "\n")
実行結果:
> cat("各群の必要サンプル数 (近似値): ", ceiling(n_each_group), "\n")
各群の必要サンプル数 (近似値): 112
例えば、上記の計算により、「各群の必要サンプル数 (近似値): 112」という結果が得られる。これは、各群に112人の患者を組み入れれば、設定した条件(期待される平均差-2、標準偏差15、同等性マージン±7、有意水準0.05、検出力0.80)で同等性を検証するためには十分であるという目安を示している。
まとめ
本記事では、平均値アウトカムに焦点を当て、臨床研究における同等性検定と必要サンプル数計算について解説した。同等性検定は、新しい介入が既存の介入と同等であることを「臨床的に意味のある差がない」という観点から証明する際に不可欠な手法である。この際に、研究開始前に設定する同等性マージンが極めて重要な役割を果たす。
具体例として、整形外科領域における変形性膝関節症の新しいリハビリテーションプログラムが、既存プログラムと同等のVASスコア改善効果を示すかを検証するシナリオを提示した。特に、新しいプログラムがわずかに劣る可能性(平均で2ポイント低い改善効果)があるものの、それが臨床的に許容範囲内である場合に、同等性を証明する意義があることを示した。
Rを用いた計算例では、equivalence
パッケージのtost
関数を使用して平均値の同等性検定を実行する方法、およびpwr
パッケージのpwr.t.test
関数を応用して必要サンプル数を計算する方法を示した。同等性検定におけるサンプルサイズ計算は、優越性検定と比較してやや複雑であり、期待される真の差や同等性マージンを考慮した効果量の設定が重要となる。
同等性検定を適切に実施するためには、臨床的意義に基づいた同等性マージンの設定、期待される真の差の把握、そして十分な検出力を確保するための適切なサンプル数計算が不可欠である。これらの統計的手法を理解し、適切に適用することで、より信頼性の高い臨床研究を行うことができる。
コメント