使用augsynth包运行交错合成控制时遇“x必须为数值型”错误求助
交错采纳场景下augsynth包multisynth函数报错:'x' must be numeric
问题描述
我用augsynth包针对交错采纳场景运行合成控制分析,严格遵循官方文档操作,但始终报错。已确认所有应属数值型的变量都是数值类型,仍收到如下错误:
> ppool_syn <- multisynth(y ~ treated, state_abb, year, nu = 0.5, t) Adding missing grouping variables: `state_abb` Adding missing grouping variables: `state_abb` Error in colMeans(X[!is.finite(trt), , drop = F], na.rm = TRUE): 'x' must be numeric`
尝试重新转换变量为数值型后问题依旧,可通过以下代码复现数据集:
# 创建数据集 df <- data.frame( state_abb = c(rep("AL", 10), rep("AR", 10), rep("AZ", 10), rep("CA", 10), rep("CO", 10), rep("FL", 10), rep("GA", 10), rep("IA", 10), rep("ID", 10), rep("IL", 10), rep("IN", 10), rep("KS", 10), rep("KY", 10), rep("LA", 10), rep("MD", 10), rep("ME", 10)), year = rep(2013:2022, 16), y = c( 0, 0, 0, 34, 26, 19, 28, 39, 45, 12, # AL 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, # AR 0, 0, 0, 11, 31, 27, 24, 45, 35, 16, # AZ 0, 0, 0, 0, 46, 83, 146, 247, 314, 213, # CA 0, 0, 0, 0, 0, 0, 0, 0, 27, 14, # CO 0, 19, 77, 250, 309, 341, 382, 430, 218, 92, # FL 0, 15, 32, 11, 41, 27, 40, 76, 55, 21, # GA 0, 0, 0, 0, 0, 11, 0, 22, 0, 0, # IA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, # ID 0, 0, 42, 298, 550, 651, 660, 839, 625, 435, # IL 0, 0, 0, 0, 51, 75, 112, 82, 29, 11, # IN 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, # KS 0, 0, 36, 57, 76, 48, 66, 55, 22, 11, # KY 0, 0, 0, 0, 17, 26, 80, 116, 79, 0, # LA 0, 10, 62, 312, 333, 257, 129, 67, 10, 0, # MD 0, 0, 0, 0, 13, 26, 12, 23, 0, 0 # ME ), post_fts = c( rep(0, 9), 1, # AL rep(0, 10), # AR rep(0, 8), 1, 1, # AZ rep(0, 10), # CA rep(0, 6), 1, 1, 1, 1, # CO rep(0, 10), # FL rep(0, 10), # GA rep(0, 10), # IA rep(0, 10), # ID rep(0, 10), # IL rep(0, 10), # IN rep(0, 10), # KS rep(0, 10), # KY rep(0, 9), 1, # LA rep(0, 5), 1, 1, 1, 1, 1, # MD rep(0, 8), 1, 1 # ME ), fts_year = c( rep(2022, 10), # AL rep(Inf, 10), # AR rep(2021, 10), # AZ rep(Inf, 10), # CA rep(2019, 10), # CO rep(Inf, 10), # FL rep(Inf, 10), # GA rep(Inf, 10), # IA rep(Inf, 10), # ID rep(Inf, 10), # IL rep(Inf, 10), # IN rep(Inf, 10), # KS rep(Inf, 10), # KY rep(2022, 10), # LA rep(2018, 10), # MD rep(2021, 10) # ME ), treated = c( rep(0, 9), 1, # AL rep(0, 10), # AR rep(0, 8), 1, 1, # AZ rep(0, 10), # CA rep(0, 6), 1, 1, 1, 1, # CO rep(0, 10), # FL rep(0, 10), # GA rep(0, 10), # IA rep(0, 10), # ID rep(0, 10), # IL rep(0, 10), # IN rep(0, 10), # KS rep(0, 10), # KY rep(0, 9), 1, # LA rep(0, 5), 1, 1, 1, 1, 1, # MD rep(0, 8), 1, 1 # ME ) ) # 查看数据集前20行 head(df, 20)
解决方案
报错核心原因是**multisynth函数参数传递格式错误**,交错采纳场景下需明确指定处理时间变量,且参数顺序、格式需严格匹配:
修正函数调用格式:
当前调用缺少处理时间变量的正确传递,且参数t未定义。应使用fts_year作为处理时间变量,调整参数顺序并指定数据集:library(augsynth) # 正确调用multisynth ppool_syn <- multisynth(y ~ treated, unit = state_abb, time = year, treatment = fts_year, # 关键:指定处理时间变量 nu = 0.5, data = df)额外检查点:
- 确认未处理单位(如AR、CA)的
fts_year值为Inf,你的数据已满足该要求; - 确认
treated变量为数值型(你的数据中已为0/1数值),无需额外转换。
- 确认未处理单位(如AR、CA)的
运行修正后的代码即可正常执行合成控制分析。
内容的提问来源于stack exchange,提问作者Will H.
相关产品推荐
相关产品推荐

