lapply函数将单个和+参数传递给LM

时间:2016-12-21 18:41:06

标签: r

我试图通过" +" 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'找不到

我已经扫描了帖子,但无法找到解决方案。

2 个答案:

答案 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