在最近的家庭作业中,我们被指示运行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)