【问题标题】:Differing results for Heckman 2-stage model between Stata and RStata 和 R 之间 Heckman 2 阶段模型的不同结果
【发布时间】:2016-05-09 20:35:13
【问题描述】:

我正在开展一个项目,该项目需要我运行 Heckman 2 阶段模型,这对我来说很新,在两个阶段都使用 probit。作为一项经验检查,我在 Stata 和 R 中运行了模型。我正在运行带有“sampleSelection”包的 Stata 13 和 R v. 3.2.3。问题是我得到了不同的结果,我认为这是因为我对代码背后的算法缺乏了解。也许我缺少论点。我知道的一件事是 R 正在为第二阶段而不是概率运行一个 Tobit 模型。我想知道是否有人可能对如何让 R 在两个阶段都使用概率方法来运行 2 阶段模型有所了解。下面我先包含了 Stata 代码和结果,然后是 R 代码和结果。

状态码

heckprob  ivburden  isingle recuse50 infobk2 timesurv inh icp itime igate ioth, 
select(iw5rsp= i201 isingle icatmpgte7 ichgfrwv inh icp itime igate     ioth)  vce(robust)

R 代码

library(sampleSelection)
heckit(selection = iw5rsp ~ i201 + isingle + icatmpgte7 + ichgfrwv + 
              inh + icp + itime + igate + ioth, 
          outcome = ivburden ~ isingle + recuse50 + infobk50 + timesurv + 
              inh + icp + itime + igate + ioth, data = dat, 
          method = "2step")

任何建议将不胜感激。

【问题讨论】:

  • 最好从该包的帮助页面开始,看看功能是否按照您的想法执行:cran.r-project.org/web/packages/sampleSelection/…
  • 在较小的数据样本上运行时,有什么方法可以提供一小部分数据样本以及模型代码的 stata 和 R 输出?要提供数据样本(便于在 R 中使用),请使用 dput()。例如,要提供数据的前 20 行,请粘贴 dput(dat[1:20, ]) 的输出,以及使用该数据运行的 stata 和 R 模型的输出(或任何数据样本说明您的问题并使您的问题可重现。
  • tobitprobit 是一样的吗?
  • 这不是我对tobit和probit区别的理解的一个很好的描述。我的理解是,tobit 分布是基于截断的高斯分布,而概率模型是基于未截断的。这只是与我感兴趣的领域有一定的交叉,而且我对 Stata 方法一无所知。
  • 我相信一些混淆在于具有样本选择的最大似然概率模型有时被称为 II 型 Tobit,不要与用于审查结果数据的 I 型混淆。请参阅here 了解更多信息。

标签: r stata


【解决方案1】:

您提供的 R 代码将给出与 Stata 的 heckman 命令相同的结果:即,

heckman ivburden isingle recuse50 infobk2 timesurv inh icp itime igate ioth, select(iw5rsp= i201 isingle icatmpgte7 ichgfrwv inh icp itime igate ioth)

查看这一点的一种方法是,输出在底部为您提供了“sigma”的估计值。您要估计的模型中没有“sigma”。

对于 R 中的 sampleSelection 包来估计具有样本选择的二元概率模型,即 heckprob,您首先需要指定结果方程的因变量是一个因子。这是修复:

library(sampleSelection)
ivburdenF <- factor(ivburden)
heckit(selection = iw5rsp ~ i201 + isingle + icatmpgte7 + ichgfrwv + 
              inh + icp + itime + igate + ioth, 
          outcome = ivburdenF ~ isingle + recuse50 + infobk50 + timesurv + 
              inh + icp + itime + igate + ioth, data = dat)

最后要提到的是,对于带有概率方程的 Heckman 式选择模型,不应使用“2 步”估计器作为结果。

上面的 R 语法和 Stata 的 heckprob 的结果应该只是由于舍入而不同(假设两种最大化方法都实现了收敛)。

【讨论】:

    【解决方案2】:

    如果有人正在寻找一个示例,说明如何使用来自 sampleSelection package(由 Arne Henningsen 和 Ott Toomet 编写)的 R 的 heckit 函数重现 Stata 的 heckprobheckprobit 的别名)的结果,这是Example 1 from [R] heckprobit的翻译:

    library(sampleSelection)
    library(readstata13)
    library(tidyverse)
    
    df_school = read.dta13("http://www.stata-press.com/data/r13/school.dta") %>% 
      as_data_frame() %>% 
      mutate_at(
        c("vote", "private"), as.factor
      )
    
    heck_school_1 = heckit(
      selection = vote ~ years + loginc + logptax,
      outcome = private ~ years + logptax ,
      data = df_school,
      method = "ml"
    )
    
    summary(heck_school_1)
    

    这应该给出相同的结果:

    use http://www.stata-press.com/data/r13/school
    heckprob private years logptax, select(vote=years loginc logptax)
    

    注意需要将结果变量转换为factor,并在拟合模型时使用method = "ml"

    【讨论】:

      【解决方案3】:

      “看来这个包可能只是不能做我需要它做的事情” - 你想做什么?当你说你想要一个概率概率模型时,你的意思是你试图用一个因变量是二元(二元概率)的结果方程来估计一个赫克曼风格的模型吗?规范的 heckit 模型在结果阶段使用 OLS,这就是 heckman 函数所做的(与您使用的 heckprob 不同)。问题是 R 的 sampleSelection 包使用了一个等效于“heckman”而不是“heckprob”的函数。您需要的是 R 等价物。我其实不熟悉一个。我使用专门为此任务编写的函数。代码见此链接:http://dynaman.net/R/HeckmanProbit.R

      (与所有这些无关,估计方法也可以切换。对于R模型,您可以将其更改为method='ml'method='2step',因此在比较stata时您可能需要记住这一点和 R)。

      【讨论】:

      • 感谢您的回复。是的,我正在尝试估计一个 heckman 风格的模型,其中选择方程和结果方程都有二元因变量。我确实尝试过切换方法,但效果不佳,但我一定会查看您提供的链接。我会及时通知你的!
      • 所以在休息了一段时间后,我使用上面链接提供的函数运行了我的模型,得到的结果与 sampleSelection(如预期的那样)和 Stata 的“heckprob”函数非常不同。
      • 有什么不同?他们可能使用不同的估计算法,但结果不应有很大差异。您可能还想查看 heckprob 如何处理第二个等式中的删失变量 - 可能有不同的选项。我会尝试切换 heckprob 的所有选项,看看结果是否与链接中使用的技术一致。此外,上面的链接使用了 STATA 提供的数据 - 为什么不使用该数据来检查您是否在 STATA 中获得与使用上述技术相似的结果。
      【解决方案4】:

      这是一个我错过的简单解决方案,因为我没有注意到我没有将因变量表示为不等式。在我在这里发布的代码中,您可以看到没有不等号。我仔细查看了这里的文档和示例:https://r-forge.r-project.org/forum/forum.php?thread_id=31866&forum_id=844&group_id=256(Arne Hennigsen 指出了我,他是“sampleSelection”包的作者之一……非常感谢 Arne)

      我注意到这段代码的表达式中使用了不等式,在我自己的代码中实现之后,Stata 和 R 之间的匹配结果存在轻微的舍入不一致。

      【讨论】:

      • “您可能还想查看 heckprob 如何处理第二个等式中的删失变量”这是我之前帖子 cmets 的引述。您所说的inequalities 正是我提到的切换审查变量的原因!!!审查就是这样完成的!
      猜你喜欢
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 2021-10-08
      • 2019-09-19
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      相关资源
      最近更新 更多