将交互项序列添加到线性模型,lm()
Add sequence of interaction terms to linear model, 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
我想要 运行 一个像这样的线性模型,其中 c1
到 c3
都与另一个解释变量 disp
:
lm(mpg ~ disp:c1
+ disp:c2
+ disp:c3, df)
当然,我的真实数据集有 3 个以上的交互,但我需要交互的所有变量都按列顺序排序并按顺序命名(例如 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)
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)
我们可以使用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
我的数据格式如下:
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)
当然,我的真实数据集有 3 个以上的交互,但我需要交互的所有变量都按列顺序排序并按顺序命名(例如 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)
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)
我们可以使用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