Добавьте последовательность членов взаимодействия в линейную модель, lm () - PullRequest
1 голос
/ 11 июня 2019

Мои данные отформатированы так:

mpg     disp    c1  c2  c3
21.0    160.0   0   0   0
21.0    160.0   0   0   0
22.8    108.0   1   0   0
21.4    258.0   1   0   0
18.7    360.0   0   1   0
18.1    225.0   1   0   0

И я хотел бы запустить линейную модель, подобную этой, где от c1 до c3 все взаимодействуют с другой объясняющей переменной, disp:

lm(mpg ~ disp:c1 
       + disp:c2
       + disp:c3, df)

Конечно, мой реальный набор данных имеет более трех взаимодействий, но все переменные, с которыми мне нужно взаимодействовать, последовательно упорядочиваются в виде столбцов и имеют последовательные имена (например, c1, c2 и т. Д.).

Есть ли простой способ указать взаимодействие между disp и c1, скажем c100?

Код для воспроизведения моего образца данных ниже:

library(dplyr)
df <- mtcars
df <- df %>% mutate(c = factor(carb))
dummies <- model.matrix(data = df, ~ c + 0)
dummies <- as_data_frame(dummies)
df <- cbind(df, dummies)
df <- df %>% select(mpg, disp, c1:c3)
head(df)

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

paste значения в требуемом порядке и использование formula

lm(formula(paste0("mpg ~ ", paste0("disp:", "c", 1:3, collapse = " + "))), df)

#Call:
#lm(formula = formula(paste0("mpg ~ ", paste0("disp:", "c", 1:3, 
#    collapse = " + "))), data = df)

#Coefficients:
#(Intercept)      disp:c1      disp:c2      disp:c3  
# 19.7862454    0.0196435    0.0008339   -0.0126405 

, где

paste0("mpg ~ ", paste0("disp:", "c", 1:3, collapse = " + ")) #gives
#[1] "mpg ~ disp:c1 + disp:c2 + disp:c3"

Это дает тот же вывод, когда вы вручную применяете функцию lm

lm(mpg ~ disp:c1 + disp:c2 + disp:c3, df)
0 голосов
/ 11 июня 2019

Мы можем использовать reformulate

lm(reformulate(paste0("disp:", "c", 1:3), "mpg"), df)
#Call:
#lm(formula = reformulate(paste0("disp:", "c", 1:3), "mpg"), data = df)

#Coefficients:
#(Intercept)      disp:c1      disp:c2      disp:c3  
# 19.7862454    0.0196435    0.0008339   -0.0126405  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...