Почему результаты сопоставления зависят от порядка данных (пакет MatchIt)? - PullRequest
0 голосов
/ 08 апреля 2019

При использовании функции matchit для полного сопоставления результаты отличаются порядком входного кадра данных. То есть, если порядок данных изменяется, результаты тоже меняются. Это удивительно, потому что в моем понимании оптимальный полный алгоритм должен дать только одно наилучшее решение.

Я что-то упустил или это ошибка?

Подобные различия возникают при оптимальном алгоритме.

Ниже вы найдете воспроизводимый пример. Подклассы должны быть идентичны для двух наборов данных, которые они не являются. Спасибо за вашу помощь!

# create data
nr <- c(1:100)
x1 <- rnorm(100, mean=50, sd=20)
x2 <- c(rep("a", 20),rep("b", 60), rep("c", 20))
x3 <- rnorm(100, mean=230, sd=2)
outcome <- rnorm(100, mean=500, sd=20)
group <- c(rep(0, 50),rep(1, 50))

df <- data.frame(x1=x1, x2=x2, outcome=outcome, group=group, row.names=nr, nr=nr)
df_neworder <- df[order(outcome),]  # re-order data.frame

# perform matching
model_oldorder <- matchit(group~x1, data=df, method="full", distance ="logit")
model_neworder <- matchit(group~x1, data=df_neworder, method="full", distance ="logit")

# store matching results
matcheddata_oldorder <- match.data(model_oldorder, distance="pscore")
matcheddata_neworder <- match.data(model_neworder, distance="pscore")


# Results based on original data.frame
head(matcheddata_oldorder[order(nr),], 10)
          x1 x2  outcome group nr    pscore weights subclass
1  69.773776  a 489.1769     0  1 0.5409943     1.0       27
2  63.949637  a 529.2733     0  2 0.5283582     1.0       32
3  52.217666  a 526.7928     0  3 0.5028106     0.5       17
4  48.936397  a 492.9255     0  4 0.4956569     1.0        9
5  36.501507  a 512.9301     0  5 0.4685876     1.0       16


# Results based on re-ordered data.frame
head(matcheddata_neworder[order(matcheddata_neworder$nr),], 10)
          x1 x2  outcome group nr    pscore weights subclass
1  69.773776  a 489.1769     0  1 0.5409943     1.0       25
2  63.949637  a 529.2733     0  2 0.5283582     1.0       31
3  52.217666  a 526.7928     0  3 0.5028106     0.5       15
4  48.936397  a 492.9255     0  4 0.4956569     1.0        7
5  36.501507  a 512.9301     0  5 0.4685876     2.0       14

Видимо, назначение объектов подклассам отличается. В моем понимании, это не должно быть так.

1 Ответ

0 голосов
/ 17 апреля 2019

Разработчики пакета optmatch (который вызывает функция matchit) предоставили полезную помощь:

Я думаю, что то, что мы видим здесь, является результатом аргумента терпимости этот полный матч имеет. Алгоритм сопоставления требует целочисленных расстояний, поэтому мы должны масштабировать, а затем обрезать расстояния с плавающей точкой. Для данный набор целых расстояний, может быть несколько совпадений, которые достичь минимума, так что решатель может свободно выбирать среди этих неуникальные решения.

Developing your example a little more:
> library(optmatch) 
> nr <- c(1:100) x1 <- rnorm(100, mean=50, sd=20)
> outcome <- rnorm(100, mean=500, sd=20) group <- c(rep(0, 50),rep(1, 50)) 
> df_oldorder <- data.frame(x1=x1, outcome=outcome, group=group, row.names=nr, nr=nr) > df_neworder <- df_oldorder[order(outcome),]  # > re-order data.frame 
> glm_oldorder <- match_on(glm(group~x1, > data=df_oldorder), data = df_oldorder) 
> glm_neworder <- > match_on(glm(group~x1, data=df_neworder), data = df_neworder) 
> fm_old <- fullmatch(glm_oldorder, data=df_oldorder) 
> fm_new <- fullmatch(glm_neworder, data=df_neworder)

> mean(sapply(matched.distances(fm_old, glm_oldorder), mean))
> ## 0.06216174 

> mean(sapply(matched.distances(fm_new, glm_neworder), mean))
> ## 0.062058 mean(sapply(matched.distances(fm_old, glm_oldorder), mean)) -  

> mean(sapply(matched.distances(fm_new, glm_neworder), mean))
> ## 0.00010373 

, который мы видим, меньше, чем допуск по умолчанию 0,001. Вы всегда можете уменьшить уровень допуска, который может

требуется увеличенное время выполнения, чтобы приблизиться к истинному плавающий положить минимум. Мы нашли 0,001, похоже, хорошо работает на практике, но в этом значении нет ничего особенного.

...