在最近的一项作业中,我们被要求运行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/