将lapply函数用于将单个和+参数传递给LM模型

3
我被卡住了,尝试传递“+”参数到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)})

但是,如果我在 model_combinations 列表的末尾添加 'Lat+Elev',同样的代码就会失败,如下所示:
model_combinations=c('.', 'Long', 'Lat', 'Elev', 'Lat+Elev') 

“Error in eval(expr, envir, enclos) : object 'Lat+Elev' not found” 的意思是“在评估表达式时出错:找不到对象 'Lat+Elev'”。我已经扫描了帖子,但无法找到解决方案。”

名称不能包含 +。这不是有效的语法。如果是的话,你要如何加总两个变量?你需要一个表达式。无论如何,请使用 sprintf 和 as.formula。 - Roland
2个回答

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()只是一个方便的包装器。)

非常好!非常感谢! - Robert Cruickshank
虽然我们感谢您的情感表达,但是StackOverflow不赞成使用注释来表示“谢谢”(http://meta.stackoverflow.com/questions/258004/should-thank-you-comments-be-flagged?lq=1);如果这个答案对您有用,您可以给它点赞(如果您有足够的声望),无论如何,如果它令您满意地回答了您的问题,我们鼓励您点击勾选标记来接受它。 - Ben Bolker

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接