Я делаю многомерную регрессию по списку переменных результата с последовательным набором независимых переменных. Для одномерной регрессии я следовал этому примеру использовать tl_uvregression из gtsummary во вложенном фрейме данных, но я пытаюсь обобщить это на многомерную регрессию, используя tbl_regression во вложенном фрейме данных, и когда я пытаюсь unnest таблицы, я получаю сообщение об ошибке, что вход должен быть списком векторов. Ниже показано, что я пробовал — я предполагаю, что мне не хватает небольшого, но важного шага, но я не могу понять, что это такое. Мой желаемый результат — это таблица выходных данных многомерной регрессии, где каждая модель является столбцом, а все ковариаты — строками (аналогично выполнению tbl_merge в списке каждой из этих многомерных моделей, выполняемых отдельно в tbl_regression).
library(tidyverse)
library(magrittr)
library(gtsummary)
library(broom)
id <- 1:2000
gender <- sample(0:1, 2000, replace = T)
age <- sample(17:64, 2000, replace = T)
race <- sample(0:1, 2000, replace = T)
health_score <- sample(0:25, 2000, replace = T)
cond_a <- sample(0:1, 2000, replace = T)
cond_b <- sample(0:1, 2000, replace = T)
cond_c <- sample(0:1, 2000, replace = T)
cond_d <- sample(0:1, 2000, replace = T)
df <- data.frame(id, gender, age, race, health_score, cond_a, cond_b, cond_c, cond_d)
regression_tables <- df %>% select(-id) %>%
gather(c(cond_a, cond_b, cond_c, cond_d), key = "condition", value = "case") %>%
group_by(condition) %>% nest() %>%
mutate(model = map(data, ~glm(case ~ gender + age + race + health_score, family = "binomial", data = .)),
table = map(model, ~tbl_regression, exponentiate = T, conf.level = 0.99)) %>%
select(table) %>% unnest(table)
Так почему бы не остановиться на шаге select и изучить структуру результата? — person Kellan Baker schedule 20.02.2021
@IRTFM Я сделал. И я не знаю, что делать с тем фактом, что table — это список функций. — person Kellan Baker schedule 20.02.2021
Попробуйте заменить последний select / nest на pull(table) %>% tbl_stack(). Используйте аргумент заголовка группы в функции стека, чтобы получить заголовки над каждой многомерной моделью. — person Kellan Baker schedule 20.02.2021
@ DanielD.Sjoberg большое вам спасибо! Я пробовал pull, но с переменной модели. Кроме того, @akrun заметил лишний ~ в вызове map(model, ~tbl_regression), который превращал вывод в непригодную для использования таблицу функций. — person Kellan Baker schedule 21.02.2021
Проблема, похоже, заключается в использовании лямбда-выражения (
~) и без его использования, т.е. с указанием аргументов. Кроме того, отсутствуютtidyдоступные методы (начиная сbroom) для извлечения в формат Tibble изtbl_regressionФактически, помимо метода OP, использующего
mapдля перебора цикла, мы могли бы просто применить модельtbl_regressionпослеnest_by(заменилиgatherнаpivot_longer, посколькуgatherустареет,pivot_longer— это обобщенная версия)Если нам нужна объединенная таблица, примените
tbl_mergeкlistизtbl_regression-выход
Спасибо тебе за это! Я должен признаться, что меня сбил с толку второй метод, просто использующий
listдля просмотра различных моделей, но я понимаю, что он приближает меня к решению. Есть ли способ превратить полученный тиббл в объединенную таблицу, используя, например,gt_summary::tbl_merge, без ручного извлечения каждой отдельной таблицы из out $ table_out? Я пыталсяlapplyбезуспешно. — person Kellan Baker; 20.02.2021@KellanBaker, ты можешь просто сделать
tbl_merge(out$table_out)— person Kellan Baker; 20.02.2021@KellanBaker Не могли бы вы проверить обновление. Причина, по которой это не сработало, заключалась в том, что
tbl_mergeожидаетlistв качестве ввода — person Kellan Baker; 20.02.2021Извините за задержку, сервер в моей безопасной среде не работает, что не позволяет мне снова войти в систему. Как только я смогу войти, я проверю это. Я очень ценю вашу помощь! — person Kellan Baker; 21.02.2021
Это сработало, спасибо! Я наконец понимаю, что вы имеете в виду, говоря о неиспользованном
~, который превратил вывод в функцию. Можете ли вы указать мне на ресурс, который объясняет, как / почему я могу просто использоватьlistдля циклического просмотра моделей во вложенном фрейме данных? Я искал объяснение этому, но не понимаю, чтоlistздесь делает вместоmap. — person Kellan Baker; 21.02.2021@KellanBaker, я использовал
list, потому что мы создаем новый столбец вmutate, а результатmodelпредставляет собой сложную структуру данных в формате списка. Итак, я обернулlist, чтобы контейнер выводить как единое целое, посколькуmutateпо умолчанию будет искать простой векторный столбец без каких-либо изысков. Используяmap, вы, по сути, перебираете каждый элемент или строку, а затем структура вывода по умолчанию — это список. Кроме того, поскольку мы используемnest_by, группировка выполняется по строкам и, таким образом, можно строить модель непосредственно для каждой строки. — person Kellan Baker; 21.02.2021