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

如何在R中对复杂调查数据实现Heckman修正?

R复杂调查数据Heckman两阶段修正操作方案

你遇到的第二阶段运行异常,核心原因是手动加入逆米尔斯比率(λ)后,普通svyglm()无法自动传递第一阶段的估计误差,得到的标准误存在偏差,严重时还会出现共线性报错,可按以下步骤解决:

步骤1:第一阶段选择方程Probit估计(你已完成部分的规范补充)

首先确保第一阶段的Probit模型满足识别要求:必须包含至少1个排他性约束变量(工具变量),即仅影响样本选择决策、不直接影响结果变量的变量,否则后续第二阶段必然出现共线性问题。
示例代码:

library(survey)
# 定义复杂调查设计,按你的实际设计替换参数
svy_design <- svydesign(id = ~psu, strata = ~strata, weights = ~weight, nest = TRUE, data = your_data)
# 第一阶段选择方程,selection是二值选择变量,iv为排他性约束变量
stage1 <- svyglm(selection ~ x1 + x2 + iv, design = svy_design, family = binomial(link = "probit"))

步骤2:计算全样本的逆米尔斯比率λ

不要仅计算选中样本的λ,全样本计算可以避免后续估计偏差:

# 预测第一阶段的线性拟合值
xb <- predict(stage1)
# 按选择状态生成λ
your_data$lambda <- ifelse(
  your_data$selection == 1,
  dnorm(xb) / pnorm(xb),
  -dnorm(xb) / (1 - pnorm(xb))
)

步骤3:第二阶段校正估计

有两种成熟的解决方案,按需选择即可:

  • 方案1:调查设计适配的自助法校正标准误(最准确,适配分层、整群等所有复杂调查设计)
    直接把λ放入svyglm()得到的标准误未考虑第一阶段的估计误差,需通过带调查设计的自助法校正:
    # 定义自助统计量函数
    heckman_boot <- function(design, i) {
      d <- design[i,]
      # 重抽样后拟合第一阶段
      s1 <- svyglm(selection ~ x1 + x2 + iv, design = d, family = binomial(link="probit"))
      xb_boot <- predict(s1)
      d$variables$lambda <- ifelse(d$variables$selection == 1, dnorm(xb_boot)/pnorm(xb_boot), -dnorm(xb_boot)/(1-pnorm(xb_boot)))
      # 拟合第二阶段
      s2 <- svyglm(outcome ~ x1 + x2 + lambda, design = d, subset = selection == 1)
      return(coef(s2))
    }
    # 运行自助重抽样,重复次数可根据样本量调整为500-2000
    boot_result <- svyboot(design = svy_design, statistic = heckman_boot, replicates = 1000)
    # 提取校正后的系数和标准误
    final_coef <- boot_result$t0
    corrected_se <- apply(boot_result$replicates, 2, sd)
    
  • 方案2:直接用sampleSelection包实现(简便,适配仅带权重的简单调查设计)
    该包内置的Heckman估计支持直接传入调查权重,自动完成两阶段估计和标准误校正:
    library(sampleSelection)
    heckman_model <- selection(
      selection = selection ~ x1 + x2 + iv,
      outcome = outcome ~ x1 + x2,
      data = your_data,
      weights = your_data$weight,
      method = "2step"
    )
    summary(heckman_model)
    

异常排查

  • 若第二阶段报错共线性:优先检查排他性约束变量是否有效,不要把IV放入第二阶段的结果方程自变量中
  • 若λ的系数统计不显著:说明不存在显著的样本选择偏差,无需做Heckman修正,直接对选中样本运行普通svyglm()即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:24:01