You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用tidysynth构建合成控制模型时遇‘仅指定一个处理单元’错误求助

合成控制法(tidysynth包)错误排查:"Please specify only one treated unit"

问题重现

代码运行后触发错误:

Error in synth_method(treatment_unit_covariates = treatment_unit_covariates, :
Please specify only one treated unit.

错误原因

  1. 日期参数写法错误:你在i_time、time_window、optimization_window中使用的2009-10-19会被R解析为数值减法运算(2009-10-19=1980),而非日期值。这会导致程序识别的时间范围完全偏离预期,进而引发处理单元的识别逻辑混乱。
  2. 时间变量类型错误:用strptime()将year转换为POSIXlt类型,该类型是列表结构,tidysynth无法正确处理,会干扰单元-时间的分组逻辑。
  3. 语法格式问题:最后一行的%>%单独成行,可能导致管道解析异常(虽非直接诱因,但需修正)。

修正方案

步骤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:20:49