内存高效集群 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
不支持泊松回归的直接结果。
boottest
和 fwildclusterboot
中的内存问题是因为
- 您正在拟合的模型非常大,fwildclusterboot 只接受一个固定效应 -
fixest
中指定的所有其他因子变量都被转换为虚拟变量,因此传递给 boottest()
的设计矩阵可能是很大。事实上,如果您不为 fwildclusterboot::boottest()
使用 fe
参数,feols()
中指定的所有固定效应都将被转换为虚拟变量,并且 bootstrap 中没有固定效应被投影。您可以通过 运行 通过 lm()
或 glm()
(或通过 Stata 中的类似命令)进行回归来检查这是否是错误的根源,并查看这些估计是否由于内存而失败还有。
boottest
和 fwildclusterboot
是完全矢量化的 - 因此两者都计算权重矩阵 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 关于使用 boottest
和 pplmhdfe
。
更新 2
如果你想 运行 野生集群 bootstrap 因为你担心你的集群数量很低并且你的标准错误可能有偏差,另一种方法可能是尝试 degrees-of-freedom 更正在 clubSandwich package 中为 glm()
实施。尽管我不得不承认我不确定实施的校正对泊松回归的效果如何。
我有一个非常大的数据集(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
不支持泊松回归的直接结果。
boottest
和 fwildclusterboot
中的内存问题是因为
- 您正在拟合的模型非常大,fwildclusterboot 只接受一个固定效应 -
fixest
中指定的所有其他因子变量都被转换为虚拟变量,因此传递给boottest()
的设计矩阵可能是很大。事实上,如果您不为fwildclusterboot::boottest()
使用fe
参数,feols()
中指定的所有固定效应都将被转换为虚拟变量,并且 bootstrap 中没有固定效应被投影。您可以通过 运行 通过lm()
或glm()
(或通过 Stata 中的类似命令)进行回归来检查这是否是错误的根源,并查看这些估计是否由于内存而失败还有。 boottest
和fwildclusterboot
是完全矢量化的 - 因此两者都计算权重矩阵 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 关于使用 boottest
和 pplmhdfe
。
更新 2
如果你想 运行 野生集群 bootstrap 因为你担心你的集群数量很低并且你的标准错误可能有偏差,另一种方法可能是尝试 degrees-of-freedom 更正在 clubSandwich package 中为 glm()
实施。尽管我不得不承认我不确定实施的校正对泊松回归的效果如何。