R中的Oaxaca分解

R中的Oaxaca分解,r,stata,economics,R,Stata,Economics,我想在R中进行Oaxaca分解。我相信,它在劳动经济学中用于区分解释方差和未解释方差。我一直无法在R中找到合适的解决方案,我很不愿意自己创建一个(我可能会把它搞砸) 无论如何,这里简要说明了该程序: 斯塔塔有一个很好的包装,但斯塔塔对我来说并不容易 请注意:我也在R-help上发布了一条消息,但没有得到回复。我希望也可以在这个列表上发布 提前感谢,, 拉斯姆斯 编辑:我做了以下函数,它似乎产生了错误的答案(urgh)。我试着按照上面的Stata链接进行操作,但没有如我所希望的那样成功:) o

我想在R中进行Oaxaca分解。我相信,它在劳动经济学中用于区分解释方差和未解释方差。我一直无法在R中找到合适的解决方案,我很不愿意自己创建一个(我可能会把它搞砸)

无论如何,这里简要说明了该程序:

斯塔塔有一个很好的包装,但斯塔塔对我来说并不容易

请注意:我也在R-help上发布了一条消息,但没有得到回复。我希望也可以在这个列表上发布

提前感谢,, 拉斯姆斯

编辑:我做了以下函数,它似乎产生了错误的答案(urgh)。我试着按照上面的Stata链接进行操作,但没有如我所希望的那样成功:)


oaxaca我使用过oaxaca类型分解。没有找到R的任何包,所以我写了一些函数来实现它。它类似于Stata中的相应包

您可以在以下位置找到它的副本:


请注意,当时我对使用固定效果(面板数据)模型感兴趣,这些模型与这些分解不直接兼容。FE类型模型有一个未完成的处理程序,但不应使用它。我本想用它来创建一个包,但一直没有着手。CRAN上的
oaxaca
包可以估计线性模型的Blinder oaxaca分解,并生成显示结果的条形图:

它还可以计算自举标准误差,以提供估计不确定性的程度


vignette详细描述了包的功能,并提供了一些使用示例。请看这里:“

eh,不要交叉张贴(邮件列表)同样的人读到了。一周后没有回复,所以在这段时间之后,他肯定有权在其他地方询问。好的,我会把-1放回原处。很抱歉我这么快就发出去了。现在有了代码,问题看起来好多了…另一个在这里有效的包是。这个包装很好用。哦,太好了。我的函数肯定不会给出正确的结果!编辑:我认为你是对的,关于FE。我尝试了一个使用因子的模型,它在B1[1,1]中返回了
错误,非常大。此函数应成为正式r代表中的真实程序包:)
oaxaca <- function (fsex,frace1,frace2) {
  ## First we make regresions
  data1 <- subset(l2,sex==fsex & race==frace1)
  data2 <- subset(l2,sex==fsex & race==frace2)

  mindata1 <- subset(cbind(grade,exp,I(exp^2)),sex==fsex & race==frace1)
  mindata2 <- subset(cbind(grade,exp,I(exp^2)),sex==fsex & race==frace2)

  reg1 <- lm(log(wage)~grade+exp+I(exp^2), data=data1)
  reg2 <- lm(log(wage)~grade+exp+I(exp^2), data=data2)

  ## DECOMPOSITION
  ################

  ## Variables
  gap <- mean(log(wage[race==frace1 & sex==fsex]))-mean(log(wage[race==frace2 & sex==fsex]))

  mean1 <- colMeans(mindata1)
  mean2 <- colMeans(mindata2)

  beta1 <- summary(reg1)$coefficients[,1]
  beta2 <- summary(reg2)$coefficients[,1]
  beta1incep <- summary(reg1)$coefficients[1,1]
  beta2incep <- summary(reg2)$coefficients[1,1]
  beta1coef <- summary(reg1)$coefficients[c(2,3,4),1]
  beta2coef <- summary(reg2)$coefficients[c(2,3,4),1]
  betastar <- .5*(beta1coef+beta2coef)
  betastar2 <- (beta1+beta2)/2

  expl <- sum((mean1-mean2)*beta1coef)
  uexpl <- sum(mean2*(beta2coef-beta1coef))

  pct=expl/gap
  pct2=uexpl/gap

  ## output
  out <- data.frame(Gap=gap,
         Explained=expl,
         Unexplained=uexpl,
         Pct=pct*100)

  return(out)
 }