Matching.Моделирование и оценка данных с помощью MatchIt и Matching.Как получить истинную модель? - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь смоделировать чувствительность соответствия по сравнению с регрессией (OLS), но я где-то делаю что-то не так, потому что не могу получить истинную модель, используя matching.

Я генерирую 3 переменные: x, фоновую характеристику, d, которая является переменной Обработки (двоичная) и y результат.d связано с x.Идея сопоставления заключается в том, что, будучи обусловленным x, процесс генерации назначения лечения будет как случайным.В мире регрессии x является просто управляющей переменной.Я хочу проверить, как работает регрессия, когда в данных есть область необычной поддержки (не рассматривается выше или ниже определенных значений).

library(tidyverse)
library(Matching)
library(MatchIt)

N = 1000
# generate random variable normality dist #
x = rnorm(N, 0, 5)

Так я генерирую связь между x иd (двоичный).

# generate Treatement associated with x, with different probailities after a certain threshold #
d = ifelse(x > 0.7, rbinom(0.7 * N, 1, 0.6) , rbinom( (1 - 0.7) * N, 1, 0.3) )
# beyond 0.7 the proba is 0.6 to receive treatment and below is 0.3 #

Мне кажется правильным, но если у вас есть лучший способ сделать это, дайте мне знать.

# adding a bit more randomness #
d[ sample(length(d), 100) ] <- rbinom(100, 1, 0.5)

# also adding a cut-off point for the treated #  
d[x < -10] <- 0
d[x > 10] <- 0

Я генерирую эффект d, используя ifelse, мне кажется правильным, но я могу ошибаться.

# generate outcome y, w/ polyn relationship with x and a Treatment effect of 15 # sd == 10 #
y = x*1 + x^2 + rnorm(N, ifelse(d == 1, 15, 0), 10)

#
df = cbind(x,d,y) %>% as.data.frame()
# check out the "common support"
df %>% ggplot(aes(x, y, colour = factor(d) )) + geom_point()
#

На графике показано, как я хочу смоделировать 3 отношения.Обратите внимание на срезы выше и ниже 10 для обработанных.

enter image description here

Теперь, когда я оцениваю влияние d на y с OLS, модель с опущенной переменной и неправильно заданная модель, как и ожидалось, даютмне неверная оценка d.

# omitted x #
lm(y ~ d, df) %>% summary()
# misspecification #
lm(y ~ d + x, df) %>% summary()
# true model #

В то время как правильная спецификация дает мне 15 (истинный эффект d).

lm(y ~ d + poly(x,2), df) %>% summary()
# we correctly retrieve 15 #

Теперь моя проблема в том, чтобы понять, почему я не могу добраться до 15 (истинный эффект от d) с соответствующими пакетами.

Использование пакета MatchIt.

Я пытался использовать mahalanobis и оценку склонности, например:

m1 = matchit(d ~ x, df, distance = 'mahalanobis', method = 'genetic')
m2a = matchit(d ~ x, df, distance = 'logit', method = 'genetic')
m2b = matchit(d ~ x + I(x^2), df, distance = 'logit', method = 'genetic')

Сопоставление данных

mat1 = match.data(m1)
mat2a = match.data(m2a)
mat2b = match.data(m2b)

# OLS #
lm(y ~ d, mat1) %>% summary()
lm(y ~ d, mat2a) %>% summary()
lm(y ~ d, mat2b) %>% summary()

Так что здесь я не получаю 15,Зачем?Я неправильно понимаю результаты?У меня сложилось впечатление, что при выполнении matching вам не нужно моделировать полиномиальные термины и / или взаимодействия.Это неправильно?

lm(y ~ d + poly(x,2), mat1) %>% summary()
lm(y ~ d + poly(x,2), mat2a) %>% summary()
lm(y ~ d + poly(x,2), mat2b) %>% summary()

Потому что я получаю 15, если я включу сюда термин poly(x,2).

Используя пакет Matching, я также получаю совершенно другую оценку

x1 = df$x
gl = glm(d ~ x + I(x^2), df, family = binomial)
x1 = gl$fitted.values

# I thought that it could be because OLS only gives ATE #
m0 = Match(Y = y, Tr = d, X = x1, estimand = 'ATE')
# but no 
m0$est

Любая подсказка?

1 Ответ

0 голосов
/ 05 октября 2018

Важным результатом процедуры сопоставления являются веса контрольных наблюдений.Весовые коэффициенты рассчитываются таким образом, чтобы распределение показателя склонности было одинаковым в обработанной и контрольной группе (после применения весовых коэффициентов).

В вашем случае это означает (начиная с вашего dgp и с вашими примечаниями):

lm(y ~ d, mat1, weights = weights) %>% summary()
lm(y ~ d, mat2a, weights = weights) %>% summary()
lm(y ~ d, mat2b, weights = weights) %>% summary()

И вот мы здесь: 15 вернулся (или фактически 14,9)!

...