【问题标题】:Fitted values from the ivreg {AER} object do not match manual 2SLS resultsivreg {AER} 对象的拟合值与手动 2SLS 结果不匹配
【发布时间】:2015-08-07 09:22:44
【问题描述】:

我试图找出为什么 ivreg 估计 {AER} 的拟合值不同于手动执行的 2 阶段最小二乘法(以及适当的简化形式方程)... ivreg 和 ivreg.fit 状态的帮助它反复调用 lm() 。我提供了来自 {AER} 包的示例,其中计算了拟合值。

rm(list = ls())
require('AER') # install.packages('AER')
## data and example adapted from the AER package
data("CigarettesSW")
CigarettesSW$rprice <- with(CigarettesSW, price/cpi)
CigarettesSW$rincome <- with(CigarettesSW, income/population/cpi)
CigarettesSW$tdiff <- with(CigarettesSW, (taxs - tax)/cpi)

## Estimation by IV: log(rprice) is endogenous, tdiff is IV for log(rprice):
fm <- ivreg(log(packs) ~ log(rprice) + log(rincome) | log(rincome) + tdiff,
            data = CigarettesSW)
## 
##
# Reduced form for log(rprice)
rf.rprice <- lm(log(rprice) ~ log(rincome) + tdiff,
                data = CigarettesSW)
# Reduced form for log(packs)
rf.lpacks <- lm(log(packs) ~ log(rincome) + tdiff,
                data = CigarettesSW)
# "Manual" 2SLS estimation of the "fm" equation
m2sls <- lm(log(packs) ~ rf.rprice$fitted.values + log(rincome),
            data = CigarettesSW)
# Coefficients of "m2sls" are matched to "fm" object:
summary(m2sls)
summary(fm)
#
# It is my understanding, that fitted values from ivreg-fitted object "fm",
# manually performed 2SLS (in "m2sls") and from the reduced form rf.lpacks
# should be the same:
#
head(fm$fitted.values, 10)
head(m2sls$fitted.values, 10)
head(rf.lpacks$fitted.values, 10)
#
# However, fitted values from ivreg are different.

很可能,我遗漏了一些明显的东西,但我还是被卡住了。非常感谢任何 cmets。

【问题讨论】:

    标签: r linear-regression prediction lm


    【解决方案1】:

    ivreg 对象的predict()fitted() 方法只计算x %*% b,其中x 是原始回归矩阵,b 是系数向量(由IV 估计)。因此:

    x <- model.matrix(~ log(rprice) + log(rincome), data = CigarettesSW)
    b <- coef(m2sls)
    

    然后您手动计算的拟合值是:

    head(drop(x %*% b))
    ##        1        2        3        4        5        6 
    ## 4.750353 4.751864 4.720216 4.778866 4.919258 4.596331 
    

    ivreg 的计算完全匹配:

    head(fitted(fm))
    ##        1        2        3        4        5        6 
    ## 4.750353 4.751864 4.720216 4.778866 4.919258 4.596331 
    

    【讨论】:

    • 谢谢!这个解释 - 从技术上讲 - 正是我想要的。然而,“fm”方程和手册 2sls“m2sls”中的 ivreg 估计系数是相同的。因此,我假设 ivreg 在第二阶段估计中必须使用第一阶段(简化形式)的拟合值。然而,这些拟合值被忽略以进行预测。所以,重新表述我的问题:ivreg 拟合值是否正确?
    • 您执行的两个回归对应于 ivreg 为估计回归系数而执行的操作。但重要的一点是,这些辅助回归只是获得原始未转换/未投影回归量的系数估计值的“技巧”!因此,应使用具有 IV 估计系数(b)的原始变量(x)进行预测。
    【解决方案2】:

    使用 ivreg,您必须在“|”前面包含其他 RHS 变量之后。

    例如:

    stage1<-predict(lm(endogenous.var~x1+x2+instrument,data=data))
    data$stage1<-stage1
    stage2<-lm(dependent~x1+x2+stage1,data=data)
    

    不会给你与

    相同的系数
    iv.model<-ivreg(dependent~x1+x2+endogenous|instrument,data=data)
    

    然而,它会给你同样的答案

    iv.model<-ivreg(dependent~x1+x2+endogenous|instrument+x1+x2,data=data. 
    

    活生生的例子:

    rm(list=ls())
    
    library(AER)
    data(mtcars)
    
    #let cyl be an instrument for hp
    stage1<-predict(lm(hp~cyl+disp,data=mtcars))
    
    mtcars$stage1<-stage1
    
    stage2<-lm(mpg~stage1+disp,data=mtcars)
    
    #this is not the same as 
    ivreg.bad<-ivreg(mpg~hp|cyl+disp,data=mtcars)
    
    #and this doesn't even work
    ivreg.bad2<-ivreg(mpg~disp+hp|cyl,data=mtcars)
    
    #but it is the same as 
    ivreg.good<-ivreg(mpg~disp+hp|cyl+disp,data=mtcars)
    
    summary(stage2)
    summary(ivreg.good)
    summary(ivreg.bad)
    

    请注意,这当然只是指系数。标准误差会有所不同,因为 ivreg 会自动应用适当的调整。

    【讨论】:

    • 我相信 disp 是控制变量,而 cyl 是 hp 的 IV。所以在 ivreg 中应该是 ivreg(mpg~hp+disp|disp+cyl, data=mtcars)?但是输出和你的 ivreg.good 一样
    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多