目標平均があるときのサンプルサイズ計算
- アウトライン
-
- 作成日: 2026/2/8
- 更新日: –
はじめに
臨床研究や機能性表示食品の試験設計では、「介入によって、ある指標の平均値を目標値まで変化させられるか」を検証する場面が頻繁にあります。
たとえば、収縮期血圧 (SBP) を既知の集団平均値よりも有意に低下させたい場合、単に「下がった」だけでなく、「統計的に意味のある変化として検出できる」ことを示す必要があります。そのためには、事前に適切なサンプルサイズを設計することが不可欠です。
本稿では、既報データから対象集団の平均値とばらつき (標準偏差: SD) が分かっている場合に、介入後の平均値がその既知値と異なることを統計的に示すために必要なサンプルサイズを計算します。
平均値の差を明確にし、ばらつき (SD) に対してその差がどれくらい大きいか(効果量Δ)を用いてサンプルサイズを導出する考え方は、血圧に限らずさまざまな介入研究に応用できます。
問題
ある既報 (参考データ) から、境界域の収縮期血圧 (SBP 130–139 mmHg) に該当する集団では、SBPの平均が次のとおりと見積もられたとします (境界域のみを抽出した集団)。
- 平均 134.5 mmHg
- SD 7.0 mmHg
この集団を対象に、機能性表示の介入研究で平均SBPを129.5 mmHg (=5 mmHg低下) させることを期待して、1群の平均が既知値と異なることを示す設計を考えます。
- μKnown = 134.5
- μT (目標平均)= 129.5
- σPlan = 7.0
このとき効果量は
検出の大きさとしては |Δ| = 0.71 とみなします。
両側有意水準 α = 0.05、検出力 (power) = 0.80 のとき、必要人数 N は何名でしょうか?
<ヒント>
使用する検定: 1群のt検定 (1標本t検定)
近似式:
解答
この設定は 1標本 t 検定 (one-sample t-test) のサンプルサイズ設計です。
与えられた式で計算します。
3.1 両側検定 (α=0.05)
- \(Z_{1 – \frac{\alpha}{2}} = Z_{0.975} = 1.96\)
- \(Z_{1 – \beta} = Z_{0.80} = 0.8416\)
- |Δ| = 0.71
3.2 片側検定 (α=0.05) にすると?
「SBPが低下する方向だけに関心がある」場合、片側検定を用いることも考えられます。
- \(Z_{1 – \alpha} = 1.6449\)
解説
4.1 「平均との差 ÷ SD」の意味
|Δ| = 0.71 は、「ノイズ(ばらつき)に対して、差がどれくらい大きいか」を表します。一般に、効果量Δが小さいほど必要Nは増えます。
4.2 なぜt検定なのにZを使っているか?
サンプルサイズ設計では、最初の近似としてZ (正規近似) を用いることが多いです。実務ではソフトウェアがt分布を反映した反復計算を行うこともありますが、本稿では教科書式の標準形としてZを用いて説明しています。
4.3 式の「+ Z²/2」って何?
Z²/2 は、母分散が未知で標本SDを用いることによる影響を補正するための近似項として理解すると分かりやすいです (厳密解ではなく近似式の一部)。
4.4 片側にするとNが減る理由
両側は「上がっても下がっても有意」を判定するため臨界値が厳しくなります(1.96)。片側は「低下方向だけ」を見るため臨界値が緩み(1.6449)、必要Nが 18名 → 14名 と小さくなります。
4.5 Rで実装してみる
今回は、近似式を関数化して、計算してみます。
# ===============================================
# 1標本t検定(近似式)のサンプルサイズ
# N ≈ ((Z + Zpower)^2)/Δ^2 + Z^2/2
# two-sided: Z = qnorm(1 - α/2)
# one-sided: Z = qnorm(1 - α)
# ===============================================
n_onesample_t_approx <- function(delta,
alpha = 0.05,
power = 0.80,
alternative = c("two.sided", "one.sided"),
ceil_n = TRUE) {
alternative <- match.arg(alternative)
delta <- abs(delta)
if (delta <= 0) stop("delta must be > 0")
z_power <- qnorm(power)
z_alpha <- switch(
alternative,
"two.sided" = qnorm(1 - alpha / 2),
"one.sided" = qnorm(1 - alpha)
)
n_raw <- ((z_alpha + z_power)^2) / (delta^2) + (z_alpha^2) / 2
if (ceil_n) n <- ceiling(n_raw) else n <- n_raw
out <- list(
n = n,
n_raw = n_raw,
delta = delta,
alpha = alpha,
power = power,
alternative = alternative,
z_alpha = z_alpha,
z_power = z_power
)
class(out) <- "n_onesample_t_approx"
out
}
print.n_onesample_t_approx <- function(x, ...) {
cat("One-sample t-test (approx)\n")
cat(" alternative:", x$alternative, "\n")
cat(" alpha :", x$alpha, "\n")
cat(" power :", x$power, "\n")
cat(" delta :", x$delta, "\n")
cat(" Z_alpha :", signif(x$z_alpha, 6), "\n")
cat(" Z_power :", signif(x$z_power, 6), "\n")
cat(" N (raw) :", signif(x$n_raw, 6), "\n")
cat(" N (ceil) :", x$n, "\n")
invisible(x)
}
# ===============================================
# 今回の設定: Δ=0.71, α=0.05, power=0.80
# ===============================================
res_two <- n_onesample_t_approx(delta = 0.71, alpha = 0.05, power = 0.80,
alternative = "two.sided")
res_one <- n_onesample_t_approx(delta = 0.71, alpha = 0.05, power = 0.80,
alternative = "one.sided")
res_two
res_one
結果は・・・
> res_two
One-sample t-test (approx)
alternative: two.sided
alpha : 0.05
power : 0.8
delta : 0.71
Z_alpha : 1.95996
Z_power : 0.841621
N (raw) : 17.4908
N (ceil) : 18
> res_one
One-sample t-test (approx)
alternative: one.sided
alpha : 0.05
power : 0.8
delta : 0.71
Z_alpha : 1.64485
Z_power : 0.841621
N (raw) : 13.6173
N (ceil) : 14
同じ計算ができました。
まとめ
本稿では、既知の集団平均値に対して、介入後の平均値が有意に異なることを示すための 1標本t検定のサンプルサイズ計算を解説しました。
今回の例 (境界域SBP 130–139 mmHg、平均134.5、SD 7.0、目標差 −5 mmHg) では、
- 効果量 |Δ| = 0.71
- 両側 α=0.05、検出力0.80 → 18名
- 片側 α=0.05、検出力0.80 → 14名
となりました。
片側検定は必要サンプルサイズを削減できますが、採用には理論的根拠 (方向性が事前に明確である、逆方向の悪化を主要な関心から除外できる等) が必要です。検証的な試験では両側検定が標準とされることも多いため、研究目的と整合するかを検討しましょう。
なお、本手法は (概ね) 正規性を仮定した連続量の平均の検定に基づいています。分布の歪みや外れ値が強い場合、データ変換やロバスト手法、別の設計 (群間比較など) を検討することがあります。
この考え方は血圧以外にも、HbA1c、LDLコレステロール、体重・BMI、認知機能スコアなどの連続量指標に応用できます。