r-将"lm"结果传递给"stepAIC"在脚本中工作,在函数内部失败



MASS::stepAIC函数将lm结果作为参数,并进行逐步回归以找到"最佳"模型。以下代码非常简单且有效:

library(MASS)
data("mtcars")
lm1 = lm(mpg ~ ., mtcars)
step1 = stepAIC(lm1, direction = "both", trace = FALSE)

我正试图把它放在一个函数中。最终,我想做更多的事情,但当我把这两行代码封装在一个函数中时,我甚至无法让它工作:

fit_model = function(formula, data) {
full_model = lm(formula = formula, data = data)
step_model = stepAIC(full_model, direction = "both", trace = FALSE)
return(step_model)
}
step2 = fit_model(mpg ~ ., mtcars)
Error in eval(predvars, data, env) : 
invalid 'envir' argument of type 'closure' 

我正在运行:

R version 3.6.2 (2019-12-12)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Linux Mint 19.1

这是罪魁祸首(在fit_model函数中(。请注意创建公式的环境。

Browse[1]> str(formula)
Class 'formula'  language mpg ~ .
..- attr(*, ".Environment")=<environment: R_GlobalEnv> 

你可以做的也许是在一个新的环境中强制

fit_model = function(formula, data) {
environment(formula) <- new.env()
full_model = lm(formula = formula, data = data)
step_model = stepAIC(full_model, direction = "both", trace = FALSE)
return(step_model)
}
> step2
Call:
lm(formula = mpg ~ wt + qsec + am, data = data)
Coefficients:
(Intercept)           wt         qsec           am  
9.618       -3.917        1.226        2.936 

基于do.call并在此链接中描述的解决方案:

fit_model = function(formula, data) {
full_model <- do.call("lm", list(formula=formula, data=data))
step_model <- stepAIC(full_model, direction = "both", trace = FALSE)
return(step_model)
}
step2 <- fit_model(mpg ~ ., mtcars)

据我所知,这是使用enquote:的完美案例

fit_model <- function(formula, data) {
formula <- enquote(formula)
full_model <- lm(formula = formula, data = data)
stepAIC(full_model, direction = "both", trace = FALSE)
}
fit_model(mpg ~ ., mtcars)
#
#Call:
#lm(formula = mpg ~ wt + qsec + am, data = data)
# 
#Coefficients:
#(Intercept)           wt         qsec           am  
#      9.618       -3.917        1.226        2.936  

编辑:

这相当于:

fit_model2 <- function(formula, data) {
full_model <- lm(formula = formula, data = data)
MASS::stepAIC(full_model, direction = "both", trace = FALSE)
}
fit_model2(quote(mpg ~ .), mtcars)

最新更新