У меня достаточно большой набор данных (n ~ 6400), с несколькими пропусками (<1%) по большинству переменных, некоторыми пропусками (1-4%) по нескольким переменным и одной переменной с пропуском около 10%. Выборка является репрезентативной для некоторых важных демографических данных (например, данные, регион), но также значительно отличается в других. </p>
Цель анализа - представить оба варианта: а) распространенность некоторых ключевых переменных (т.е. описательная статистика) и b) предикторы, влияющие на некоторые ключевые переменные (например, статистику логического вывода с использованием glm / lm).
Мой текущий рабочий процесс выглядит следующим образом a) импорт данных b) очистка данных c) многократное вменение с использованием пакета мышей d) грабли с использованием пакета обследования, на основе совместного и предельного распределения, взятого из данных национальной переписи.
Пример воспроизведения (мой набор данных намного более сложный, хотя):
set.seed(123)
library(mice)
library(mitools)
library(survey)
nhanes
# Multiple Imputation
imp <- mice(nhanes)
# lm fit with imputed dataset (to compare results)
fit <-with(imp, lm(bmi~chl+hyp+age))
#Creating an ImputationList
mi_list <- imputationList(lapply(1:imp$m, function(n) mice::complete(imp, action = n)))
Снятие вмененного набора данных, вдохновленного этим ответом Снятие множественного вмененного набора данных
des <- svydesign(id=~1,data=mi_list)
imp.rake <- des #copy design structure
#Creating marginal distribution for variable chl with made up frequencies to be used for raking
chl.dist <- data.frame(chl = c("113","118","131","184","186","187","199","204","206","218","229","238","284"),
Freq = 1324 * c(0.12, 0.1, 0.08, 0.07, 0.05, 0.07, 0.1, 0.07, 0.08, 0.09, 0.05, 0.06, 0.06)
)
# apply rake function to each imputation
imp.rake$designs <-
lapply(
des$designs ,
rake,
sample.margins = list(~chl),
population.margins = list(chl.dist)
)
# Trim Weights to 1/100 and 100 (not necessary in this particular example)
imp.rake$designs <-
lapply(
imp.rake$designs,
trimWeights,
lower=0.01,upper=100,trim=TRUE)
Наконец, я сравниваю подгонку обеих моделей
summary(pool(fit)) #raw
fit2 <-with(imp.rake, svyglm(bmi~chl+hyp+age))
summary(MIcombine(fit2))
Вопросы
- Является ли этот общий рабочий процесс для создания вмененного и взвешенного набора данных правильным?
- Чтобы сообщить о Если исходить из исходных необработанных данных, а также из нескольких вмененных и взвешенных данных, было бы неплохо иметь объединенную или усредненную версию последних, которая позволила бы мне применять одну и ту же сводную статистику к обоим. Например, сейчас я использую пакет compareGroups для сводной статистики, но я не могу использовать это для объекта svyimputationlist. Или было бы более разумно просто набирать (не вменять) и преобразовывать svydesign в фрейм данных (как в Как преобразовать "svyrep.design" 'в data.frame? ) для описательной статистики?
- Как мне получить p-значения из моего glm? Я видел этот урок здесь https://francish.netlify.com/post/multiple-imputation-in-r-with-regression-output/, но, похоже, он работает только для lm.