使用 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 鲁棒标准误差,我使用了函数 coeftest
和 vcovHC
。
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
的内存需求。这也解释了您对适用于数据子集的函数的评论。
编辑2:
vcovHC.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
我想估计固定效应模型并使用稳健的方差-协方差矩阵和 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 鲁棒标准误差,我使用了函数 coeftest
和 vcovHC
。
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
的内存需求。这也解释了您对适用于数据子集的函数的评论。
编辑2:
vcovHC.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