内存高效集群 bootstrap

Memory efficient cluster bootstrap

我有一个非常大的数据集(1000 万个观察值,但减少到 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)

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

我也尝试过过滤数据,运行上面的子样本,只是为了尝试。有新错误;

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() 仅支持 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 不支持泊松回归的直接结果。

boottestfwildclusterboot 中的内存问题是因为

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

所以我建议你试试 boottest 中的 matsize 参数,看看你的错误是否是由于大权重矩阵引起的?

内存是 fwildclusterboot 的一个已知问题,正在改进内存性能。

最后,WildBootTests.jl 中还有一个新的 Julia 实现的 fast wild cluster bootstrap 算法,它支持基于 ML 的模型,并且根据我的经验,它比 [=13] 需要更少的内存=].

更新 1 另见 this discussion 关于使用 boottestpplmhdfe

更新 2 如果你想 运行 野生集群 bootstrap 因为你担心你的集群数量很低并且你的标准错误可能有偏差,另一种方法可能是尝试 degrees-of-freedom 更正在 clubSandwich package 中为 glm() 实施。尽管我不得不承认我不确定实施的校正对泊松回归的效果如何。