【问题标题】:Avoid losing formulas when applying the lm function over a list of formulas in R在 R 中的公式列表上应用 lm 函数时避免丢失公式
【发布时间】:2019-07-30 02:36:40
【问题描述】:

我正在尝试获取mtcars 数据集中的所有变量对,并使用lm 函数建立一个线性模型。但是当我去总结或绘制模型时,我的方法导致我丢失了公式。这是我正在使用的代码。

library(tidyverse)
my_vars <- names(mtcars)) 
pairs <- t(combn(my_vars, 2)) # Get all possible pairs of variables

# Create formulas for the lm model
fmls <- 
  as.tibble(pairs) %>%
  mutate(fml = paste(V1, V2, sep = "~")) %>%
  select(fml) %>%
  .[[1]] %>%
  sapply(as.formula)

# Create a linear model for ear pair of variables
mods <- lapply(fmls, function(v) lm(data = mtcars, formula = v))

# print the summary of all variables 
for (i in 1:length(mods)) {
  print(summary(mods[[i]]))
}

(我从这里获得了使用字符串制作公式的想法 [1]:Pass a vector of variables into lm() formula。)这是第一个模型(summary(mods[[1]]))的摘要输出:

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

Residuals:
    Min      1Q  Median      3Q     Max 
-4.9814 -2.1185  0.2217  1.0717  7.5186 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  37.8846     2.0738   18.27  < 2e-16 ***
cyl          -2.8758     0.3224   -8.92 6.11e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.206 on 30 degrees of freedom
Multiple R-squared:  0.7262,    Adjusted R-squared:  0.7171 
F-statistic: 79.56 on 1 and 30 DF,  p-value: 6.113e-10

我正在寻找一种(可能是元编程)技术,以便调用线看起来像 lm(formula = var1 ~ var2, data = mtcars) 而不是 formula = v

【问题讨论】:

    标签: r metaprogramming lm


    【解决方案1】:

    为了让生活更轻松,我将配对组合成一个数据框:

    library(tidyverse)
    my_vars <- names(mtcars) 
    pairs <- t(combn(my_vars, 2)) %>% 
      as.data.frame# Get all possible pairs of variables
    

    您可以使用评估表达式的 eval() 来做到这一点。

    listOfRegs <- apply(pairs, 1, function(pair) {
      V1 <- pair[[1]] %>% as.character
      V2 <- pair[[2]] %>% as.character
      fit <- eval(parse(text = paste0("lm(", pair[[1]] %>% as.character,
                                      "~",  pair[[2]] %>% as.character,
                                      ", data = mtcars)")))
      return(fit)
    })
    
    lapply(listOfRegs, summary)
    

    然后:

    > lapply(listOfRegs, summary)
    [[1]]
    
    Call:
    lm(formula = mpg ~ cyl, data = mtcars)
    
    Residuals:
        Min      1Q  Median      3Q     Max 
    -4.9814 -2.1185  0.2217  1.0717  7.5186 
    
    Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
    (Intercept)  37.8846     2.0738   18.27  < 2e-16 ***
    cyl          -2.8758     0.3224   -8.92 6.11e-10 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Residual standard error: 3.206 on 30 degrees of freedom
    Multiple R-squared:  0.7262,    Adjusted R-squared:  0.7171 
    F-statistic: 79.56 on 1 and 30 DF,  p-value: 6.113e-10
    
     ... etc
    

    【讨论】:

    • 当您可以在语言上进行计算时,您不应该使用parse。使用as.symbol 而不是as.character 然后fit &lt;- eval(bquote(lm(.(V1) ~ .(V2), data = mtcars)))
    • 感谢您的澄清 - 您介意扩展一下为什么不应该 parse() 吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2013-06-27
    • 2019-03-22
    • 1970-01-01
    • 2015-05-21
    • 2020-10-03
    相关资源
    最近更新 更多