我试图通过" +" lm
的参数。
我的下面两行代码适用于单个参数,如:
model_combinations=c('.', 'Long', 'Lat', 'Elev')
lm_models = lapply(model_combinations, function(x) {
lm(substitute(Y ~ i, list(i=as.name(x))), data=climatol_ann)})
但是如果我添加' Lat + Elev'在model_combinations列表的末尾,如:
model_combinations=c('.', 'Long', 'Lat', 'Elev', 'Lat+Elev')
eval(expr,envir,enclos)中的错误:object' Lat + Elev'找不到
我已经扫描了帖子,但无法找到解决方案。
答案 0 :(得分:3)
我通常发现使用reformulate
通过字符串操作构造公式而不是尝试使用substitute()
来修改表达式时更健壮/更容易理解,例如。
model_combinations <- c('.', 'Long', 'Lat', 'Elev', 'Lat+Elev')
model_formulas <- lapply(model_combinations,reformulate,
response="Y")
lm_models <- lapply(model_formulas,lm,data=climatol_ann)
因为reformulate
在字符串级别工作,所以如果元素本身是非原子的(例如Lat+Elev
)则没有问题。这里唯一棘手的情况是,如果你的data
参数或变量是在一些不易找到的环境中构造的,但传递一个明确的data
参数通常可以避免出现问题。
(您也可以使用as.formula(paste(...))
或as.formula(sprintf(...))
; reformulate()
只是一个方便的包装器。)
答案 1 :(得分:1)
使用as.formula
即可:
models = lapply(model_combinations,function(x) lm(as.formula(paste("y ~ ",x)), data=climatol_ann))
对于mtcars数据集:
model_combs = c("hp","cyl","hp+cyl")
testModels = lapply(model_combs,function(x) lm(as.formula(paste("mpg ~ ",x)), data=mtcars) )
testModels
#[[1]]
#
#Call:
#lm(formula = as.formula(paste("mpg ~ ", x)), data = mtcars)
#
#Coefficients:
#(Intercept) hp
# 30.09886 -0.06823
#
#
#[[2]]
#
#Call:
#lm(formula = as.formula(paste("mpg ~ ", x)), data = mtcars)
#
#Coefficients:
#(Intercept) cyl
# 37.885 -2.876
#
#
#[[3]]
#
#Call:
#lm(formula = as.formula(paste("mpg ~ ", x)), data = mtcars)
#
#Coefficients:
#(Intercept) hp cyl
# 36.90833 -0.01912 -2.26469