【问题标题】:Speedup MatchIt加速 MatchIt
【发布时间】:2015-06-22 16:54:17
【问题描述】:

我正在使用 MatchIt 包在 R 中运行匹配程序。我使用倾向得分匹配,即:通过logit估计治疗选择,并选择最接近的匹配。

数据集很大(400万行),有没有办法加快速度?

为了说明我做了什么:

require(MatchIt)
m.out <- matchit(treatment ~ age + agesq + male + income + ..., data = data, metod = "nearest")

【问题讨论】:

  • 您在其他地方找到解决方案了吗?我的数据集也是约 400 万行,有 350 列,可用内存为 120 GB。它从过去 15 小时开始运行。我认为这个过程被卡住了......
  • 至少对我来说,它并没有停止……我只是花了很长时间才完成(30 天 +++)。所以我最终使用了重采样方法,并用它来说服自己我得到了一致的估计。看看:cran.r-project.org/web/packages/Matching/index.html,它应该允许并行匹配。如果您在那台计算机中有几个 CPU,那么加速应该是显着的
  • 哇。 30天……我想我会马上杀了它,从你的匹配开始。你知道 python/emr/spark/hadoop 有其他方法吗?
  • @androboy... 寻找匹配的问题呈指数增长,因此 400.000 OBS 是 16 小时(-ish)... 至少可以说是痛苦的。我认为并行函数是要走的路,我不明白为什么在 Python 中它应该(显着)更快......匹配只是做一些检查,实际提升是在 C 中完成的
  • 致后代:自从提出这个问题以来,MatchIt 已经得到改进。它现在使用 C++ 进行匹配,因此速度更快,并且能够生成进度条。它可以通过精确匹配变量来进一步加快速度,就像 @Repmat 所做的那样,它会在子组内自动匹配。

标签: r performance matching


【解决方案1】:

我同样感到沮丧,但为我的情况找到了解决方案。

基本上,我发现通过将倾向得分匹配分为 3 个步骤可以显着减少运行时间:

  1. 运行回归模型并将拟合值(即倾向得分)附加到您的数据中。
  2. 将数据列缩减为只需要的内容:即唯一记录标识符和附加的倾向得分。我将修剪后的数据保存到磁盘(未显示),但如果所有内容都保存在内存中,您的实现可能仍会加快速度。
  3. 使用您的倾向得分作为用户提供的距离对修剪后的数据运行 matchit,然后将您的完整原始数据中的所有列重新连接起来。
library(MatchIt)
library(tidyverse)
library(dplyr)

#step 1
data$myfit <- fitted(glm(treatment ~ age + agesq + male + income + ..., data = data, family = "binomial"))

#step 2
trimmed_data <- select(data, unique_id, myfit, treatment)

#step 3
m.out <- matchit(treatment ~ unique_id, data = trimmed_data, method = "nearest", distance = trimmed_data$myfit)
matched_unique_ids_etc <- match.data(m.out, data = trimmed_data)
matched_unique_ids <- select(matched_unique_ids_etc, unique_id)
matched_data <- matched_unique_ids %>% inner_join(data)

公式不影响最近邻匹配过程。

我写这个的时候,matchit 的默认距离/链接是 glm/logit,所以上面的代码适用于这种情况。

【讨论】:

    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多