加速MatchIt

18

我在使用MatchIt包中的R语言运行匹配过程。我使用倾向得分匹配,即:通过逻辑回归估计治疗选择,并选择最近的匹配。

数据集非常大(400万行),有没有加快速度的方法?

为了清楚起见,这是我所做的:

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

你在其他地方找到解决方案了吗?我的数据集也有大约350列,400万行,可用内存为120 GB。它已经运行了15个小时。我认为这个进程卡住了... - androboy
哇,30天...我猜我会立刻开始你的匹配并解决它。你知道用Python/EMR/Spark/Hadoop还有其他什么方法吗? - androboy
@androboy... 找到匹配的问题呈指数增长,因此400,000个OBS需要16小时左右... 至少可以说是令人痛苦的。我认为并行函数是解决问题的方法,我不明白为什么在Python中速度会更快(显著)。匹配只是进行一些检查,实际的提升是通过C完成的。 - Repmat
我现在考虑使用k-means聚类来分割数据,并针对每个簇并行运行MatchIt-倾向得分匹配,最后将匹配结果合并。但我真的不确定还会遇到什么其他问题... - androboy
2
为了后人纪念:自从这个问题被提出以来,MatchIt已经得到了改进。现在它使用C++进行匹配,因此速度更快,并且具有生成进度条的功能。通过对变量进行精确匹配(如@Repmat所做的那样),可以进一步加快匹配速度,这将自动匹配子组内的内容。 - Noah
显示剩余5条评论
1个回答

1
我同样感到沮丧,但是找到了解决方案。
实际上,我将倾向得分匹配分为了三个步骤,从而大大减少了运行时间:
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,因此上述代码适用于该情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接