我想估计一个固定效应模型,并使用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
对象,并返回错误:
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开发人员。虽然效率问题在计算上很有趣,但从统计的角度来看,当你有一个300 x 300的面板时,不需要这些小样本校正。你可以很高兴地使用HC0(或者如果你确实想要面板小样本校正"sss"
(面板DF(无论如何都是最好的,后者在计算上要轻得多(。
当数据大小增加时,小样本校正变得毫无用处,这是我们没有分配稀缺的开发人员时间来提高效率的主要原因。此外,从统计学的角度来看,请注意,像White Arellano这样的"聚类"vcovs的性质对于T~N来说并不理想,它们适用于N>>T。
最后,有一点需要澄清:你原来的帖子:虽然最初vcovHC
是"三明治"包中的一个通用函数,但在面板上下文中,应用了"plm"包的专用方法vcovHC.plm
。更好的解释如下:https://www.jstatsoft.org/article/view/v082i03
在plm
为plm对象提供的方法中,包plm
中没有函数hatvalues
,单词";hatvalues";甚至不在plm的源代码中。执行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
。根本原因是函数vcovHC.plm
的内存需求,参数type
设置为"HC3"
(以及其他(。这也解释了您对为数据子集工作的函数的评论。
第2版:从plm版本2.4-0开始(内部函数dhat
优化(,vcovHC.plm
的小样本调整的内存需求显著降低,并且错误不再发生。
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 Gbn"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError: cannot allocate vector of size 59.7 Gb>