1

我有一个非常大的数据集(10m 观察但减少到 14 个基本变量),并且正在关注以下线程:Cluster bootstrapped standard errors in R for plm functions

加载库后我的代码是:

fe_pois <- fepois(totalcountdeals ~ logdist + inst_dist_std + whited_wu_std:findev_std | iso_o_code + sic2, vcov=~pair, data = cbma, nthreads = 2)

boot_feols <- boottest(fe_pois, clustid = "pair", param = "logdist", B = 199, nthreads = 2)

但是,如果内存足够大,这将失败。任何其他解决方案。我需要引导标准错误,因为我的回归量之一是估计值。

我也尝试过过滤数据,并在子样本上运行上述内容,只是为了试一试。有新错误;

Error in if (!is.numeric(lower) || !is.numeric(upper) || lower >= upper) stop("lower < upper  is not fulfilled") : 
  missing value where TRUE/FALSE needed
4

1 回答 1

1

谢谢你的提问!

fwildclusterboot::boottest()仅支持 OLS 模型的估计,因此运行泊松回归实际上应该在boottest(). 我将不得不为此添加一个错误条件:)

您观察到的错误

Error in if (!is.numeric(lower) || !is.numeric(upper) || lower >= upper) stop("lower < upper  is not fulfilled") : 
  missing value where TRUE/FALSE needed

源于用于计算置信区间的数值求根程序 - 我相信这是fwildclusterboot不支持泊松回归的直接结果。

boottest两者的内存问题都是fwildclusterboot因为

  • 您正在拟合的模型非常大,并且 fwildclusterboot 只接受一个固定效应 - 中指定的所有其他因子变量fixest都被转换为虚拟变量,因此传递给的设计矩阵boottest()可能非常大。实际上,如果您不使用fe参数 for fwildclusterboot::boottest(),则在 中指定的所有固定效果都feols()将被转换为虚拟对象,并且在引导程序中不会超出固定效果。lm()您可以通过or (或通过 Stata 中的类似命令)运行回归来检查这是否是错误的根源,glm()并查看这些估计是否也因内存而失败。
  • boottest并且fwildclusterboot是完全向量化的 - 因此两者都计算权重矩阵 v,它的维数G x B为 ,其中 G 是集群的数量,B 是引导迭代的数量。如果 G 和 B 都很大,这会消耗相当多的内存!Stata.boottest有一个函数参数 ,matsize旨在帮助解决这种情况 - 我从文档中引用:“ matsize(#) 限制 G × B 矩阵 v∗ 的内存需求,以防止将虚拟内存缓存到磁盘。限制是以 GB 为单位指定;例如,matsize(8) 会将内存需求限制为 8GB。请注意,此选项不会限制 v∗ 的实际大小。相反,它会强制 boottest 将矩阵分解为不大于限制的块,并且然后依次创建和销毁每个块

所以我建议你试试这个matsize参数boottest,看看你的错误是否是由于权重矩阵大而发生的?

内存是 的一个已知问题fwildclusterboot,而提高内存性能的工作正在进行中。

最后, WildBootTests.jl中还有一个快速野生集群引导算法的新 Julia 实现,它支持基于 ML 的模型,并且 - 根据我的经验 - 对内存的要求比fwildclusterboot.

更新 1 另请参阅有关使用and的讨论boottestpplmhdfe

更新 2 如果您想运行野生集群引导程序,因为您担心集群数量很少并且您的标准错误可能有偏差,另一种方法可能是尝试glm()clubSandwich中实施的自由度校正包。虽然我不得不承认,我不确定实施的修正对泊松回归的效果如何。

于 2022-02-11T12:14:51.650 回答