Создание таблицы с коэффициентами нескольких линейных моделей в R

#r

Вопрос:

Предположим, у меня есть 4 модели (на самом деле у меня 9 или 10). Большинство их независимых переменных перекрываются, но некоторые отличаются. Я хотел бы создать таблицу, в которой будут показаны все их оценки коэффициентов бок о бок, с подходящими пробелами для переменных, которые не отображаются в некоторых моделях.

 M1 <- lm(y ~ V1   V2   V3   W1)  
M2 <- lm(y ~ V1   V2   V3   W2)  
M3 <- lm(y ~ V1   V2   V3   W1   W2)  
M4 <- lm(y ~ V1   V2   V3   W3)
 

Я бы хотел столик, который выглядит так:

 | Coefs| M1 | sig. | M2 | sig. | M3 | sig. | M4 | sig. |
|------|----|------|----|------|----|------|----|------|
| V1   | xx | *    |xx  |*     |xx  |*     |xx  |*     |
| V2   | xx | *    |xx  |*     |xx  |*     |xx  |*     |
| V3   | xx | *    |xx  |*     |xx  |*     |xx  |*     |
| W1   | xx | *    |    |      |xx  |*     |    |      |
| W2   |    |      |xx  |*     |xx  |*     |    |      |
| W3   |    |      |    |      |    |      |xx  |*     |
 

Мне кажется, что я часто вижу такую таблицу в журнальных статьях, поэтому я искал решение, возможно, каким-то образом используя метлу, но не смог его решить. Я не возражаю, если пустые места пусты или заполнены NAs или чем-то еще.

Редактировать: несмотря на то, что я действительно искал раньше, теперь я обнаружил, что существует несколько пакетов, которые могут легко создать такую таблицу регрессии, если кто-то ищет «красивую» таблицу для публикации, например. хакстебл или gtsummary. Но я ценю предоставленный ответ как более простой и гибкий подход к проблеме.

Комментарии:

1. Внимательно прочитайте главу 35 «R для науки о данных». r4ds.had.co.nz/many-models.html . Это должно вывести вас на следующий уровень в R и элегантно решить вашу проблему.

Ответ №1:

Я привел данные dummy для примера.

 dummy <- data.frame(
  y = c(1:20),
  V1 = rnorm(20,4,5),
  V2 = rnorm(20, 0, 1),
  V3 = rnorm(20, 0, 1),
  W1 = rnorm(20, 10, 1),
  W2 = rnorm(20,1,5),
  W3 = rnorm(20,1,1)
)
 

Затем сделайте модель M1 , чтобы M4

 M1 <- lm(y ~ V1   V2   V3   W1, data = dummy)  
M2 <- lm(y ~ V1   V2   V3   W2, data = dummy)  
M3 <- lm(y ~ V1   V2   V3   W1   W2, data = dummy)  
M4 <- lm(y ~ V1   V2   V3   W3, data = dummy)
 

Затем извлеките коэффициенты, которые вы хотели

 MM1 <- summary(M1)$coefficients %>% as.data.frame %>% rownames_to_column() %>% select(rowname, Estimate, `Std. Error`) %>%
  rename(M1 = Estimate, sig.M1 = `Std. Error`)
MM2 <- summary(M2)$coefficients %>% as.data.frame %>% rownames_to_column() %>% select(rowname, Estimate, `Std. Error`) %>%
  rename(M2 = Estimate, sig.M2 = `Std. Error`)
MM3 <- summary(M3)$coefficients %>% as.data.frame %>% rownames_to_column() %>% select(rowname, Estimate, `Std. Error`) %>%
  rename(M3 = Estimate, sig.M3 = `Std. Error`)
MM4 <- summary(M4)$coefficients %>% as.data.frame %>% rownames_to_column() %>% select(rowname, Estimate, `Std. Error`) %>%
  rename(M4 = Estimate, sig.M4 = `Std. Error`)
 

Наконец, объедините их с помощью reduce и full_join

 list(MM1,MM2,MM3,MM4) %>% reduce(full_join, by = "rowname")

      rowname         M1     sig.M1         M2    sig.M2         M3     sig.M3          M4    sig.M4
1 (Intercept) 25.6300409 17.0743452 10.9236902 1.8473586 24.7528332 19.6171238 11.66706138 2.0336288
2          V1 -0.1973380  0.2910641 -0.1717022 0.3017712 -0.2051194  0.3105196 -0.08143169 0.2819991
3          V2 -0.1001076  1.4811114 -0.1607587 1.5116289 -0.1143781  1.5387822 -0.06223230 1.4828105
4          V3  0.4616137  1.7851494 -0.1506603 1.6604661  0.4278893  1.8759727  0.08994041 1.6600729
5          W1 -1.4039157  1.6159054         NA        NA -1.3193849  1.8629899          NA        NA
6          W2         NA         NA  0.1419206 0.3016012  0.0351603  0.3417814          NA        NA
7          W3         NA         NA         NA        NA         NA         NA -1.25253787 1.4603211
 

Комментарии:

1. Спасибо, это круто, но в идеале следовало бы оценить. M1, а не оценка.x (без простого переименования их вручную)

2. @JRR Мне жаль, что я это пропустил. Я редактирую свой код.