【问题标题】:How to pass string formula to R's lm and see the formula in the summary?如何将字符串公式传递给 R 的 lm 并在摘要中查看公式?
【发布时间】:2021-02-05 19:05:53
【问题描述】:

在下面的 R 会话中,summary(model) 将公式显示为 model_str。如何让它显示为mpg ~ cyl + hp,同时仍然能够通过字符串设置模型公式?

> data(mtcars)
> names(mtcars)
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"
> model_str <- 'mpg ~ cyl + hp'
> model <- lm(model_str, data=mtcars)
> summary(model)

Call:
lm(formula = model_str, data = mtcars)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.4948 -2.4901 -0.1828  1.9777  7.2934 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 36.90833    2.19080  16.847  < 2e-16 ***
cyl         -2.26469    0.57589  -3.933  0.00048 ***
hp          -0.01912    0.01500  -1.275  0.21253    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.173 on 29 degrees of freedom
Multiple R-squared:  0.7407,    Adjusted R-squared:  0.7228 
F-statistic: 41.42 on 2 and 29 DF,  p-value: 3.162e-09

【问题讨论】:

    标签: r lm


    【解决方案1】:

    这有点小技巧,可能很脆弱,但是修改模型的 call 元素的 formula 元素是可行的:

    model$call$formula <- formula(model_str)
    summary(model)
    ## Call:
    ## lm(formula = mpg ~ cyl + hp, data = mtcars)
    

    【讨论】:

      【解决方案2】:

      您可以在一行中直接构建和评估调用:

      eval(as.call(list(quote(lm), formula = model_str, data = quote(mtcars))))
      #> 
      #> Call:
      #> lm(formula = "mpg ~ cyl + hp", data = mtcars)
      #> 
      #> Coefficients:
      #> (Intercept)          cyl           hp  
      #>    36.90833     -2.26469     -0.01912  
      

      【讨论】:

      • 如果你想避免引号,你需要使用formula(model_str)lm() [不必要地] 用替代等巧妙的东西将公式字符串转换为公式(公式?)
      【解决方案3】:

      使用str2lang,然后使用do.call

      fo <- str2lang("mpg ~ hp + am")
      do.call("lm", list(fo, quote(mtcars)))
      # 
      # Call:
      #   lm(formula = mpg ~ hp + am, data = mtcars)
      # 
      # Coefficients:
      # (Intercept)           hp           am  
      #    26.58491     -0.05889      5.27709  
      

      【讨论】:

        【解决方案4】:

        使用do.call 以便model_str 在发送到lm 之前得到评估,但引用mtcars 以便它不是(否则会有一个巨大的输出显示mtcars 中的实际值)。

        do.call("lm", list(as.formula(model_str), data = quote(mtcars)))
        

        给予:

        Call:
        lm(formula = mpg ~ cyl + hp, data = mtcars)
        
        Coefficients:
        (Intercept)          cyl           hp  
           36.90833     -2.26469     -0.01912  
        

        【讨论】:

        • 最佳/最惯用的答案 IMO
        猜你喜欢
        • 1970-01-01
        • 2012-03-03
        • 2019-09-17
        • 2020-03-04
        • 2021-09-16
        • 1970-01-01
        • 2013-01-18
        相关资源
        最近更新 更多