R语言Synth包合成控制法不平衡面板错误排查求助
使用R语言Synth包构建合成控制组时的不平衡面板错误问题
数据集与研究目标
处理名为company_data_with_beta_2的企业季度数据集,包含财务指标与企业特征,目标是通过Synth包构建合成控制组开展处理效应研究。数据集关键字段:
Treatment_Control:标记处理组(1)和控制组(0)time:标记处理前后(1=处理后,0=处理前)
合成控制组预测变量
Firm_SizeFixed_Assets_RatioLeverageRevenue_Growth
问题描述
执行Synth包的dataprep函数时,反复触发不平衡面板错误:
Your panel, as described by unit.variable and time.variable, is unbalanced. Balance it and run again.
已采取的步骤
- 清理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)
- 尝试平衡面板数据
# 统计各企业的时间区间覆盖情况 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.") }
- 执行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
相关产品推荐
相关产品推荐

