【问题标题】:MatchIt (propensity score matching package for R) throws errors concerning NAs producedMatchIt(R 的倾向得分匹配包)引发有关产生的 NA 的错误
【发布时间】:2021-10-18 17:38:46
【问题描述】:

我在具有 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%,磁盘并没有真正被触及。

【问题讨论】:

  • 你的nc * nr 相对于optmatch:::getMaxProblemSize() 是什么?
  • @Chris - 我很想了解自己。知道我是怎么找到的吗?
  • 在四处寻找确切的错误时,lines 48-55 提出了一种方法,但仍然没有找到确切的错误文件。
  • 错误传播的确切位置可能与公式有关,而不是来自matchItoptmatch,如here,在您的情况下可能是glm。整数溢出是说整数类(Uint8/16/32/64)正在包装,因为它用完了整数,所以计数。并且将最大问题大小设置为 inf 并不能解决这个问题。

标签: r propensity-score-matching


【解决方案1】:

这是一种有趣的错误,与MatchIt无关。这与 R 不能将大数表示为整数这一事实有关。

我假设您有大约 35000 个处理单元和 65000 个控制单元。 optmatch 将问题大小计算为nc * nr,其中nc 是控制数,nr 是处理数。 optmatch 将这些数字存储为整数,因为它们是内部使用的距离矩阵的维度。对于nr = 35000nc = 65000nc * nr 是一个非常大的数字。 R 不能表示大为整数的数字(请参阅here),而是为该值生成NA。因为NA不能在if语句中使用,所以会抛出错误。

除了使用较小的样本或要求optmatch 开发人员修复此错误外,没有解决此问题的方法。他们可以通过在计算 nc * nr 之前将 ncnr 转换为双精度值来轻松解决此问题。


21 年 8 月 21 日编辑:我联系了 optmatch 维护人员,他们解决了这个问题。它将在即将发布的optmatch 版本中更正。

【讨论】:

  • 谢谢诺亚。抱歉,这么久才回复,最近工作很忙。您的回复非常有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多