MatchIt(R 的倾向得分匹配包)抛出有关生成的 NA 的错误
MatchIt (propensity score matching package for R) throws errors concerning NAs produced
我在具有 128GB RAM 的系统上使用 MatchIt 包。
首先,我的数据没有任何NA。我的第一个努力,使用广义线性模型(默认为逻辑回归)和“最近邻”工作:
headache6MontsMatch1 <- matchit(Headache_past_six_months ~ sex + age + townsend + alcohol + smoking, method="nearest", distance="glm", data=reducedDF)
但是,从大约 100,000 条记录中,我从匹配中丢失了大约 30,000 条。我想尝试一个最佳的“完整”方法。
headache6MontsMatch2 <- matchit(Headache_past_six_months ~ sex + age + townsend + alcohol + smoking, method="full", link="probit", distance="glm", data=reducedDF)
不幸的是,这会引发错误:
NAs produced by integer overflowError in if ((nc * nr > getMaxProblemSize()) && warning.requested) { :
missing value where TRUE/FALSE needed
进一步研究 getMaxProblemSize()
,我似乎被限制在匹配的硬性限制内。所以我试过了:
setMaxProblemSize()
然后用 getMaxProblemSize
仔细检查问题大小,得到 Inf.
但我仍然 运行 遇到同样的问题。我的机器在 128GB 的内存中大约有 56GB 的内存,CPU 只消耗了 6%,而且磁盘并没有真正被触及。
这是一种有趣的错误,与MatchIt
无关。这与 R 不能将大数表示为整数这一事实有关。
我假设您有大约 35000 个处理单元和 65000 个控制单元。 optmatch
计算问题大小为 nc * nr
,其中 nc
是控制数,nr
是处理数。 optmatch
将这些数字存储为整数,因为它们是内部使用的距离矩阵的维度。对于 nr = 35000
和 nc = 65000
,nc * nr
是一个非常大的数字。 R 不能表示像整数那样大的数字(参见 here),而是为此值生成 NA
。因为 NA
不能在 if
语句中使用,所以会抛出错误。
除了使用较小的样本或请求 optmatch
开发人员修复此错误外,没有解决此问题的方法。他们可以通过在计算 nc * nr
.
之前将 nc
和 nr
转换为双精度值来轻松解决此问题
编辑 8/21/21:我联系了 optmatch
维护者,他们解决了这个问题。将在 optmatch
.
的即将发布的版本中进行更正
我在具有 128GB RAM 的系统上使用 MatchIt 包。
首先,我的数据没有任何NA。我的第一个努力,使用广义线性模型(默认为逻辑回归)和“最近邻”工作:
headache6MontsMatch1 <- matchit(Headache_past_six_months ~ sex + age + townsend + alcohol + smoking, method="nearest", distance="glm", data=reducedDF)
但是,从大约 100,000 条记录中,我从匹配中丢失了大约 30,000 条。我想尝试一个最佳的“完整”方法。
headache6MontsMatch2 <- matchit(Headache_past_six_months ~ sex + age + townsend + alcohol + smoking, method="full", link="probit", distance="glm", data=reducedDF)
不幸的是,这会引发错误:
NAs produced by integer overflowError in if ((nc * nr > getMaxProblemSize()) && warning.requested) { :
missing value where TRUE/FALSE needed
进一步研究 getMaxProblemSize()
,我似乎被限制在匹配的硬性限制内。所以我试过了:
setMaxProblemSize()
然后用 getMaxProblemSize
仔细检查问题大小,得到 Inf.
但我仍然 运行 遇到同样的问题。我的机器在 128GB 的内存中大约有 56GB 的内存,CPU 只消耗了 6%,而且磁盘并没有真正被触及。
这是一种有趣的错误,与MatchIt
无关。这与 R 不能将大数表示为整数这一事实有关。
我假设您有大约 35000 个处理单元和 65000 个控制单元。 optmatch
计算问题大小为 nc * nr
,其中 nc
是控制数,nr
是处理数。 optmatch
将这些数字存储为整数,因为它们是内部使用的距离矩阵的维度。对于 nr = 35000
和 nc = 65000
,nc * nr
是一个非常大的数字。 R 不能表示像整数那样大的数字(参见 here),而是为此值生成 NA
。因为 NA
不能在 if
语句中使用,所以会抛出错误。
除了使用较小的样本或请求 optmatch
开发人员修复此错误外,没有解决此问题的方法。他们可以通过在计算 nc * nr
.
nc
和 nr
转换为双精度值来轻松解决此问题
编辑 8/21/21:我联系了 optmatch
维护者,他们解决了这个问题。将在 optmatch
.