Я пытаюсь включить веса опроса/выборки при использовании CBPS и WeightThem после многократного вменения. Основная структура кода моего подхода:
# MICE
var_list <- c("outcome", "x1", "x2", "x3", "x4")
tempData_pool <- mice(d2, m = 10, maxit = 20, seed = 100, include = var_list)
# Weights
weighted_pool_data <- weightthem(x1 ~ x2 + x3 + x4),
data = tempData_pool,
method = "cbps",
estimand = "ATT")
# Model
weighted_pool_model <- with(weighted_pool_data,
estimatr::lm_robust(outcome ~ x1 + x2 + x3 + x4))
weighted_pool_results <- pool(weighted_pool_model)
Посмотрев документацию CBPS (https://cran.r-project.org/web/packages/CBPS/CBPS.pdf), я попытался включить веса опросов в регрессионную модель следующим образом:
weighted_pool_model <- with(weighted_pool_data,
estimatr::lm_robust(outcome ~ x1 + x2 + x3 + x4), sample.weight = wgtvar)
weighted_pool_results <- pool(weighted_pool_model)
И хотя это не вызывает ошибки, похоже, ни один из коэффициентов или SE не меняется вообще, что заставляет меня думать, что на самом деле здесь не используются веса опроса.
Я предполагаю, что это связано с тем, что переменная веса опроса (wgtvar) не включена в модель вменения, поэтому, возможно, она не переносится из исходного фрейма данных (d2) в объект вмененных данных, который используется с weightthem()?
Обновлено: приведенное ниже будет работать с survey::svyglm заменой lm_robust, но поскольку я использую вменение, данные представляют собой объект Wimids, а не фрейм данных. Насколько я могу судить, там он не сотрудничает.
design <- survey::svydesign(
ids = ~1,
weights = ~wgtvar,
data = weighted_pool_data)
Спасибо; концептуально это действительно полезное резюме, но не упускаю ли я что-то о том, как это помогает технике кода включать веса опросов, о которых я спрашиваю? В основном это относится к коду Stata (который я использую чаще, чем R!)
Это не имеет ничего общего с вашим кодом, за исключением того, что эта конкретная функция регрессии не поддерживает веса опроса (и не все аргументы weight создаются равными). Возможно survey::svyglm сможешь делать то, что хочешь?
Спасибо, я добавлю правку, которая не работает, но может быть полезна.





WeightIt v1.0.0 имеет функцию glm_weightit(), которая при наличии объекта weightit, содержащего веса опроса, автоматически включает их в оценку параметров конечной модели и правильно предоставляет матрицу отклонений, которая корректируется с учетом них. Можно использовать glm_weightit() с обновленной версией MatchThem (версия 1.2.1 и выше).
Во-первых, вам следует убедиться, что веса вашего опроса включены в оценку весов, то есть с помощью аргумента s.weights. Тогда вы сможете использовать glm_weightit(), чтобы подогнать модель результата к каждому вмененному набору данных.
library("mice")
weighted_pool_data <- weightthem(x1 ~ x2 + x3 + x4),
data = tempData_pool,
method = "cbps",
estimand = "ATT",
s.weights = "wgtvar")
cobalt::bal.tab(weighted_pool_data, abs = TRUE)
fit <- with(weighted_pool_data,
WeightIt::glm_weightit(outcome ~ x1 + x2 + x3 + x4))
fit |> pool() |> summary()
G-вычисление немного сложнее, потому что вам нужно включить веса опроса в стандартизацию и подмножество ваших данных для таргетинга на ATT. Сейчас это нужно делать вручную:
library("marginaleffects")
lapply(1:tempData_pool$m, function(i) {
avg_comparisons(fit$analyses[[i]], variables = "x1",
newdata = subset(complete(tempData_pool, i), x1 == 1),
wts = "wgtvar")
}) |> mice::pool() |> summary()
(В следующей версии marginaleffects вы сможете опускать complete(tempData_pool, i) из вызова subset().)
Обязательно к прочтению здесь.
estimatr::lm_robustне документирует это явно, но они используют точные веса.