Использование nest and tidy для создания форматированного вывода регрессии html в RMarkdown

Я использовал tidyr::nest для запуска серии моделей логистической регрессии с различными зависимыми переменными. Я хочу вывести результаты в виде единой таблицы html в RMarkdown с каждой моделью в виде столбца и строками в виде экспоненциальных коэффициентов с 99% доверительных интервалов. Я не могу понять рабочий процесс между nest, tidy и пакетом визуализации таблиц, таким как stargazer, чтобы заставить это работать. Если я unnest свой tidy вывод и передаю его stargazer, или если я просто пытаюсь передать вывод nested (переменная во вложенном фрейме данных, называемая моделью ниже) напрямую stargazer, я не получаю вывода. Я бы предпочел использовать результат tidy из-за экспоненциальных коэффициентов и 99% доверительных интервалов. Мне действительно нужна эта виньетка, чтобы сделать еще один шаг вперед. и объясните, как использовать выходные данные nest и tidy для создания отформатированных таблиц регрессии. Я также просмотрел эту публикацию SO, но мне трудно поверить, что нет более простого способа сделать это, которого я просто упускаю.

Примеры данных, а также мой общий подход к запуску моделей:

id <- 1:2000
gender <- sample(0:1, 2000, replace = T)
age <- sample(17:64, 2000, replace = T)
race <- sample(0:1, 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, cond_a, cond_b, cond_c, cond_d)

df %>% 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, family = "binomial", data = .)),
         tidy = map(model, tidy, exponentiate = T, conf.int = T, conf.level = 0.99))

person Kellan Baker    schedule 12.02.2021    source источник
comment
я не понял ваш вопрос .. вы можете просто развернуть аккуратную часть и получить таблицу коэффициентов регрессии?   -  person StupidWolf    schedule 12.02.2021
comment
Извините, я не могу понять, как объяснить мою проблему. Я отредактировал сообщение, чтобы попытаться яснее понять, где у меня что-то ломается.   -  person Kellan Baker    schedule 12.02.2021


Ответы (1)


Надеюсь, я правильно понял, по сути, вы передаете объекты lm и доверительный интервал отдельно в stargazer, используя этот ответ из вашего связанного вопроса.

Чтобы узнать, как ввод, например, для пользовательского ci потребует:

ci.custom: список числовых матриц с двумя столбцами, которые заменят доверительные интервалы по умолчанию для каждой модели. Первый и второй столбцы представляют нижнюю и верхнюю границы соответственно. Соответствует именам элементов.

Так что в вашем случае это немного больше работы, сначала мы сохраняем результаты.

result = df %>% 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, family = "binomial", data = .)),
         tidy = map(model, tidy, exponentiate = T, conf.int = T, conf.level = 0.99))

tidy_model = result$tidy
fit = result$model

Затем вытащите CI и коэффициенты:

CI = lapply(tidy_model,function(i)as.matrix(i[,c("conf.low","conf.high")]))
Coef = lapply(tidy_model,"[[","estimate")

Затем примените stargazer:

stargazer(fit, type = "text", 
  coef = Coef,
  ci.custom = CI)


=============================================================================
                                      Dependent variable:                    
                  -----------------------------------------------------------
                                             case                            
                       (1)            (2)            (3)            (4)      
-----------------------------------------------------------------------------
gender               0.996***       1.182***       1.196***       0.921***   
                  (0.790, 1.254) (0.938, 1.489) (0.950, 1.508) (0.731, 1.161)
                                                                             
age                  1.004***       1.001***       0.999***       1.005***   
                  (0.995, 1.012) (0.993, 1.009) (0.990, 1.007) (0.996, 1.013)
                                                                             
race                 0.911***       0.895***       0.944***       1.213***   
                  (0.724, 1.148) (0.711, 1.128) (0.749, 1.189) (0.963, 1.529)
                                                                             
Constant             0.919***       0.997***       0.959***       0.761***   
                  (0.623, 1.356) (0.676, 1.472) (0.649, 1.415) (0.515, 1.123)
                                                                             
-----------------------------------------------------------------------------
Observations          2,000          2,000          2,000          2,000     
Log Likelihood      -1,385.107     -1,382.664     -1,383.411     -1,382.272  
Akaike Inf. Crit.   2,778.215      2,773.329      2,774.821      2,772.544   
=============================================================================
Note:                                             *p<0.1; **p<0.05; ***p<0.01
person StupidWolf    schedule 13.02.2021
comment
это невероятно полезно, спасибо. Думаю, я удивлен тем, что не существует удобного способа экспорта результатов моделей, хранящихся во вложенном фрейме данных, в таблицы регрессии. Я не замужем за звездочетом, просто он работал у меня немного лучше, чем другие, которые я пробовал, включая gtsummary, kable и jtools :: export_summs. jtools :: export_summs дает мне правильные коэффициенты и т. д., но он может работать только с самими объектами модели, которые, похоже, не сохраняются нигде во вложенном фрейме данных. - person Kellan Baker; 13.02.2021
comment
в вашем случае вам нужно что-то более индивидуальное, и tidy работает с данными длинного формата, поэтому я бы предположил, что не самый простой. Я мало работаю с Rmarkdown или выводом регрессии, поэтому не лучший человек, чтобы комментировать, как использовать tidy с этими - person StupidWolf; 13.02.2021