在最近的一项作业中,我们被要求运行27个线性模型,每次添加一个附加变量(目标是绘制R2的变化与调整后的R2的变化图)。我发现很难通过算法创建这样的公式。我最终使用的代码如下所示(请注意,数据框中的第一列是因变量,其余所有都是预期的自变量。

 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)

这行得通,但似乎还不理想,我的印象是我在R中使用for循环所做的任何事情都可能不是最佳方法。有没有更简单的方法可以通过算法构造给定数据框的公式?

最佳答案

reformulate()是一个从字符向量创建公式的漂亮函数,可能会派上用场。这是它的一个示例:

reformulate(response="Y", termlabels=c("X1", "X2", "X3"))
# Y ~ X1 + X2 + X3

这就是您在实践中可能会使用它的方式。 (请注意,我在这里在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

关于r - 自动公式构建,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18474336/

10-16 01:33