tidysynth中post_mspe与pre_mspe计算方法咨询
探究tidysynth中pre_mspe与post_mspe的计算逻辑,重点解析post_mspe
核心计算逻辑
tidysynth中的MSPE(均方预测误差)本质是处理组真实观测值与合成控制组预测值的残差平方的平均值,具体划分:
pre_mspe:干预前(i_time之前的所有时间点),处理组真实值与合成值的残差平方的均值post_mspe:干预后(i_time及之后的所有时间点),处理组真实值与合成值的残差平方的均值
你手动计算结果不符,大概率是忽略了数据提取、时间范围划分或安慰剂组干扰这些细节,以下是验证复现步骤:
复现与验证步骤
1. 提取处理组与合成组的时间序列数据
首先用grab()获取核心对比数据,避免手动计算合成值的误差:
# 提取原始处理组与合成组的时间序列 synth_ts <- synth_data %>% grab(type = "original")
该数据框包含unit(处理组为"lyndhurst, nj",合成组为"lyndhurst, nj_synthetic")、week、pass_rate三列。
2. 划分干预时段并计算残差平方
# 定义干预时间点 intervention_date <- as.Date("2024-10-06") # 分离处理组真实值与合成组预测值 treated_real <- synth_ts %>% filter(unit == "lyndhurst, nj") %>% select(week, pass_rate) %>% rename(treated = pass_rate) synthetic_pred <- synth_ts %>% filter(unit == "lyndhurst, nj_synthetic") %>% select(week, pass_rate) %>% rename(synthetic = pass_rate) # 合并数据并计算残差平方 mspe_data <- treated_real %>% left_join(synthetic_pred, by = "week") %>% mutate(residual_sq = (treated - synthetic)^2) %>% mutate(period = ifelse(week < intervention_date, "pre", "post"))
3. 手动计算MSPE并与工具输出对比
# 手动计算MSPE manual_mspe <- mspe_data %>% group_by(period) %>% summarise(mspe = mean(residual_sq, na.rm = TRUE)) # 提取tidysynth输出的MSPE(仅保留处理组) tool_mspe <- synth_data %>% grab_significance() %>% filter(unit == "lyndhurst, nj") %>% select(unit, pre_mspe, post_mspe)
此时对比manual_mspe与tool_mspe的结果,应当完全一致。
常见偏差原因
- 混淆了处理组与安慰剂组:
generate_placebos = TRUE会生成所有安慰剂组的MSPE,需通过filter(unit == "lyndhurst, nj")筛选目标处理组结果 - 时间范围错误:
post_mspe包含i_time当天及之后所有时间点,不能仅计算部分时段 - 缺失值忽略:tidysynth计算时自动忽略缺失值(
na.rm = TRUE),手动计算需同步设置该参数
内容的提问来源于stack exchange,提问作者Nick Knauer
相关产品推荐
相关产品推荐

