使用 vcovHC() 的稳健标准错误 (HC3),plm 对象的系数测试

Robust standard error (HC3) using vcovHC(), coeftest for plm object

我想估计固定效应模型并使用稳健的方差-协方差矩阵和 HC3 小样本调整。

对于模型本身,我使用以下代码行:

require(plm)
require(sandwich)
require(lmtest)
require(car)
QSFE <- plm(log(SPREAD)~PERIOD, data = na.omit(QSREG), index = c("STOCKS", "TIME"), model = "within")

这工作得很好,现在为了计算 HC3 鲁棒标准误差,我使用了函数 coeftestvcovHC

coeftest(x = QSFE, vcov = vcovHC(QSFE, type = "HC3", method = "arellano"))

这是行不通的。返回错误如下:

Error in 1 - diaghat : non-numeric argument to binary operator

问题出在 vcovHC 中:将类型设置为 "HC3" 时。它使用函数hatvalues()计算"diaghat",不支持plm对象和returns错误:

Error in UseMethod("hatvalues") : 
no applicable method for 'hatvalues' applied to an object of class "c('plm', 'panelmodel')"

有谁知道如何使用 plm 的 HC3 (HC2) 估计器。我认为它应该取决于 vcov 中使用的函数 hatvalues,因为 HC0/HC1 工作正常,因为这不需要它。

plm为plm对象提供的方法中,包plm中没有函数hatvalues,甚至在plm的源代码中也没有“hatvalues”这个词。确保在执行 coeftest 时加载包 plm。此外,请确保从 CRAN 安装了最新版本的 plm(当前版本为 2.2-3)。

如果您加载了包 plm,代码应该可以工作。它在我的机器上使用了一个玩具示例。可以肯定的是,您可能想要强制使用 plm:

提供的 vcovHC

拳头,试试vcovHC(QSFE, type = "HC3", method = "arellano")。如果出现相同的错误,请尝试 plm::vcovHC(QSFE, type = "HC3", method = "arellano").

接下来,请尝试: coeftest(QSFE, vcov.=function(x) vcovHC(QSFE, method="arellano", type="HC3"))

编辑: 使用提供的数据集,很明显可以正确地调度到 vcovHC.plm。包sandwich这里不涉及。根本原因是参数 type 设置为 "HC3"(和其他)的函数 vcovHC.plm 的内存需求。这也解释了您对适用于数据子集的函数的评论。

编辑2vcovHC.plm 的小样本调整的内存需求从 plm 版本 2.4-0 开始显着降低(内部函数 dhat 优化)并且错误不再发生。

vcovHC(QSFE, type = "HC3", method = "arellano")
Error in 1 - diaghat : non-numeric argument to binary operator
Called from: omega(uhat, diaghat, df, G)
Browse[1]> diaghat
[1] "Error : cannot allocate vector of size 59.7 Gb\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError: cannot allocate vector of size 59.7 Gb>

plm 开发人员在这里。虽然效率问题在计算上很有趣,但从统计角度来看,当您拥有 300 x 300 面板时,不需要这些小样本校正。您可以愉快地使用 HC0(或者如果您确实想要面板小样本校正 "sss"(面板 DF)无论如何都是最好的,后者在计算上要轻得多)。

当数据量增加时,小样本校正变得无用,这是我们没有分配稀缺的开发人员时间来提高它们效率的主要原因。 另外,从统计的角度来看,请注意像 White-Arellano 这样的 "clustering" vcov 的属性对于 T ~ N 不太理想,它们适用于 N >> T。

最后,澄清一下:您原来的 post:虽然最初 vcovHC 是 'sandwich' 包中的通用函数,但在面板上下文中是专门的方法 vcovHC.plm 来自 'plm' 包。 更好的解释在这里:https://www.jstatsoft.org/article/view/v082i03