Я создал 10 сводок моделей после установки одной и той же модели на 10 различных подмножествах набора данных, а именно:
library(mice)
data("nhanes")
head(nhanes)
imp <- mice(nhanes, print = FALSE, m = 10, seed = 24415)
df <- complete(imp, "long")
model_fit <- lapply(1:10, function(i) {
model = lm(bmi ~ age + hyp + chl,
data = subset(df, `.imp`==i))
})
Из этого я получаю разные ggpredict
предметы.
ggpredict(model_fit[[1]], c("age", "hyp"))
ggpredict(model_fit[[2]], c("age", "hyp"))
ggpredict(model_fit[[3]], c("age", "hyp"))
ggpredict(model_fit[[4]], c("age", "hyp"))
ggpredict(model_fit[[5]], c("age", "hyp"))
ggpredict(model_fit[[6]], c("age", "hyp"))
ggpredict(model_fit[[7]], c("age", "hyp"))
ggpredict(model_fit[[8]], c("age", "hyp"))
ggpredict(model_fit[[9]], c("age", "hyp"))
ggpredict(model_fit[[10]], c("age", "hyp"))
Я ищу эффективный способ: а) Оценить среднее значение всех ggpredict
объектов по здоровью и возрасту.
Ожидаемый результат будет выглядеть так.
age hp Predicted 95% C.I
--------------------------------------------------------
1 1 (28.38 + 29.35 + 27.3...)/10 (26.67 +2 6.83 + 25.25...)/10 ; (30.08 + 31.87 + 29.35....)/10
2 1 (24.21 + 26.01 + 25.40...)/10 (22.71 + 23.56 + 23.54...)/10 ; (25.71 + 28.46 + 27.26....)/10
3 1 (20.05 + 22.67 + 23.51...)/10 (17.13 + 17.89 + 20.08..)/10 ; (22.96 + 27.44 + 26.94...)/10
1 2 (31.82 + 29.35 +28.87...)/10 (28.07 + 23.58 + 24.24...)/10 ; (35.58 + 35.13 + 33.49....)/10
2 2 (27.66 + 26.01 +26.97...)/10 (24.88 + 22.02 + 23.43...)/10 ; (30.43 + 30.00 + 30.52....)/10
3 2 (23.49 + 22.67 +25.08...)/10 (20.63 + 18.73 + 21.50...)/10 ; (26.35 + 26.61 + 28.66....)/10
б) Постройте график на основе окончательных усредненных значений с использованием функции ggplot.
До сих пор я пытался сохранить результаты каждой функции ggpredict
как объект списка и
`Reduce(`+`, list_ggpred)/length(list_ggpred)`
Я получил предупреждение,
" In Ops.factor(left, right) : `+1 not meaningful for factors.
Любые предложения высоко ценятся. Спасибо.
Возможно, я неправильно понял, но один из возможных вариантов может быть:
library(mice)
library(ggeffects)
data("nhanes")
head(nhanes)
#> age bmi hyp chl
#> 1 1 NA NA NA
#> 2 2 22.7 1 187
#> 3 1 NA 1 187
#> 4 3 NA NA NA
#> 5 1 20.4 1 113
#> 6 3 NA NA 184
imp <- mice(nhanes, print = FALSE, m = 10, seed = 24415)
df <- complete(imp, "long")
model_fit <- lapply(1:10, function(i) {
model = lm(bmi ~ age + hyp + chl,
data = subset(df, `.imp`==i))
})
library(tidyverse)
list_of_results <- map(model_fit, ggpredict, c("age", "hyp"))
ggpredicts <- map(list_of_results, `[[`, "predicted")
map(ggpredicts, mean)
#> [[1]]
#> [1] 25.93424
#>
#> [[2]]
#> [1] 26.01019
#>
#> [[3]]
#> [1] 26.18797
#>
#> [[4]]
#> [1] 26.69359
#>
#> [[5]]
#> [1] 25.90896
#>
#> [[6]]
#> [1] 26.26845
#>
#> [[7]]
#> [1] 26.10574
#>
#> [[8]]
#> [1] 25.81957
#>
#> [[9]]
#> [1] 26.34521
#>
#> [[10]]
#> [1] 26.89521
df <- bind_cols(map(ggpredicts, mean))
colnames(df) <- paste0("Model_", str_pad(1:10, 2, pad = "0"))
df %>%
pivot_longer(everything(),
values_to = "mean prediction",
names_to = "model") %>%
ggplot(aes(x = `model`, y = `mean prediction`)) +
geom_col() +
theme_bw()
Created on 2024-04-24 with reprex v2.1.0
Близко ли это к ожидаемому вами результату?
Так?
library(mice)
library(ggeffects)
library(tidyverse)
imp <- mice(nhanes, print = FALSE, m = 10, seed = 24415)
df <- complete(imp, "long")
model_fit <- lapply(1:10, function(i) {
model = lm(bmi ~ age + hyp + chl,
data = subset(df, `.imp`==i))
})
map(model_fit, ggpredict, c("age", "hyp")) |>
bind_rows(.id = "id") |>
rename(age = x, hyp = group) |>
as_tibble() |>
summarise(across(c(predicted, conf.low, conf.high), mean), .by = c(age, hyp))
#> # A tibble: 6 × 5
#> age hyp predicted conf.low conf.high
#> <dbl> <fct> <dbl> <dbl> <dbl>
#> 1 1 1 28.6 26.5 30.6
#> 2 1 2 30.7 26.4 35.0
#> 3 2 1 25.2 23.3 27.0
#> 4 2 2 27.3 24.1 30.5
#> 5 3 1 21.8 18.3 25.2
#> 6 3 2 23.9 20.5 27.2
Created on 2024-04-24 with reprex v2.1.0
Просто используйте pool_predictions()
:
library(ggeffects)
# example for multiple imputed datasets
data("nhanes2", package = "mice")
imp <- mice::mice(nhanes2, printFlag = FALSE)
predictions <- lapply(1:5, function(i) {
m <- lm(bmi ~ age + hyp + chl, data = mice::complete(imp, action = i))
predict_response(m, "age")
})
pool_predictions(predictions)
#> # Predicted values of bmi
#>
#> age | Predicted | 95% CI
#> --------------------------------
#> 20-39 | 30.09 | 28.17, 32.02
#> 40-59 | 24.60 | 21.48, 27.72
#> 60-99 | 21.75 | 18.24, 25.26
#>
#> Adjusted for:
#> * hyp = no
#> * chl = 196.32
# and:
# pool_predictions(predictions) |> plot()
Created on 2024-04-30 with reprex v2.1.0
Обратите внимание, что pool_predictions()
учитывает пропущенные значения/множественные вменения и корректирует стандартную ошибку, таким образом вы получаете немного большие доверительные интервалы, чем просто взятие среднего значения.
прошу прощения за неясность, я обновил свой вопрос более подробно. Это полезно?