8.2 随机实验、ITT 与干扰:分配处理不等于接受处理
新的资源提醒系统准备上线。若把历史数据随机加一列 treatment,再比较已有结果,两组差异没有实验含义:随机数并没有改变任何人的经历。真正的实验需要在处理发生前随机分配,并记录分配怎样影响后续暴露与结果。
本课目标
- 用潜在结果定义估计目标;
- 选择随机化单位并执行可复现分配;
- 区分 intention-to-treat 与实际接受处理的效应;
- 处理聚类、干扰、失访和多次查看结果。
1. 先定义处理、结果与估计量
对每个单位
:被分配提供方案时的潜在结果; :被分配对照方案时的潜在结果。
个体处理效应
这里用
在随机化前写清:
- 处理版本、强度和开始时间;
- 主要结果、单位、测量窗口;
- 目标总体和分析单位;
- 主要 estimand 是分配效应还是实际接受效应;
- 排除、失访和异常处理规则。
模糊的“看看提醒是否有效”无法指导设计与分析。
2. 随机化带来什么
正确随机化使分配与潜在结果独立;区组随机化是在给定区组后独立。按设计比较两组,才能估计分配效应。“潜在结果”包含处理可能造成的后续结果,不是只指处理前测量值。
一次有限样本仍可能出现协变量不平衡。不要把每个平衡检验的 p 值当实验成败;应核查随机化实现、报告标准化差异,并对预先指定的强预测变量做精度调整。
随机化并不自动解决:错误测量、失访、串组、干扰、执行偏差和目标总体代表性。
3. 选择随机化单位
若同组成员会转发提醒,个人的结果就可能受他人分配影响。可考虑按团队或站点随机,但仍需检查跨组溢出;聚类边界不会自动挡住消息。
聚类随机实验的有效样本量主要取决于聚类数和组内相关,而不只是总人数。分析时标准误也要按随机化单位聚类。
分层/区组随机可让区域、基线风险等关键变量在两组更平衡:
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 与回归调整
完全随机实验的基本估计量是:
可以加入预处理协变量提高精度,但变量和模型最好预先指定。标准误要与随机化设计一致;聚类随机就不能使用逐行独立标准误。
区组分配比例不同时,应先估计区组内效应,再按目标总体的区组比例汇总。聚类随机实验也要说明目标是平均个人效应还是平均群效应,群大小不同时两者不一样。
同时报告效应量、置信区间和原始组均值,而不是只报告 p 值。二元结果还应根据决策需要报告风险差、风险比或 odds ratio,三者含义不同。
5. ITT:按分配分析
有人收到提醒却关闭通知,也有人在对照组看到同伴转发。按实际是否看到提醒重新分组,会破坏随机化。
**Intention-to-treat(ITT)**按原始随机分配比较,不论实际依从性。它估计“采用并提供这个方案”的政策效果,通常是主要分析。
Per-protocol 或 as-treated 比较容易受依从动机混杂。若要估计实际接受处理的效应,需要额外假设和方法;随机分配可作为工具变量,但不能跳过排除限制、独立性和弱工具诊断。
下面是构造的零效应数据,用来展示重新分组的后果,不是从历史表制造实验。初始两组基线各半;处理组 50 人中,10 个低基线个体不依从,即 20%:
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. 干扰与溢出
只写
可选设计包括:
- 按可能互相影响的集群随机;
- 两阶段随机,分别估计直接效应和覆盖率效应;
- 设置地理或网络缓冲;
- 明确定义处理版本并测量实际暴露。
有干扰时,“处理效应”必须说明是直接、间接、总体还是饱和度效应。
7. 失访与结果缺失
若处理使不满意的人更容易退出,完整案例比较会有偏。实验中应:
- 对两组报告失访率与原因;
- 尽可能从独立来源取得主要结果;
- 保留随机分配单位进入 ITT 分析;
- 在可信缺失假设下做加权或插补;
- 对无法观测的差异给出界限或敏感性分析。
“两组失访率相近”也不证明失访机制相同。
保留单位的分配记录不等于取得了缺失结果。完整案例计算不会因为标上 ITT 就变成完整 ITT 估计;仍须说明缺失机制、估计方法和无法识别的部分。
8. 功效、MDE 与停止规则
先按决策价值确定最小有意义效应,再结合基线率、方差、显著性水平、目标功效、分配比例及聚类设计规划样本量。MDE 是在这些设计条件下能以目标功效检出的最小效应,不能与最小有意义效应混为一谈。
固定预算下可反算 MDE,检查设计是否足够敏感。反复查看普通 p 值并在显著时停止会抬高假阳性率;应预设样本量,或采用有效的序贯设计与 alpha spending。
9. 实验分析计划
研究问题与 estimand
实验单位、随机化单位与分层
处理/对照版本及执行检查
主要和次要结果、观察窗口
样本量、MDE、功效与停止规则
ITT 主分析及标准误方法
不依从、失访、干扰和异常规则
多重比较修正
异质性分析与预注册状态常见误区
- 给历史表随机加分组列就是实验:随机化必须先于处理与结果。
- 随机化保证本次样本完全平衡:它保证分配机制,不保证每次实现相等。
- 按实际接受处理分析更真实:重新分组可能引入选择偏差。
- 个人很多,聚类数少也有高功效:组内相关会显著减少有效信息。
练习
- 为一次通知干预定义 treatment、主要 outcome、窗口与 ITT estimand。
- 比较个人随机与队伍随机的污染风险和所需标准误。
- 构造 20% 不依从数据,比较 ITT 与错误 as-treated 结果。
- 为每日查看指标的实验写出合法停止方案。
小结
随机实验的力量来自事前分配,而不是数据表上的一列标记。估计目标、随机化单位、依从性、干扰和停止规则共同决定结论能否解释为因果效应。
下一课讨论不能随机化时的识别:DAG 不是装饰图,匹配和工具变量也不会自动消除混杂。