跳到内容

第 12 卷 / 第 8 章 / 第 2 课

8.2 随机实验、ITT 与干扰:分配处理不等于接受处理 ​

新的资源提醒系统准备上线。若把历史数据随机加一列 treatment,再比较已有结果,两组差异没有实验含义:随机数并没有改变任何人的经历。真正的实验需要在处理发生前随机分配,并记录分配怎样影响后续暴露与结果。

本课目标 ​

  • 用潜在结果定义估计目标;
  • 选择随机化单位并执行可复现分配;
  • 区分 intention-to-treat 与实际接受处理的效应;
  • 处理聚类、干扰、失访和多次查看结果。

1. 先定义处理、结果与估计量 ​

对每个单位 i,记:

  • Yi(1):被分配提供方案时的潜在结果;
  • Yi(0):被分配对照方案时的潜在结果。

个体处理效应 Yi(1)−Yi(0) 无法直接观察,因为同一单位只处于一种状态。实验常估计平均处理效应:

ATE=E[Y(1)−Y(0)].

这里用 Z 表示分配,用 D 表示实际接受。上述潜在结果按分配定义,ATE 因而是分配方案的平均效应;只有依从性等条件使分配与接受一致时,才可直接解释成接受处理的效应。

在随机化前写清:

  • 处理版本、强度和开始时间;
  • 主要结果、单位、测量窗口;
  • 目标总体和分析单位;
  • 主要 estimand 是分配效应还是实际接受效应;
  • 排除、失访和异常处理规则。

模糊的“看看提醒是否有效”无法指导设计与分析。

2. 随机化带来什么 ​

正确随机化使分配与潜在结果独立;区组随机化是在给定区组后独立。按设计比较两组,才能估计分配效应。“潜在结果”包含处理可能造成的后续结果,不是只指处理前测量值。

一次有限样本仍可能出现协变量不平衡。不要把每个平衡检验的 p 值当实验成败;应核查随机化实现、报告标准化差异,并对预先指定的强预测变量做精度调整。

随机化并不自动解决:错误测量、失访、串组、干扰、执行偏差和目标总体代表性。

3. 选择随机化单位 ​

若同组成员会转发提醒,个人的结果就可能受他人分配影响。可考虑按团队或站点随机,但仍需检查跨组溢出;聚类边界不会自动挡住消息。

聚类随机实验的有效样本量主要取决于聚类数和组内相关,而不只是总人数。分析时标准误也要按随机化单位聚类。

分层/区组随机可让区域、基线风险等关键变量在两组更平衡:

python
import numpy as np
import pandas as pd

def blocked_assignment(frame, block_col, seed=42):
    if frame.empty or not frame.index.is_unique or frame.index.hasnans:
        raise ValueError("nonempty frame with unique, nonmissing unit IDs required")
    if frame[block_col].isna().any():
        raise ValueError("missing block")
    rng = np.random.default_rng(seed)
    assignments = []
    for _, group in frame.groupby(block_col, sort=True, observed=True):
        ids = group.sort_index().index.to_numpy()
        if len(ids) < 2 or len(ids) % 2:
            raise ValueError("this design requires even block sizes of at least two")
        treated_ids = rng.permutation(ids)[:len(ids) // 2]
        z = pd.Series(0, index=ids, dtype=int)
        z.loc[treated_ids] = 1
        assignments.append(z)
    return pd.concat(assignments).reindex(frame.index)

units = pd.DataFrame(
    {"region": ["east"] * 6 + ["west"] * 6},
    index=pd.Index([f"unit-{i:02d}" for i in range(12)], name="unit_id"),
)
units["assigned_treatment"] = blocked_assignment(units, "region")
print(units.groupby("region")["assigned_treatment"].agg(["sum", "count"]))
# east: sum=3, count=6; west: sum=3, count=6

生产实验还要保存种子、候选单位快照、分层变量、分配时间和执行日志。随机分配代码应在结果产生前运行。

例子明确限制为每个区组偶数个单位、两组各半。奇数区组要事先设计分配概率,不能直接向下取整,让单个单位区组永远进不了处理组。函数按唯一单位 ID 排序并在调用内建立随机数生成器,因此相同名单换行顺序不会改变分配。

4. Difference in means 与回归调整 ​

完全随机实验的基本估计量是:

τ^=Y¯Z=1−Y¯Z=0.

可以加入预处理协变量提高精度,但变量和模型最好预先指定。标准误要与随机化设计一致;聚类随机就不能使用逐行独立标准误。

区组分配比例不同时,应先估计区组内效应,再按目标总体的区组比例汇总。聚类随机实验也要说明目标是平均个人效应还是平均群效应,群大小不同时两者不一样。

同时报告效应量、置信区间和原始组均值,而不是只报告 p 值。二元结果还应根据决策需要报告风险差、风险比或 odds ratio,三者含义不同。

5. ITT:按分配分析 ​

有人收到提醒却关闭通知,也有人在对照组看到同伴转发。按实际是否看到提醒重新分组,会破坏随机化。

**Intention-to-treat(ITT)**按原始随机分配比较,不论实际依从性。它估计“采用并提供这个方案”的政策效果,通常是主要分析。

Per-protocol 或 as-treated 比较容易受依从动机混杂。若要估计实际接受处理的效应,需要额外假设和方法;随机分配可作为工具变量,但不能跳过排除限制、独立性和弱工具诊断。

下面是构造的零效应数据,用来展示重新分组的后果,不是从历史表制造实验。初始两组基线各半;处理组 50 人中,10 个低基线个体不依从,即 20%:

python
baseline = np.repeat([0, 1], 50)
assigned = np.tile([0, 1], 50)
received = assigned.copy()
noncompliers = np.flatnonzero((assigned == 1) & (baseline == 0))[:10]
received[noncompliers] = 0
outcome = baseline.copy()
itt = outcome[assigned == 1].mean() - outcome[assigned == 0].mean()
as_treated = outcome[received == 1].mean() - outcome[received == 0].mean()
print(round(itt, 6), round(as_treated, 6))
# 0.0 0.208333

结果完全等于基线,所以 ITT 为 0;as-treated 却得到 20.83 个百分点,差异来自重新分组后的人员构成。

6. 干扰与溢出 ​

只写 Yi(1) 和 Yi(0) 隐含了无干扰及处理版本明确等条件。有干扰时,结果可能依赖整组分配向量;此时需要重新定义直接、间接或覆盖率效应。Hudgens 与 Halloran 的论文 给出了两阶段随机化下的效应定义。

可选设计包括:

  • 按可能互相影响的集群随机;
  • 两阶段随机,分别估计直接效应和覆盖率效应;
  • 设置地理或网络缓冲;
  • 明确定义处理版本并测量实际暴露。

有干扰时,“处理效应”必须说明是直接、间接、总体还是饱和度效应。

7. 失访与结果缺失 ​

若处理使不满意的人更容易退出,完整案例比较会有偏。实验中应:

  • 对两组报告失访率与原因;
  • 尽可能从独立来源取得主要结果;
  • 保留随机分配单位进入 ITT 分析;
  • 在可信缺失假设下做加权或插补;
  • 对无法观测的差异给出界限或敏感性分析。

“两组失访率相近”也不证明失访机制相同。

保留单位的分配记录不等于取得了缺失结果。完整案例计算不会因为标上 ITT 就变成完整 ITT 估计;仍须说明缺失机制、估计方法和无法识别的部分。

8. 功效、MDE 与停止规则 ​

先按决策价值确定最小有意义效应,再结合基线率、方差、显著性水平、目标功效、分配比例及聚类设计规划样本量。MDE 是在这些设计条件下能以目标功效检出的最小效应,不能与最小有意义效应混为一谈。

固定预算下可反算 MDE,检查设计是否足够敏感。反复查看普通 p 值并在显著时停止会抬高假阳性率;应预设样本量,或采用有效的序贯设计与 alpha spending。

9. 实验分析计划 ​

text
研究问题与 estimand
实验单位、随机化单位与分层
处理/对照版本及执行检查
主要和次要结果、观察窗口
样本量、MDE、功效与停止规则
ITT 主分析及标准误方法
不依从、失访、干扰和异常规则
多重比较修正
异质性分析与预注册状态

常见误区 ​

  • 给历史表随机加分组列就是实验:随机化必须先于处理与结果。
  • 随机化保证本次样本完全平衡:它保证分配机制,不保证每次实现相等。
  • 按实际接受处理分析更真实:重新分组可能引入选择偏差。
  • 个人很多,聚类数少也有高功效:组内相关会显著减少有效信息。

练习 ​

  1. 为一次通知干预定义 treatment、主要 outcome、窗口与 ITT estimand。
  2. 比较个人随机与队伍随机的污染风险和所需标准误。
  3. 构造 20% 不依从数据,比较 ITT 与错误 as-treated 结果。
  4. 为每日查看指标的实验写出合法停止方案。

小结 ​

随机实验的力量来自事前分配,而不是数据表上的一列标记。估计目标、随机化单位、依从性、干扰和停止规则共同决定结论能否解释为因果效应。

下一课讨论不能随机化时的识别:DAG 不是装饰图,匹配和工具变量也不会自动消除混杂。

Built with VitePress | Software Systems Atlas