Соответствующий пакет выборки или функция для большого набора данных - PullRequest
1 голос
/ 21 июня 2019

Мне нужен пакет или функция R, которые позволят мне сопоставить элементы управления с случаями для большого набора данных, 5 миллионов объектов.Я перепробовал несколько пакетов, мои проблемы приведены ниже.Я пытался сопоставить только по одной ковариате, и мне, скорее всего, нужно будет сопоставить по нескольким.

Пакет MatchIt: метод ближайшего соседа, оптимальные и генетические методы все работают в течение нескольких часов.Метод "cem" работает очень быстро, но мне нужно знать, какие случаи были сопоставлены / не сопоставлены, чтобы я мог провести дальнейший анализ с подобранным подмножеством.Выполнение match.data() для результатов cem предоставляет только веса, которые будут использоваться в регрессии, а не соответствующее подмножество.Парная функция в 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 подразумевает, что функция создает большое количество кластеров, как / я могу ограничить это?

Буду признателен за любую помощь в ускорении некоторых из вышеперечисленных функций или новые предложения.

1 Ответ

0 голосов
/ 01 июля 2019

После более внимательного прочтения документации 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)
...