【问题标题】:Robust standard error (HC3) using vcovHC(), coeftest for plm object使用 vcovHC() 的稳健标准错误 (HC3),用于 plm 对象的 coeftest
【发布时间】:2020-04-13 10:54:50
【问题描述】:

我想估计一个固定效应模型,并使用具有 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对象并返回错误:

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

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

【问题讨论】:

  • 一个类似的例子对我有用。似乎vcovHC 没有分派给plm 为plm 对象提供的方法,因为plm 中没有函数hatvalues,甚至在plm 的源代码中也没有这个词hatvalues。确保在执行coeftest 时加载了包plm
  • 感谢您的回复。 hatvalues 意味着在 vcovHC() 中(请参阅rdrr.io/cran/sandwich/src/R/vcovHC.R)。我认为我的问题也可能出在变量 PERIOD 中,它是一个具有 3 个级别的因素。
  • 确保从 CRAN 安装最新版本的 plm。

标签: r statistics plm standard-error


【解决方案1】:

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”包中的 vcovHC.plm 的小问题。由于 vcovHC.plm 使用 plm 包中的 vcovG,因此整个帽子矩阵是使用 vcovG 中的函数dhat 计算的。我指的是rdrr.io/cran/plm/src/R/tool_vcovG.R。不计算整个矩阵(我认为这会导致我的错误)而只计算对角线不是更有效吗,这是 HC2 和 HC3 所需的
  • 感谢您的观察,看起来很明智。会去看看。
  • 我现在用 trace(plm:::vcovG.plm, edit = TRUE) 将 dhat 函数更改为:dhat &lt;- function(X){ S1 &lt;- X %*% solve(t(X) %*% X) diaghat &lt;- rowSums(S1 * X) return(diaghat) }。现在它工作得很好;感谢 Helix 和 Giovanni 的帮助!
  • 使用此优化的实现在 plm 版本 >= 2.4-0 中,因此内存需求显着降低。
【解决方案2】:

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

如果您加载了包plm,代码应该可以工作。它与我机器上的玩具示例有关。可以肯定的是,您可能希望强制使用vcovHC 提供的plm

拳头,试试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"(和其他)。这也解释了您对适用于数据子集的函数的评论。

编辑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 包,它仍然不适用于我的整个示例。我尝试了一个较小的。只有一个较小的子集,它工作得很好,但不是整个。感谢您的帮助,我将尝试提高整个数据集的质量并再次运行它。感谢您的帮助!
  • 我也尝试过这种方法。但它不会起作用。我的数据样本包括 288 个个体和每个个体 312 个观察值。该代码适用于最多 148 个人。包括超过 148 只股票,导致上述问题
  • 您有机会在某处提供完整的数据吗?
  • 谢谢。请参阅我的答案的编辑。内存需求太高,至少对我的机器来说太高了
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 2011-05-24
  • 1970-01-01
  • 2020-03-14
  • 2012-03-09
  • 2015-05-15
  • 1970-01-01
  • 2014-05-02
相关资源
最近更新 更多