我需要一个R包或函数,使我可以将控件与大型数据集(500万个主题)的案例匹配。 我已经尝试了一些软件包,下面总结了我的问题。我只尝试匹配单个协变量,并且很可能需要匹配多个协变量。
软件包MatchIt
:最近的邻居,最优方法和遗传方法都运行了几个小时。 "cem"
方法的运行速度非常快,但我需要知道匹配/不匹配的情况,以便可以对匹配的子集进行进一步的分析。在cem上运行match.data()
的结果仅提供在回归中使用的权重,而不提供匹配的子集。如果我想要一对一匹配,但我想保留尽可能多的控件,则cem中的配对函数将起作用。
matchControls()
包中的 e1071
:运行很长时间,它们返回"not able to allocate vector of size 1352 GB"
Match()
包中的 Matching
函数:只需运行并运行...
quickmatch()
包中的 quickmatch
:运行很快,但是我不确定我是否正确使用了该函数或如何从返回的"qm_matching"
对象中提取匹配的数据。以下是我对伪造数据使用quickmatch
的尝试。
library(MatchIt)
library(cem)
library(Matching)
library(rgenoud)
library(quickmatch)
set.seed(100)
control_df=data.frame(Group=factor("Control"),value=rnorm(1400000,95,2))
set.seed(101)
treatment_df=data.frame(Group=factor("Treatment"),value=c(rnorm(500000,92,2),rnorm(100000,50,5)))
dat=rbind(control_df,treatment_df)
covariate_balance(dat$Group, dat$value, matching = NULL,
normalize = TRUE, all_differences = TRUE)
my_distances <- distances(dat, dist_variables = c("value"))
matchedDat=quickmatch(my_distances,dat$Group )
matchedDat.df=data.frame(matchedDat)
不确定如何处理返回的对象。我认为quickmatch
可能是最可行的选择。 covariate_balance
结果表明,对照组和治疗组之间存在相当大的失衡,因此可以进行一定程度的匹配。
具体地说,我如何获得匹配的结果,即标记在控制和治疗之间成功匹配的受试者? cluster_label
中的matchedDat.df
表示该函数正在创建大量群集,如何/可以限制它?
在加速上述某些功能方面的任何帮助或提出新建议都将不胜感激。
答案 0 :(得分:0)
在仔细阅读了cem
文档之后,我认为我可以使用Matchit
软件包或cem
软件包解决问题。
library(cem)
library(tidyverse)
set.seed(100)
control_df=data.frame(Group=factor("Control"),value=rnorm(1400000,95,2))
set.seed(101)
treatment_df=data.frame(Group=factor("Treatment"),value=c(rnorm(500000,92,2),rnorm(100000,50,5)))
dat=rbind(control_df,treatment_df)%>% rownames_to_column()
cem.match=cem(treatment="Group", baseline.group="Control",data=dat,keep.all=TRUE, drop ="rowname")
matchedData=data.frame(Group.check=cem.match$groups, matched=cem.match$matched,weights=cem.match$w)%>%
rownames_to_column()%>%
inner_join(dat,by="rowname") %>%
filter(matched==TRUE)