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

R语言Synth包合成控制法不平衡面板错误排查求助

使用R语言Synth包构建合成控制组时的不平衡面板错误问题

数据集与研究目标

处理名为company_data_with_beta_2的企业季度数据集,包含财务指标与企业特征,目标是通过Synth包构建合成控制组开展处理效应研究。数据集关键字段:

  • Treatment_Control:标记处理组(1)和控制组(0)
  • time:标记处理前后(1=处理后,0=处理前)

合成控制组预测变量

  • Firm_Size
  • Fixed_Assets_Ratio
  • Leverage
  • Revenue_Growth

问题描述

执行Synth包的dataprep函数时,反复触发不平衡面板错误:

Your panel, as described by unit.variable and time.variable, is unbalanced. Balance it and run again.

已采取的步骤

  1. 清理NA值并生成数据集子集
cds <- subset(company_data_with_beta_2, select = c("gvkey", "firmid", "time", "datadate", "Days_Sales_Outstanding", "NAICS_3digits", "Firm_Size", "Fixed_Assets_Ratio", "Leverage", "Revenue_Growth","Treatment_Control"))
# 删除含NA值的行
company_data_with_beta_2 <- na.omit(cds)
  1. 尝试平衡面板数据
# 统计各企业的时间区间覆盖情况
firm_time_count <- table(company_data_with_beta_2$firmid, company_data_with_beta_2$time)

# 筛选出覆盖所有时间区间的企业
complete_firmids <- rownames(firm_time_count)[apply(firm_time_count, 1, function(x) all(x > 0))]

# 生成平衡面板数据集
company_data_balanced <- company_data_with_beta_2[company_data_with_beta_2$firmid %in% complete_firmids, ]

# 验证面板是否平衡
firm_time_table_balanced <- table(company_data_balanced$firmid, company_data_balanced$time)
if(all(firm_time_table_balanced > 0)) {
  print("The panel is now balanced.")
} else {
  print("The panel is still unbalanced.")
}
  1. 执行dataprep函数
    完成上述步骤后,运行以下代码仍报错:
company_data_balanced <- as.data.frame(company_data_balanced)
dataprep.out <- dataprep(
  foo = company_data_balanced,
  predictors = c("Firm_Size", "Fixed_Assets_Ratio", "Leverage", "Revenue_Growth"),
  predictors.op = "mean",
  dependent = "Days_Sales_Outstanding",
  unit.variable = "firmid",
  time.variable = "time",
  treatment.identifier = single_treated_unit,
  controls.identifier = control_units_n,
  time.predictors.prior = 0,
  time.optimize.ssr = 0,
  unit.names.variable = "gvkey",
  time.plot = c(0, 1)
)

补充背景

为测试需求,选取单个处理单元和多个控制单元:

# 获取处理组企业的gvkey列表
treatment_units <- unique(company_data_balanced$gvkey[company_data_balanced$Treatment_Control == 1])
treatment_units_n <- unique(company_data_balanced$firmid[company_data_balanced$Treatment_Control == 1])
# 选取单个处理单元用于测试
single_treated_unit <- treatment_units[1]

# 获取控制组企业的gvkey列表
control_units <- unique(company_data_balanced$gvkey[company_data_balanced$Treatment_Control == 0])
control_units_n <- unique(company_data_balanced$firmid[company_data_balanced$Treatment_Control == 0])

已参考Synth包相关问题,将数据集转换为dataframe格式。

数据样本

数据集前200行示例:

head(company_data_balanced,n = 200)
   gvkey firmid time   datadate Days_Sales_Outstanding NAICS_3digits Firm_Size Fixed_Assets_Ratio Leverage Revenue_Growth Treatment_Control
1   1045   1045    0 2017-12-31                  60.27           481  9.269646               0.97     0.44          -0.03                 1
2   1045   1045    0 2018-03-31                  63.48           481  9.249657               0.95     0.41          -0.02                 1
3   1045   1045    0 2018-06-30                  60.85           481  9.362460               0.97     0.42           0.12                 1
...(其余数据省略)

数据集结构:

str(company_data_balanced)
'data.frame':   10853 obs. of  11 variables:
 $ gvkey                 : chr  "1045" "1045" "1045" "1045" ...
 $ firmid                : num  1045 1045 1045 1045 1045 ...
 $ time                  : num  0 0 0 0 0 0 0 0 0 1 ...
 $ datadate              : chr  "2017-12-31" "2018-03-31" "2018-06-30" "2018-09-30" ...
 $ Days_Sales_Outstanding: num  60.3 63.5 60.9 68.5 56.9 ...
 $ NAICS_3digits         : chr  "481" "481" "481" "481" ...
 $ Firm_Size             : num  9.27 9.25 9.36 9.36 9.3 ...
 $ Fixed_Assets_Ratio    : num  0.97 0.95 0.97 0.98 1 1.01 1 1.01 1.04 0.91 ...
 $ Leverage              : num  0.44 0.41 0.42 0.42 0.48 0.47 0.48 0.48 0.48 0.59 ...
 $ Revenue_Growth        : num  -0.03 -0.02 0.12 -0.01 -0.05 -0.03 0.13 0 -0.05 -0.64 ...
 $ Treatment_Control     : num  1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, "na.action")= 'omit' Named int [1:5905] 1 22 23 24 26 27 28 29 30 31 ...
  ..- attr(*, "names")= chr [1:5905] "1" "22" "23" "24" ...

内容的提问来源于stack exchange,提问作者synthetic_cds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:08:14