Создайте цикл в R для запуска всех возможных комбинаций категориальных переменных (уровней) в регрессии
Я пытаюсь запустить различные модели множественной линейной регрессии в R с моим набором данных о продажах, содержащим более 1000 продуктов и 250 розничных продавцов. Мне интересно посмотреть на коэффициенты модели для каждой комбинации продукта и продавца. Я попытался использовать фиктивные переменные для категориального столбца, но они не дали индивидуальных оценок коэффициентов, как мне было нужно. Как добиться этого с помощью цикла for, который перебирает все возможные комбинации?
2 ответа
Мне нравится этот подход, когда мы вкладываем данные в каждую группу, то есть «вырезать» и «цвет», стенды для переменных «продукт» и «розничный продавец». Затем мы можем запустить линейную регрессию внутри каждой группы по всем остальным переменным.
library(tidyverse); library(broom)
diamonds %>%
nest(data = c(carat, clarity:z)) %>%
mutate(fit = map(data, ~lm(price ~ ., data = .x)),
tidied = map(fit, tidy)) %>%
unnest(tidied)
Результат
# A tibble: 486 x 9
cut color data fit term estimate std.error statistic p.value
<ord> <ord> <list> <list> <chr> <dbl> <dbl> <dbl> <dbl>
1 Ideal E <tibble [3,903 … <lm> (Interce… 9902. 3099. 3.20 1.41e- 3
2 Ideal E <tibble [3,903 … <lm> carat 16448. 263. 62.4 0
3 Ideal E <tibble [3,903 … <lm> clarity.L 4144. 131. 31.7 2.19e-196
4 Ideal E <tibble [3,903 … <lm> clarity.Q -1427. 128. -11.2 1.44e- 28
5 Ideal E <tibble [3,903 … <lm> clarity.C 962. 104. 9.22 4.72e- 20
6 Ideal E <tibble [3,903 … <lm> clarity^4 -134. 75.2 -1.79 7.43e- 2
7 Ideal E <tibble [3,903 … <lm> clarity^5 97.2 52.2 1.86 6.27e- 2
8 Ideal E <tibble [3,903 … <lm> clarity^6 79.8 39.5 2.02 4.35e- 2
9 Ideal E <tibble [3,903 … <lm> clarity^7 154. 33.6 4.58 4.84e- 6
10 Ideal E <tibble [3,903 … <lm> depth -67.0 46.7 -1.43 1.52e- 1
# … with 476 more rows
Как насчет чего-то вроде
library(lme4)
my_data <- transform(my_data, prcomb = interaction(product, retailer, drop = TRUE))
result <- lmList(sales ~ x1 + x2 + x3 | prcomb, data = my_data)
(включая
drop=TRUE
потому что
lmList
не любит пустые категории ...)? (Надеюсь, у вас меньше, чем полные 250 000 комбинаций товар / продавец ...?)
Например:
mt <- transform(mtcars, cylam = interaction(cyl, am, drop=TRUE))
mm <- lme4::lmList(mpg ~ wt | cylam, data =mt)
coef(mm)
summary(mm)
(Обратите внимание, что
summary()
метод не кажется очень изящным в отношении категорий, в которых есть только один элемент ...)