异方差一致协方差矩阵在单变量回归中的应用 [R]

3

如何计算单变量回归(即只有一个自变量和没有截距的OLS回归)的异方差一致协方差矩阵(HCCM)?

背景:我有一个固定效应面板回归,但只有一个自变量。因此,我可以使用最小二乘虚拟变量(LSDV)方法来处理。

lm.ser.yr <- lm(realwage ~ placebo.ser + factor(incyear) + 0, data = cps)

或者我可以将LHS在年份水平上降低,并进行回归。
cps <- ddply(cps, .(incyear), transform, realwage.dm.yr = realwage - mean(realwage))
lm.ser.yr <- lm(realwage.dm.yr ~ placebo.ser + 0, data = cps)

但是这两种方法都存在问题。

  • 使用LSDV方法和足够的虚拟变量,lm对象会变得非常大(每个1 GB)。这主要是因为我必须保留大型的qr矩阵,以便将其传递给vcovHC()来计算HCCM,但经常会停止在“无法分配大小为***的向量”错误上(或者进行大量分页)。

  • 使用去均值估计器一切都很好,但我无法计算HCCM,因为vcovHC()hccm()都无法处理没有拦截的单变量lm对象(即它会返回NA,据我所知,这是因为没有拦截和虚拟变量,我的残差远离零平均值)。

除了非常积极地管理内存和/或转移到云上,还有其他解决方案吗?


可能适合发布在math.overflow.com上。 - duffymo
@duffymo -- 可能是的。我认为这是一个计量经济学/计算问题,我觉得在这里看到更多这样的问题。 - Richard Herron
1个回答

3
< p >来自plm包的vcovHC()函数似乎可以很好地处理没有截距的lm()模型:

library(plm)
df <- data.frame('a'=rnorm(1000), 'b'=rnorm(1000))
mod <- lm(a ~ b -1, df)
vcovHC(mod)

编辑:这里有一些手动计算它们的代码。

library(Matrix)
e2 = mod$residuals ^ 2
X = model.matrix(mod)
N = nrow(X)
bread = solve(crossprod(X))
I <- Matrix(data=0, ncol=N, nrow=N, sparse=TRUE)
diag(I) <- e2
salami <- t(X) %*% I %*% X 
V = bread %*% salami %*% bread

@Vincent -- 我自讨苦吃了。我没有查看所有结果,错过了两个失败的结果--所以这不是一个真正的“单变量”问题,可能是我的模型残差太大,无法正确解决(我猜在这里mod必须是plm才能调用vcovHC.plm)。我会进一步研究sandwich并看看我能找到什么。 - Richard Herron
当我运行你的代码时,出现了这个错误:Error in array(0, c(n, p)) : 'dim' specifies too large an array - Richard Herron
我现在会继续使用虚拟变量(由于一个回归器是指示变量,这可能会变得复杂)。感谢您的帮助! - Richard Herron
@Vincent -- 如果我明确地将其转换为标量,同样的错误仍然存在:X <- as.matrix(cps$placebo.ser, ncol = 1); as.numeric(X2) * as.numeric(t(X) %*% diag(e2) %*% X) * as.numeric(X2) 会产生错误 Error in array(0, c(n, p)) : 'dim' specifies too large an array - Richard Herron
1
我不应该在这么晚的时候尝试编写代码。这里有一个可行的版本。如果你真的只是进行双变量回归,你需要大量的观测值来运行以避免内存限制。无论如何,我还利用稀疏矩阵来最小化对恒等矩阵操作的内存使用。所以那也可能会有所帮助。 - Vincent
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接