编辑:我自己解决了这个问题。下面模拟的问题是省略的变量不应该包含在“真实模型”中。我已经写了一篇博文,在这里进行了更详细的分析。
我正在尝试计算具有内生变量的二元响应回归模型的平均结构函数 (ASF)。ASF 被称为从这些模型中获得的政策相关结果,因为它显示了结果的条件概率(一或零)如何随着任何解释变量的变化而变化。
为了估计回归模型,我使用了两步控制函数方法,其中第一阶段回归残差 () 在第二阶段概率回归 à la Rivers 和 Vuong (1988) 中作为右侧变量包含在内。
根据我对 Blundell 和 Powell (2004) 的一篇论文(以及这些讲义)的阅读,ASF 可以计算如下:
在哪里值保持在一个恒定的水平(比如它们的平均值),我们对所有第一阶段残差进行平均(乘以第二阶段系数)。实际上,这种形式化将允许人们计算结果的概率如何随着 x 变量之一的变化而变化,而所有其他值(通常)都保持在其平均值。
或者你会这么想。但是,我已经尝试在 R 的简单模拟上进行此计算,但无法复制 ASF。我的 R 代码如下。基本上,这是一个简单的设置,我们想要测量 y1 对 y2 的影响(二进制结果)。有一个遗漏变量 (x1) 使 y1 内生感兴趣的回归方程。
我尝试的图片是:
什么时候可用,一切都应该没问题。只估计一个标准概率 上和. 用于此的 ASF 只是用于更改的普通 CDF. 什么时候没有观察到,它变得有必要仪表.
从 IV 回归中,我计算了上面的 ASF,并将其与模型进行了比较,其中观察到(图中的蓝线),以及在哪里没有观察到并且未检测(绿线)。
红线是我尝试通过上述方法构建 ASF。很明显,这条线与蓝线不匹配。我在这里的某个地方出错了,但我不确定在哪里。有人可以帮我解决这个问题吗?
rm(list=ls())
x1 <- rnorm(10000)
x2 <- rnorm(10000)
y1 <- 1 + 0.5*x1 + x2 + rnorm(10000)
y2 <- ifelse(0.5 + 0.5*y1 - 1.5*x1 + rnorm(10000) > 0, 1, 0)
# true
r1 <- glm(y2~y1+x1,binomial(link="probit"))
data <- data.frame(cbind(seq(-4,6,0.2),mean(x1)))
names(data) <- c("y1","x1")
asf1 <- cbind(data$y1,pnorm(predict(r1,data)))
plot(asf1,type="l",col="blue",xlab="y1",ylab="P(y2)")
# no endog correction
r2 <- glm(y2~y1,binomial(link="probit"))
data <- data.frame(cbind(seq(-4,6,0.2)))
names(data) <- c("y1")
asf2 <- cbind(data$y1,pnorm(predict(r2,data)))
lines(asf2,type="l",col="green")
# control function approach
v1 <- (residuals(lm(y1~x2)))/sd(residuals(lm(y1~x2)))
r3 <- glm(y2~y1+v1,binomial(link="probit"))
# proceedure to get asf
asf3 <- cbind(seq(-4,6,0.2),NA)
for(i in 1:dim(asf3)[1]){
dat2 <- data.frame(cbind(asf3[i,1],v1))
names(dat2) <- c("y1","v1")
asf3[i,2] <- mean(pnorm(predict(r3,dat2)))
}
lines(asf3,type="l",col="red")