将交互项序列添加到线性模型lm()

时间:2019-06-11 07:57:18

标签: r dplyr tidyverse lm

我的数据格式如下:

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

我想运行一个线性模型,其中c1c3都与另一个解释变量disp相互作用:

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

当然,我的真实数据集有3种以上的交互,但是我需要交互的所有变量都按列顺序排列,并且都按顺序命名(例如c1,c2等)。

是否有一种简单的方法来指定dispc1之间的交互?

以下用于复制我的样本数据集的代码:

c100

2 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:0)

我们可以使用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