使用tidysynth构建合成控制模型时遇‘仅指定一个处理单元’错误求助
合成控制法(tidysynth包)错误排查:"Please specify only one treated unit"
问题重现
代码运行后触发错误:
Error in synth_method(treatment_unit_covariates = treatment_unit_covariates, :
Please specify only one treated unit.
错误原因
- 日期参数写法错误:你在
i_time、time_window、optimization_window中使用的2009-10-19会被R解析为数值减法运算(2009-10-19=1980),而非日期值。这会导致程序识别的时间范围完全偏离预期,进而引发处理单元的识别逻辑混乱。 - 时间变量类型错误:用
strptime()将year转换为POSIXlt类型,该类型是列表结构,tidysynth无法正确处理,会干扰单元-时间的分组逻辑。 - 语法格式问题:最后一行的
%>%单独成行,可能导致管道解析异常(虽非直接诱因,但需修正)。
修正方案
步骤1:修正时间变量类型
将年份转换为Date类型(统一用每年1月1日作为日期锚点),替代POSIXlt类型:
synth$year <- as.Date(paste0(synth$year, "-01-01"))
步骤2:修正日期参数
所有时间相关参数需用as.Date()包裹正确的日期字符串,避免被解析为数值运算。
完整修正代码
# 导入数据 synth <- read.csv("https://raw.githubusercontent.com/FDobkin/coal_paper/main/synth_data.csv") # 将年份转换为Date类型 synth$year <- as.Date(paste0(synth$year, "-01-01")) synth_out <- synth %>% synthetic_control( outcome = saleprice, unit = fips, time = year, i_unit = 47145, i_time = as.Date("2009-10-19"), generate_placebos = TRUE ) %>% generate_predictor( time_window = as.Date("2000-10-19"):as.Date("2009-10-19"), population = pop, white = white_p, age = age65p_p, rucc = rucc_code, income = median_income, unemploy = unemprate, laborforce = lfrate ) %>% generate_weights( optimization_window = as.Date("2000-10-19"):as.Date("2009-10-19"), margin_ipop = .02, sigf_ipop = 7, bound_ipop = 6 ) %>% generate_control()
额外检查
确认数据中处理单元47145在指定时间窗口内没有重复的unit-time组合,重复记录也可能导致单元识别异常。
内容的提问来源于stack exchange,提问作者coinbase_wells
相关产品推荐
相关产品推荐

