我目前正在撰写我的论文并且相对较新。 我需要执行一个heckit两阶段模型(invMillsRatio加heckit),因为我有很多缺少的数据。但是我不知道如何做到这一点。我有3个主要模型(2个线性回归(1个lm和1个log-linear)和1个censor回归),但我现在如何执行这个heckman校正?
我非常感谢你的帮助,我根本不知道!
答案 0 :(得分:0)
我一直在努力解决同样的问题,我想我找到了解决方案。它肯定不是最优雅的方式,但它运行良好。欢迎提供额外的反馈和友好的建议!
第一步:从您的因变量中创建一个虚拟对象。我的因变量是FDI outstock,因此如果它与0或NA不同,则取值为1,否则为0。这是我用来为虚拟DV创建新列的代码:
outstock <- outstock %>%
mutate(
outstock4 = as.numeric(
case_when(
log_outstock == 0 ~ "0",
is.na(log_outstock) ~ "0",
log_outstock > 0 ~ "1",
log_outstock < 0 ~ "1",
TRUE ~ as.character(log_outstock)
)
)
)
第二步(如果适用于您的数据集):使用plm包中的plm.data()函数声明为面板数据。我用了这段代码:
outstock4 <- outstock %>%
plm.data(index = c("CP", "year"))
第三步:在sampleSelection包中,heckit函数的工作原理如下:
heckit(dummy_DV ~ IV,
DV ~ IV, data)
请注意,它是2个单独的回归(首先是您的选择方程,然后是您的估计回归方程),并且没有提及lm,glm,log-linear或其他。
现在,对我而言,只要我没有固定的效果来包含它,这就有效。在这种情况下,大量的NA使其无法运行。因此,我删除了NA,而不是使用na.omit(),因为这会删除太多的观察,因为我没有使用每个模型中数据库中存在的所有变量),而是将它们过滤掉:
model1 <- summary(heckit(dummy_DV ~ IV,
DV ~ IV + as.factor(year) + as.factor(iso_o) + as.factor(iso_d),
data = filter(database, !is.na(IV1), !is.na(IV2), !is.na(IV3), !is.na(IV4), !is.na(IV5))))
我希望它有所帮助。祝你好运!