Можно ли извлечь результаты моделей, соответствующих множеству вмененных наборов данных, во фрейм данных?

Можно ли извлечь в фрейм данных объединенные оценки из нескольких моделей, подходящие для умножения условно исчисленных данных?

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

library(tidyverse)
library(broom)
library(mice)

data <- nhanes
sapply(data, function(x) sum(is.na(x))) #check missing data
data <- data %>% filter(bmi !="NA" & hyp != "NA" & chl != "NA") # remove missing data

out <-c("bmi")
exp <- c("chl","age","factor(hyp)")

#run models and extract to tidy data frame
models <- expand.grid(out, exp) %>%
group_by(Var1) %>% rowwise() %>%
summarise(frm = paste0(Var1, "~", Var2)) %>%
group_by(model_id = row_number(),frm) %>%
do(tidy(lm(.$frm, data = data))) %>%
mutate(lci = estimate-(1.96*std.error),
     uci = estimate+(1.96*std.error))

Ниже приведен пример вменения недостающих данных с использованием mice и подгонки только одной регрессионной модели:

# Impute missing data using mice
data <- nhanes
imp <- mice(data, print = F)

#Fit single model
fit <- with(imp, lm(bmi ~ chl))

#Get pooled estimates
a <- pool(fit)

summary(a)

person aelhak    schedule 06.09.2018    source источник
comment
Хотите ли вы по одной модели для каждого набора условно исчисленных данных?   -  person nghauran    schedule 06.09.2018
comment
Спасибо - в конечном итоге я хотел бы получить общую сводную оценку после подбора модели для каждого набора условно исчисленных данных. Можно ли использовать «пул» с вашим кодом - я думаю, нужно будет преобразовать его обратно в «средние» после запуска 5 моделей, чтобы выполнить «пул»?   -  person aelhak    schedule 07.09.2018
comment
Вы хотите, чтобы для каждого mids были разные модели?   -  person nghauran    schedule 07.09.2018
comment
Я хочу получить общую оценку. В моем примере выше это достигается путем выполнения 'pool (fit)' после выполнения 'fit ‹- with (imp, lm (bmi ~ chl))' ... Как показано ниже, ваш вывод дает результат для каждого набора данных, где вместо Я хочу получить общую оценку   -  person aelhak    schedule 07.09.2018


Ответы (1)


Ключевым моментом здесь является начать с complete(imp, "long"), поскольку он предоставляет все условно рассчитанные наборы данных. После этого вам придется немного поиграть с некоторыми tidyverse и broom функциями, особенно nest() и tidy(), которые здесь очень полезны. Попробуй это:

library(tidyverse)
library(broom)
library(mice)
data <- nhanes # data
imp <- mice(data, print = F) # imputation
# complete data
data.complete <- complete(imp, "long")  
glimpse(data.complete) # all the 5 imputations are here

data.complete %>% 
        select(-.id) %>% 
        nest(-.imp) %>%
        mutate(model = map(data, ~lm(bmi ~ chl, data = .)),
               tidied = map(model, tidy)) %>%
        unnest(tidied) %>%
        filter(term == "chl") %>%
        mutate(adjusted = p.adjust(p.value),
               lci = estimate-(1.96*std.error),
               uci = estimate+(1.96*std.error))
# output
  .imp term   estimate  std.error statistic     p.value   adjusted           lci        uci
1    1  chl 0.01972747 0.01755024  1.124057 0.272584078 0.45430932 -0.0146709916 0.05412594
2    2  chl 0.02133664 0.01719462  1.240891 0.227154661 0.45430932 -0.0123648105 0.05503808
3    3  chl 0.03070542 0.01534959  2.000407 0.057397701 0.22512674  0.0006202261 0.06079062
4    4  chl 0.04109955 0.02044568  2.010183 0.056281686 0.22512674  0.0010260220 0.08117308
5    5  chl 0.05448964 0.01585764  3.436175 0.002251967 0.01125984  0.0234086522 0.08557062
person nghauran    schedule 06.09.2018
comment
Есть ли простой способ применить здесь правила Рубина для получения объединенных оценок? - person Brandon; 24.05.2020