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 = 35000nc = 65000nc * nr 是一个非常大的数字。 R 不能表示像整数那样大的数字(参见 here),而是为此值生成 NA。因为 NA 不能在 if 语句中使用,所以会抛出错误。

除了使用较小的样本或请求 optmatch 开发人员修复此错误外,没有解决此问题的方法。他们可以通过在计算 nc * nr.

之前将 ncnr 转换为双精度值来轻松解决此问题

编辑 8/21/21:我联系了 optmatch 维护者,他们解决了这个问题。将在 optmatch.

的即将发布的版本中进行更正