#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 Мне жаль, что я это пропустил. Я редактирую свой код.