Я делаю многомерную регрессию по списку переменных результата с последовательным набором независимых переменных. Для одномерной регрессии я следовал этому примеру использовать 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