自动配方建设

Spe*_*her 5 modeling r

在最近的家庭作业中,我们被指示运行27个线性模型,每次添加一个额外的变量(目标是绘制R 2中的变化与调整后的R 2中的变化).我发现很难通过算法创建这样的公式.我最终使用的代码如下所示(请注意,数据框中的第一列是因变量,其余的都是预期的独立变量.

 make.formula <- function(howfar) {
  formula <- c()
  for (i in 1:howfar) {
    if (i == 1) {
      formula <- paste(formula, names(d)[i], '~')}
    else if (i == howfar) {
      formula <- paste(formula, names(d)[i], '')
    }
    else {
      formula <- paste(formula, names(d)[i], '+')}
  }
  return(formula)
}

formulas <- lapply(seq(2, length(d)), make.formula)
formulas <- lapply(formulas, as.formula)
fits <- lapply(formulas, lm, data = d)
Run Code Online (Sandbox Code Playgroud)

这有效,但似乎远非理想,我的印象是,我在R中使用for循环做的任何事情可能都不是最好的方式.是否有更简单的方法来为给定的数据帧算法构造公式?

Jos*_*ien 10

reformulate(),从角色向量创建公式的一个很好的功能,可能会派上用场.以下是它的作用示例:

reformulate(response="Y", termlabels=c("X1", "X2", "X3"))
# Y ~ X1 + X2 + X3
Run Code Online (Sandbox Code Playgroud)

以下是您在实践中如何使用它的方法.(请注意,我在这里创建lm()调用内部的公式.因为formula对象带有关于它们所创建的环境的信息,所以我有点犹豫是否在您实际想要使用它们的调用之外创建lm()它们. ):

evars <- names(mtcars)[2:5]
ii <- lapply(1:4, seq_len)

lapply(ii, 
       function(X) {
          coef(lm(reformulate(response="mpg", termlabels=evars[X]), data=mtcars))
})
# [[1]]
# (Intercept)         cyl 
#    37.88458    -2.87579 
# 
# [[2]]
# (Intercept)         cyl        disp 
# 34.66099474 -1.58727681 -0.02058363 
# 
# [[3]]
# (Intercept)         cyl        disp          hp 
# 34.18491917 -1.22741994 -0.01883809 -0.01467933 
# 
# [[4]]
# (Intercept)         cyl        disp          hp        drat 
# 23.98524441 -0.81402201 -0.01389625 -0.02317068  2.15404553 
Run Code Online (Sandbox Code Playgroud)