R语言tidysynth包generate_control()报预测变量生成NA错误
tidysynth包
NA generated in specified predictors报错解决方案 报错本质是定义的预测变量中,至少存在一个变量在某个单元(处理组/控制组)的指定时间窗口内计算结果为NA,导致后续权重拟合无法进行。
问题1:聚合计算时窗口内全为NA
你在generate_predictor里给均值计算加了na.rm = T,但这个参数仅能排除窗口内的部分缺失值,如果某个单元在指定的整个时间窗口内,对应变量全部是NA,mean(..., na.rm = T)会返回NaN(会被识别为NA)。
从提供的数据集样例来看,strata和average_income两个变量在2003-2008年全部为NA,如果2009-2012年这两个变量仍有部分单元全为缺失,就会触发报错;另外bulgarlykm22003年为NA,若存在单元2003-2012年该变量全部缺失,同样会出问题。
排查方法
运行以下代码,定位存在全量缺失的单元和变量:
library(dplyr) # 排查入室盗窃变量全缺失的单元 SCMFinal %>% filter(year %in% 2003:2012) %>% group_by(neghborhood_code) %>% summarise(bulgarly_na = all(is.na(bulgarlykm2))) %>% filter(bulgarly_na) # 排查社会阶层、收入变量全缺失的单元 SCMFinal %>% filter(year %in% 2009:2012) %>% group_by(neghborhood_code) %>% summarise( strata_na = all(is.na(strata)), income_na = all(is.na(average_income)) ) %>% filter(strata_na | income_na)
修复方案
- 若缺失单元占比很低:直接将这些单元从面板数据中剔除,再重新运行合成控制流程
- 若变量整体缺失率高:直接删除该预测变量,或调整时间窗口到变量有完整观测的时段
问题2:单年滞后预测变量存在缺失
你定义的三个单年取值的杀人率变量,没有做任何缺失值处理,如果某个单元在2007/2009/2011年的homicidekm2为NA,会直接将NA带入预测变量矩阵。
排查方法
运行以下代码定位单年缺失的记录:
SCMFinal %>% filter(year %in% c(2007, 2009, 2011)) %>% select(neghborhood_code, year, homicidekm2) %>% filter(is.na(homicidekm2))
修复方案
- 若缺失记录少:将对应年份的取值替换为相邻年份的均值,或直接删除该滞后项
- 若缺失多:将单年取值改为3年滚动窗口均值,避免NA产生
代码笔误修正
你定义滞后杀人率时,时间窗口和变量名不匹配,容易造成后续结果解读混乱,建议修正为:
# 原错误写法 # generate_predictor(time_window = 2007, homicidekm2_2009 = homicidekm2) %>% # generate_predictor(time_window = 2009, homicidekm2_2010 = homicidekm2) %>% # 修正后写法 generate_predictor(time_window = 2007, homicidekm2_2007 = homicidekm2) %>% generate_predictor(time_window = 2009, homicidekm2_2009 = homicidekm2) %>% generate_predictor(time_window = 2011, homicidekm2_2011 = homicidekm2) %>%
另外generate_control ()括号前多余的空格不影响运行,但建议写成规范的generate_control()。
内容的提问来源于stack exchange,提问作者Estefania Ramirez
相关产品推荐
相关产品推荐

