MENU

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

クラスターランダム化比較試験の基礎:研究デザインと適切なサンプルサイズ計算

従来のランダム化比較試験(RCT)は、個々の参加者をランダムにグループに割り付けることで、介入の効果を公平に評価するための強力な手法である。しかし、医療や教育の現場では、個人ではなくグループ(クラスター)単位で介入が行われることが少なくない。このような状況で個人のランダム化を行うと、倫理的、実務的な問題が生じたり、結果の解釈を誤ったりする可能性がある。そこで登場するのがクラスターランダム化比較試験(CRCT)である。本稿では、CRCTの概要、その必要性、具体的な応用例、統計解析における注意点、必要なサンプル数計算について解説する。

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

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

目次

クラスターランダム化比較試験の概要

クラスターランダム化比較試験(CRCT)とは、個人ではなく学校、病院、地域、病棟などの集団(クラスター)を単位として、介入群と対照群にランダムに割り付ける試験デザインである。これにより、介入がクラスター全体に適用される状況において、ランダム化の利点を維持しつつ、実環境に近い形での評価が可能となる。

CRCTが特に有効なのは、以下のようなケースである。

  • 介入が個人レベルでは適用困難な場合: 例えば、ある健康教育プログラムを学校全体に導入する場合など。
  • 介入によるコンタミネーション(contamination)のリスクがある場合: 同一のクラスター内で個人をランダム化すると、介入を受けた人が対照群の個人に影響を与えてしまう可能性(例:情報共有)がある場合。
  • 倫理的な配慮が必要な場合: 特定のグループ全体に介入を適用する方が倫理的に適切であると判断される場合。

クラスターを考慮しないとどのように不適切になるか

CRCTにおいてクラスター構造を適切に考慮しないと、主に以下の2つの点で不適切な結果を招く可能性がある。

1. 独立性の仮定違反と標準誤差の過小評価

従来のRCTでは、各参加者のデータは互いに独立していると仮定される。しかし、CRCTでは同一クラスター内の個人は、共通の環境や特性を共有しているため、互いに似通った結果を示す傾向がある。これを級内相関(Intraclass Correlation Coefficient: ICC)と呼ぶ。ICCが存在するにもかかわらず、クラスター構造を無視して解析を行うと、以下の問題が生じる。

  • 独立性の仮定違反: 統計解析の多くの手法はデータの独立性を前提としているが、クラスターデータではこの前提を満たしていない。
  • 標準誤差の過小評価: クラスター内のデータが似ているため、実質的なサンプルサイズは個人の数よりも少なくなるにもかかわらず、クラスターを無視すると、見かけ上、サンプルサイズが大きくなり、結果として標準誤差が過小評価される。
  • 第1種の過誤(偽陽性)の増加: 標準誤差の過小評価は、統計的有意差を過剰に検出しやすくなり、誤って介入効果があると結論付けてしまう可能性を高める。

2. サンプルサイズの計算の誤り

実質的なサンプルサイズが少なくなるという理由から、CRCTでは、個人のランダム化に比べてより大きなサンプルサイズが必要となる。なので、クラスター構造を考慮せずにサンプルサイズを計算すると、必要な検出力(真の効果を検出する能力)を確保できず、第2種の過誤(偽陰性)のリスクが高まる。つまり、真の効果があるにもかかわらず、それを見逃してしまう可能性が増大するわけである。

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

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

クラスターRCTが頻繁に使われる分野における具体例

看護分野における具体例

テーマ: 新しい患者教育プログラムが患者の自己効力感に与える影響

研究デザイン: クラスターランダム化比較試験

介入: 特定の病棟に所属する看護師に対して、新しい糖尿病患者教育プログラムを導入する。対照病棟では従来の教育を継続する。

クラスター: 各病棟

選択理由:

  • 介入の性質: 患者教育プログラムは、病棟内の看護師全体に研修として提供され、その病棟に入院する患者全体に適用されるため、個人単位でのランダム化は実用的でない。
  • コンタミネーションの回避: 同じ病棟内で一部の看護師だけが新しいプログラムを導入し、他の看護師が従来のプログラムを続けると、看護師間の情報交換によって介入が対照群に広がる可能性がある。病棟単位でランダム化することで、このリスクを低減できる。
  • 倫理的配慮: 特定の病棟全体で新しいプログラムを導入する方が、倫理的に受け入れられやすい場合がある。

教育分野における具体例

テーマ: アクティブラーニング導入が高校生の学習意欲に与える影響

研究デザイン: クラスターランダム化比較試験

介入: 特定の高等学校に属するクラスに対して、アクティブラーニングを導入する。対照クラスでは従来型の授業を継続する。

クラスター: 各クラス

選択理由:

  • 介入の性質: アクティブラーニングは、クラス単位で行われる授業形態であり、個人単位での適用は困難である。
  • コンタミネーションの回避: 同一の学校内で個人をランダム化すると、介入群の生徒と対照群の生徒が交流することで、学習方法や情報が共有され、対照群にも影響が及ぶ可能性がある。クラス単位でのランダム化により、このコンタミネーションを防ぐ。
  • 実用性: クラス単位で介入を導入する方が、学校運営や教師の負担が少なく、実用的である。

具体例のRによる計算例

ここでは、上記の看護分野および教育分野の例を想定し、クラスターランダム化比較試験における一般的なデータ構造と、それを考慮した解析の概念をRで示す。具体的には、クラスター効果を考慮できる混合効果モデル(Mixed-effects model)の基本的な使用例である。データは架空のものである。

看護分野の例(患者の自己効力感)

# 必要なパッケージをインストール&ロード(初回のみ)
# install.packages("lme4")
# install.packages("lmerTest")
# install.packages("dplyr")
library(lme4)
library(lmerTest)
library(dplyr) # データ操作のため

# 架空のデータセットを作成
set.seed(123) # 再現性のためのシード設定

# 20病棟(クラスター)を想定、各病棟に30人の患者
n_clusters_nursing <- 20
patients_per_cluster_nursing <- 30
n_total_patients_nursing <- n_clusters_nursing * patients_per_cluster_nursing

# 病棟IDと患者ID
df_nursing <- data.frame(
    patient_id = 1:n_total_patients_nursing,
    cluster_id = rep(1:n_clusters_nursing, each = patients_per_cluster_nursing)
)

# 介入群と対照群にランダムに病棟を割り付け
# 半数の病棟を介入群、半数を対照群に
treatment_clusters_nursing <- sample(1:n_clusters_nursing, n_clusters_nursing / 2)
df_nursing$group <- ifelse(df_nursing$cluster_id %in% treatment_clusters_nursing, "Intervention", "Control")

# 病棟ごとの自己効力感のベースラインを設定(級内相関をシミュレート)
# 病棟によって自己効力感の平均が異なるように設定
cluster_effect_nursing <- rnorm(n_clusters_nursing, mean = 0, sd = 2) # 病棟ごとのランダム効果
df_nursing$baseline_self_efficacy <- round(50 + cluster_effect_nursing[df_nursing$cluster_id] + rnorm(n_total_patients_nursing, mean = 0, sd = 5))

# 介入効果をシミュレート
# 介入群の自己効力感が平均的に5ポイント増加すると仮定
intervention_effect_nursing <- ifelse(df_nursing$group == "Intervention", 5, 0)

# 結果変数(治療後の自己効力感)
df_nursing$post_self_efficacy <- round(df_nursing$baseline_self_efficacy + intervention_effect_nursing + rnorm(n_total_patients_nursing, mean = 0, sd = 8))

解析例1:

# 1. クラスターを考慮しない解析(不適切な方法)
# 単純な線形回帰モデル
lm_model_incorrect_nursing <- lm(post_self_efficacy ~ group, data = df_nursing)
summary(lm_model_incorrect_nursing)

実行結果:

> # 1. クラスターを考慮しない解析(不適切な方法)
> # 単純な線形回帰モデル
> lm_model_incorrect_nursing <- lm(post_self_efficacy ~ group, data = df_nursing)
> summary(lm_model_incorrect_nursing)

Call:
lm(formula = post_self_efficacy ~ group, data = df_nursing)

Residuals:
    Min      1Q  Median      3Q     Max 
-34.333  -6.333  -0.333   5.970  28.970 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)        50.3333     0.5552  90.665  < 2e-16 ***
groupIntervention   4.6967     0.7851   5.982 3.79e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9.616 on 598 degrees of freedom
Multiple R-squared:  0.05646,   Adjusted R-squared:  0.05489 
F-statistic: 35.79 on 1 and 598 DF,  p-value: 3.793e-09

このモデルは、個々の患者が独立していると仮定している。介入効果は統計的に有意($ P = 3.79 \times 10^{-9}$)に見えるかもしれないが、標準誤差(Std. Error = 0.7851)が過小評価されていて、有意になっている可能性がある。

解析例2:

# 2. クラスターを考慮した解析(混合効果モデル)
# post_self_efficacyを目的変数、groupを固定効果、cluster_idをランダム効果として指定
lmer_model_correct_nursing <- lmer(post_self_efficacy ~ group + (1 | cluster_id), data = df_nursing)
summary(lmer_model_correct_nursing)

実行結果:

> # 2. クラスターを考慮した解析(混合効果モデル)
> # post_self_efficacyを目的変数、groupを固定効果、cluster_idをランダム効果として指定
> lmer_model_correct_nursing <- lmer(post_self_efficacy ~ group + (1 | cluster_id), data = df_nursing)
> summary(lmer_model_correct_nursing)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: post_self_efficacy ~ group + (1 | cluster_id)
   Data: df_nursing

REML criterion at convergence: 4396.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.4251 -0.6314  0.0119  0.6674  2.7752 

Random effects:
 Groups     Name        Variance Std.Dev.
 cluster_id (Intercept)  6.688   2.586   
 Residual               86.421   9.296   
Number of obs: 600, groups:  cluster_id, 20

Fixed effects:
                  Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)        50.3333     0.9782 18.0000  51.455  < 2e-16 ***
groupIntervention   4.6967     1.3834 18.0000   3.395  0.00323 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
grpIntrvntn -0.707

このモデルでは、(1 | cluster_id)によって、各クラスター(病棟)が持つ固有の変動を考慮している。これにより、正しい標準誤差が推定され、介入効果の推定値がより信頼性の高いものとなる。lmerモデルの結果は、groupInterventionの推定値とその標準誤差、p値($ P = 0.00323 $)を確認する。特に、標準誤差がクラスターを考慮しないモデルと比較して大きくなっている(Std. Error = 1.3834 vs. 0.7851)。

ICC 計算例:

# ICC(級内相関)の計算(lme4モデルから取得)
# 分散成分からICCを計算
var_components_nursing <- as.data.frame(VarCorr(lmer_model_correct_nursing))
cluster_variance_nursing <- var_components_nursing$vcov[var_components_nursing$grp == "cluster_id"]
residual_variance_nursing <- var_components_nursing$vcov[var_components_nursing$grp == "Residual"]
icc_nursing <- cluster_variance_nursing / (cluster_variance_nursing + residual_variance_nursing)
cat(paste0("推定された級内相関 (ICC): ", round(icc_nursing, 3), "\n"))

実行結果:

> cat(paste0("推定された級内相関 (ICC): ", round(icc_nursing, 3), "\n"))
推定された級内相関 (ICC): 0.072

ICCが0より大きい場合、クラスター内のデータは互いに相関していることを示している。このICCの値が大きければ大きいほど、クラスター効果の考慮が重要になる。特に基準はないが、ICC の最大値が 1 ということから考えて、今回の 0.072 は大きくない値である。

教育分野の例(学習意欲)

# 必要なパッケージをインストール&ロード(初回のみ)
# install.packages("lme4")
# install.packages("lmerTest")
# install.packages("dplyr")
library(lme4)
library(lmerTest)
library(dplyr) # データ操作のため

# 架空のデータセットを作成
set.seed(456) # 再現性のためのシード設定

# 30クラス(クラスター)を想定、各クラスに25人の生徒
n_clusters_education <- 30
students_per_cluster_education <- 25
n_total_students_education <- n_clusters_education * students_per_cluster_education

# クラスIDと生徒ID
df_education <- data.frame(
  student_id = 1:n_total_students_education,
  cluster_id = rep(1:n_clusters_education, each = students_per_cluster_education)
)

# 介入群と対照群にランダムにクラスを割り付け
# 半数のクラスを介入群、半数を対照群に
treatment_clusters_education <- sample(1:n_clusters_education, n_clusters_education / 2)
df_education$group <- ifelse(df_education$cluster_id %in% treatment_clusters_education, "Intervention", "Control")

# クラスごとの学習意欲のベースラインを設定(級内相関をシミュレート)
# クラスによって学習意欲の平均が異なるように設定
cluster_effect_education <- rnorm(n_clusters_education, mean = 0, sd = 1.5) # クラスごとのランダム効果
df_education$baseline_motivation <- round(60 + cluster_effect_education[df_education$cluster_id] + rnorm(n_total_students_education, mean = 0, sd = 6))

# 介入効果をシミュレート
# 介入群の学習意欲が平均的に4ポイント増加すると仮定
intervention_effect_education <- ifelse(df_education$group == "Intervention", 4, 0)

# 結果変数(治療後の学習意欲)
df_education$post_motivation <- round(df_education$baseline_motivation + intervention_effect_education + rnorm(n_total_students_education, mean = 0, sd = 7))

解析例1:

# 1. クラスターを考慮しない解析(不適切な方法)
# 単純な線形回帰モデル
lm_model_incorrect_education <- lm(post_motivation ~ group, data = df_education)
summary(lm_model_incorrect_education)

実行結果:

> # 1. クラスターを考慮しない解析(不適切な方法)
> # 単純な線形回帰モデル
> lm_model_incorrect_education <- lm(post_motivation ~ group, data = df_education)
> summary(lm_model_incorrect_education)

Call:
lm(formula = post_motivation ~ group, data = df_education)

Residuals:
     Min       1Q   Median       3Q      Max 
-26.0453  -6.0507  -0.0507   6.7007  28.9547 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)        61.0507     0.4716  129.44  < 2e-16 ***
groupIntervention   2.9947     0.6670    4.49 8.25e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9.133 on 748 degrees of freedom
Multiple R-squared:  0.02624,   Adjusted R-squared:  0.02494 
F-statistic: 20.16 on 1 and 748 DF,  p-value: 8.253e-06

このモデルは、個々の生徒が独立していると仮定している。介入効果は統計的に有意($ P = 8.25 \times 10^{-6} $)に見えるかもしれないが、標準誤差が過小評価されている可能性がある。

解析例2:

# 2. クラスターを考慮した解析(混合効果モデル)
# post_motivationを目的変数、groupを固定効果、cluster_idをランダム効果として指定
lmer_model_correct_education <- lmer(post_motivation ~ group + (1 | cluster_id), data = df_education)
summary(lmer_model_correct_education)

実行結果:

> # 2. クラスターを考慮した解析(混合効果モデル)
> # post_motivationを目的変数、groupを固定効果、cluster_idをランダム効果として指定
> lmer_model_correct_education <- lmer(post_motivation ~ group + (1 | cluster_id), data = df_education)
> summary(lmer_model_correct_education)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: post_motivation ~ group + (1 | cluster_id)
   Data: df_education

REML criterion at convergence: 5439

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.8209 -0.6873  0.0156  0.7128  3.2312 

Random effects:
 Groups     Name        Variance Std.Dev.
 cluster_id (Intercept)  2.324   1.524   
 Residual               81.240   9.013   
Number of obs: 750, groups:  cluster_id, 30

Fixed effects:
                  Estimate Std. Error      df t value Pr(>|t|)    
(Intercept)        61.0507     0.6096 28.0000 100.154  < 2e-16 ***
groupIntervention   2.9947     0.8621 28.0000   3.474  0.00169 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
grpIntrvntn -0.707

このモデルでは、(1 | cluster_id)によって、各クラスター(クラス)が持つ固有の変動を考慮している。これにより、正しい標準誤差が推定され、介入効果の推定値がより信頼性の高いものとなる。lmerモデルの結果から、groupInterventionの推定値とその標準誤差、p値(P = 0.00169)を確認するとよい。特に、標準誤差がクラスターを考慮しないモデルと比較して大きくなっていることがわかる(Std. Error = 0.8621 vs. 0.6670)

ICC の計算例:

# ICC(級内相関)の計算(lme4モデルから取得)
# 分散成分からICCを計算
var_components_education <- as.data.frame(VarCorr(lmer_model_correct_education))
cluster_variance_education <- var_components_education$vcov[var_components_education$grp == "cluster_id"]
residual_variance_education <- var_components_education$vcov[var_components_education$grp == "Residual"]
icc_education <- cluster_variance_education / (cluster_variance_education + residual_variance_education)

cat(paste0("教育分野の推定された級内相関 (ICC): ", round(icc_education, 3), "\n"))

実行結果:

> cat(paste0("推定された級内相関 (ICC): ", round(icc_education, 3), "\n"))
推定された級内相関 (ICC): 0.028

ICCが0より大きい場合、クラスター内のデータは互いに相関していることを示している。このICCの値が大きければ大きいほど、クラスター効果の考慮が重要になる。ICC の最大値が1と考えると、0.028 は決して大きくはない。

クラスターランダム化比較試験に必要なサンプル数計算

CRCTにおけるサンプルサイズ計算は、通常のRCTよりも複雑である。複雑になる主な要因は級内相関(ICC)である。ICC が存在することで、実質的なサンプルサイズが減少し、より多くの参加者またはクラスターが必要になる。

CRCTのサンプルサイズ計算では、主に以下の要素を考慮する。

  • 期待される効果量(Effect Size): 介入によって期待される効果の大きさ。
  • 有意水準 (α): 第1種の過誤を許容する確率(通常 0.05)。
  • 検出力 (1−β): 真の効果が存在する場合に、それを検出できる確率(通常 0.80 または 0.90)。
  • 級内相関(ICC, ρ): 同一クラスター内のデータがどの程度相関しているかを示す指標。過去の研究やパイロットスタディから推定する。ICCが高いほど、必要なサンプルサイズは大きくなる。
  • クラスターあたりの平均参加者数(m): 各クラスターに含まれる個人の数。

デザイン効果(Design Effect: DEFF)

CRCTのサンプルサイズを計算する際に重要な概念がデザイン効果(Design Effect: DEFF)である。DEFFは、級内相関を考慮しない場合のサンプルサイズに掛ける補正係数であり、以下の式で計算される。

$$ \text{DEFF} = 1 + (m – 1) \rho $$

ここで、m はクラスターあたりの平均参加者数、ρ は級内相関である。

このDEFFは常に1以上となり、クラスター内の相関が強い(ρが大きい)、またはクラスターあたりの参加者数が多い(mが大きい)ほど、デザイン効果は大きくなる。

そして、CRCTで必要なサンプルサイズは、通常の個人ランダム化RCTで計算されたサンプルサイズにDEFFを乗じることで得られる。

$$ N_{\text{CRCT}} = N_{\text{RCT}} \times \text{DEFF} = N_{\text{RCT}} \times (1 + (m – 1) \rho) $$

ここで、$ N_{\text{CRCT}} $ は CRCTで必要な総個人数、$ N_{\text{RCT}}$ は個人ランダム化 RCT で必要な総個人数。

Rによる計算例

ここでは、simrpwrパッケージなど、サンプルサイズ計算に役立つRパッケージの一部を利用した例を示す。

看護分野のCRCTサンプル数計算例

# 必要なパッケージをインストール&ロード(初回のみ)
# install.packages("pwr") # 通常のRCTのサンプルサイズ計算に利用

library(pwr)

# --- Step 1: 通常の個人ランダム化RCTで必要なサンプルサイズを計算 ---
# 想定されるシナリオ:
# - 有意水準 (alpha) = 0.05
# - 検出力 (power) = 0.80
# - 効果量 (Cohen's d) = 0.5 (中程度の効果量)

n_per_group_RCT_nursing <- pwr.t.test(d = 0.5, sig.level = 0.05, power = 0.80, type = "two.sample", alternative = "two.sided")$n

cat(paste0("個人のランダム化RCTで各群に必要なサンプルサイズ: ", ceiling(n_per_group_RCT_nursing), "人\n"))
cat(paste0("個人のランダム化RCTで必要なサンプルサイズ合計: ", ceiling(n_per_group_RCT_nursing) * 2, "人\n\n"))

# --- Step 2: デザイン効果 (DEFF) を計算し、CRCTのサンプルサイズを推定 ---
# 想定されるCRCTのパラメータ:
# - クラスターあたりの平均参加者数 (m) = 30人 (看護分野の例の病棟あたりの患者数)
# - 級内相関 (ICC, rho) = 0.06 (よく見られる値、過去の研究に基づく推定、今回は上記具体例の値を使用)

m_nursing <- 30 # クラスターあたりの平均参加者数
rho_nursing <- 0.06 # 級内相関 (ICC)

# デザイン効果 (DEFF) の計算
design_effect_nursing <- 1 + (m_nursing - 1) * rho_nursing
cat(paste0("計算されたデザイン効果 (DEFF): ", round(design_effect_nursing, 2), "\n\n"))

# CRCTで各群に必要な総個人数
n_per_group_CRCT_nursing <- ceiling(n_per_group_RCT_nursing * design_effect_nursing)
cat(paste0("CRCTで各群に必要な総個人数: ", n_per_group_CRCT_nursing, "人\n"))
cat(paste0("CRCTで必要な個人数合計: ", n_per_group_CRCT_nursing * 2, "人\n\n"))

# CRCTで各群に必要なクラスター数
# 各群の総個人数をクラスターあたりの人数で割る
n_clusters_per_group_CRCT_nursing <- ceiling(n_per_group_CRCT_nursing / m_nursing)
cat(paste0("CRCTで各群に必要なクラスター数: ", n_clusters_per_group_CRCT_nursing, "クラスター\n"))
cat(paste0("CRCTで必要なクラスター数合計: ", n_clusters_per_group_CRCT_nursing * 2, "クラスター\n"))

実行結果:

> cat(paste0("個人のランダム化RCTで各群に必要なサンプルサイズ: ", ceiling(n_per_group_RCT_nursing), "人\n"))
個人のランダム化RCTで各群に必要なサンプルサイズ: 64人
> cat(paste0("個人のランダム化RCTで必要なサンプルサイズ合計: ", ceiling(n_per_group_RCT_nursing) * 2, "人\n\n"))
個人のランダム化RCTで必要なサンプルサイズ合計: 128人

クラスターを考えない場合、各群 64 人、両群で 128人必要と計算されたとしよう。

> # デザイン効果 (DEFF) の計算
> design_effect_nursing <- 1 + (m_nursing - 1) * rho_nursing
> cat(paste0("計算されたデザイン効果 (DEFF): ", round(design_effect_nursing, 2), "\n\n"))
計算されたデザイン効果 (DEFF): 2.74

クラスターあたりの人数が 30 人、ICC が 0.06 とすると、デザイン効果は 2.74 と計算される。

> # CRCTで各群に必要な総個人数
> n_per_group_CRCT_nursing <- ceiling(n_per_group_RCT_nursing * design_effect_nursing)
> cat(paste0("CRCTで各群に必要な総個人数: ", n_per_group_CRCT_nursing, "人\n"))
CRCTで各群に必要な総個人数: 175人
> cat(paste0("CRCTで必要な個人数合計: ", n_per_group_CRCT_nursing * 2, "人\n\n"))
CRCTで必要な個人数合計: 350人

デザイン効果を、各群 64 人、両群 128 人に掛け合わせると、各群 175 人、両群 350 人必要と計算される。

> # CRCTで各群に必要なクラスター数
> # 各群の総個人数をクラスターあたりの人数で割る
> n_clusters_per_group_CRCT_nursing <- ceiling(n_per_group_CRCT_nursing / m_nursing)
> cat(paste0("CRCTで各群に必要なクラスター数: ", n_clusters_per_group_CRCT_nursing, "クラスター\n"))
CRCTで各群に必要なクラスター数: 6クラスター
> cat(paste0("CRCTで必要なクラスター数合計: ", n_clusters_per_group_CRCT_nursing * 2, "クラスター\n"))
CRCTで必要なクラスター数合計: 12クラスター

1 クラスターが 30 人 とすると、各群 6 クラスター、両群で 12 クラスター必要と計算される。

教育分野のCRCTサンプル数計算例

# 必要なパッケージをインストール&ロード(初回のみ)
# install.packages("pwr") # 通常のRCTのサンプルサイズ計算に利用

library(pwr)

# --- Step 1: 通常の個人ランダム化RCTで必要なサンプルサイズを計算 ---
# 想定されるシナリオ:
# - 有意水準 (alpha) = 0.05
# - 検出力 (power) = 0.80
# - 効果量 (Cohen's d) = 0.4 (やや小さめの効果量、教育分野ではこのくらいが現実的であることが多い)

n_per_group_RCT_education <- pwr.t.test(d = 0.4, sig.level = 0.05, power = 0.80, type = "two.sample", alternative = "two.sided")$n

cat(paste0("個人のランダム化RCTで各群に必要なサンプルサイズ: ", ceiling(n_per_group_RCT_education), "人\n"))
cat(paste0("個人のランダム化RCTで必要なサンプルサイズ合計: ", ceiling(n_per_group_RCT_education) * 2, "人\n\n"))

# --- Step 2: デザイン効果 (DEFF) を計算し、CRCTのサンプルサイズを推定 ---
# 想定されるCRCTのパラメータ:
# - クラスターあたりの平均参加者数 (m) = 25人 (教育分野の例のクラスあたりの生徒数)
# - 級内相関 (ICC, rho) = 0.03 (教育分野では比較的高いICC(例:0.10 程度)が観察されることがあるが、今回は上記具体例の低めの値を使用)

m_education <- 25 # クラスターあたりの平均参加者数
rho_education <- 0.03 # 級内相関 (ICC)

# デザイン効果 (DEFF) の計算
design_effect_education <- 1 + (m_education - 1) * rho_education
cat(paste0("計算されたデザイン効果 (DEFF): ", round(design_effect_education, 2), "\n\n"))

# CRCTで各群に必要な総個人数
n_per_group_CRCT_education <- ceiling(n_per_group_RCT_education * design_effect_education)
cat(paste0("CRCTで各群に必要な総個人数: ", n_per_group_CRCT_education, "人\n"))
cat(paste0("CRCTで必要な個人数合計: ", n_per_group_CRCT_education * 2, "人\n\n"))

# CRCTで各群に必要なクラスター数
# 各群の総個人数をクラスターあたりの人数で割る
n_clusters_per_group_CRCT_education <- ceiling(n_per_group_CRCT_education / m_education)
cat(paste0("CRCTで各群に必要なクラスター数: ", n_clusters_per_group_CRCT_education, "クラスター\n"))
cat(paste0("CRCTで必要なクラスター数合計: ", n_clusters_per_group_CRCT_education * 2, "クラスター\n"))

実行結果:

> cat(paste0("個人のランダム化RCTで各群に必要なサンプルサイズ: ", ceiling(n_per_group_RCT_education), "人\n"))
個人のランダム化RCTで各群に必要なサンプルサイズ: 100人
> cat(paste0("個人のランダム化RCTで必要なサンプルサイズ合計: ", ceiling(n_per_group_RCT_education) * 2, "人\n\n"))
個人のランダム化RCTで必要なサンプルサイズ合計: 200人

クラスターを考慮しないで計算すると各群 100 人必要と計算されたとしよう。

> # デザイン効果 (DEFF) の計算
> design_effect_education <- 1 + (m_education - 1) * rho_education
> cat(paste0("計算されたデザイン効果 (DEFF): ", round(design_effect_education, 2), "\n\n"))
計算されたデザイン効果 (DEFF): 1.72

次に、1 クラスター 25 人、ICC 0.03 程度として、デザイン効果を計算すると 1.72 となる。

> # CRCTで各群に必要な総個人数
> n_per_group_CRCT_education <- ceiling(n_per_group_RCT_education * design_effect_education)
> cat(paste0("CRCTで各群に必要な総個人数: ", n_per_group_CRCT_education, "人\n"))
CRCTで各群に必要な総個人数: 171人
> cat(paste0("CRCTで必要な個人数合計: ", n_per_group_CRCT_education * 2, "人\n\n"))
CRCTで必要な個人数合計: 342人

デザイン効果をかけ合わせると、各群 171 人、両群で 342 人と計算される。

> # CRCTで各群に必要なクラスター数
> # 各群の総個人数をクラスターあたりの人数で割る
> n_clusters_per_group_CRCT_education <- ceiling(n_per_group_CRCT_education / m_education)
> cat(paste0("CRCTで各群に必要なクラスター数: ", n_clusters_per_group_CRCT_education, "クラスター\n"))
CRCTで各群に必要なクラスター数: 7クラスター
> cat(paste0("CRCTで必要なクラスター数合計: ", n_clusters_per_group_CRCT_education * 2, "クラスター\n"))
CRCTで必要なクラスター数合計: 14クラスター

各群 171 人をクラスター 25 人で割ると、7 クラスター必要と計算される。両群合計すると 14 クラスター必要となる。

クラスターを用いたほうがサンプル数が少なく済む気がする誤解の根拠

ところで、「クラスターを用いた方がサンプル数が少なく済む」というように思われていることはないだろうか。この誤解は、クロスオーバー試験のような「個人内比較」のデザインと混同されていることから生じている可能性がある。

クロスオーバー試験とは?

クロスオーバー試験は、同じ被験者に複数の介入を異なる時期に順序を変えてすべて経験してもらう研究デザインである。例えば、ある薬Aと薬Bの効果を比較する場合、被験者の一部にはまず薬Aを投与し、一定期間の休薬期間を経てから薬Bを投与し、別の被験者にはまず薬Bを投与し、休薬期間を経てから薬Aを投与する。

このとき、利点として、同じ被験者内で比較するため、被験者間のばらつき(個人差)が統計的に除去され、少ない被験者数で高い統計的検出力を得られる可能性がある。これは、被験者自身が対照となるためである。そして、このデータを解析するときも、クラスターランダム化比較試験と同様に、変量効果を用いる。

なぜクラスターランダム化比較試験でサンプル数が増えるのか?

一方、クラスターランダム化比較試験(CRCT) では、通常、同じクラスター内の参加者には同じ介入がなされる。例えば、看護分野の例で「患者全体を新しい教育プログラム群と従来群に分ける」場合、新しい教育プログラム病棟(クラスター)の患者は新しい教育プログラムのみを、従来病棟(クラスター)の患者は従来のプログラムのみを実施する。

この場合、同じクラスターの患者のアウトカムのデータは、独立したデータではなく、強い相関を持っている。つまり、あるクラスターの患者から得られる情報は、同じクラスターの他の患者から得られる情報とかなりの部分が重複して得られるため、1つのクラスターから例えば 2人のデータを得ても、統計的な情報量としては独立した2人の患者分の情報にはならない。これが、前述の級内相関係数(ICC) として表現されるデータ間の相関である。

したがって、CRCTでは、この情報量の重複を補うために、より多くのクラスター(この場合はより多くの病棟)が必要になる。クロスオーバー試験が個人内の比較で効率的に個人差を排除するのに対し、CRCTはクラスター間での比較となるため、クラスター内の相関(クラスター内の個人が独立でないこと)を考慮しなければならず、結果としてサンプル数が増加するというわけである。

まとめ

クラスターランダム化比較試験は、医療や教育など、グループ単位で介入が行われる現実世界の複雑な状況において、介入効果を科学的かつ倫理的に評価するための不可欠な研究デザインである。クラスター構造を適切に考慮しない解析は、統計的な誤りや誤った結論を導くリスクを高める。

CRCTを計画・実施する際には、級内相関(ICC)を考慮した適切なサンプルサイズ計算と、混合効果モデルなどのクラスター効果を考慮した統計解析手法の利用が極めて重要である。これにより、より信頼性の高いエビデンスを生成し、実践への適切な応用を可能にする。ただし、クラスター内相関によって、必要なサンプル数が増大する点は、試験実行上のハードルになりうることも忘れないようにしたい。

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

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

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

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

この記事を書いた人

統計 ER ブログ執筆者

元疫学研究者

コメント

コメントする

目次