【问题标题】:Add sequence of interaction terms to linear model, lm()将交互项序列添加到线性模型 lm()
【发布时间】:2019-10-25 14:21:58
【问题描述】:

我的数据格式如下:

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 等)。

有没有一种简单的方法可以通过说c100 来指定dispc1 之间的交互?

复制我的示例数据集的代码如下:

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)

【问题讨论】:

    标签: r dplyr tidyverse lm


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-17
        • 2020-04-27
        • 2017-02-19
        • 1970-01-01
        • 2014-09-17
        • 2019-11-19
        相关资源
        最近更新 更多