eval(predvars、data、env)中出错:无效';envir';类型为'的参数;关闭';

eval(predvars、data、env)中出错:无效';envir';类型为'的参数;关闭';,r,R,我正在尝试进行正向选择,但在使用字符串公式时遇到困难: df f0 f1步骤(f0,direction=“forward”,scope=f1) 开始:AIC=-2.51 y~1 评估中出错(预变量、数据、环境): “closure”类型的“envir”参数无效 我知道如果我想,我可以省略字符串公式部分: >f0 f1步(f0,direction=“forward”,scope=f1) 开始:AIC=-2.51 y~1 Df平方和RSS AIC 0.66667 -2.51223 +x0 1 0.

我正在尝试进行正向选择,但在使用字符串公式时遇到困难:

df f0 f1步骤(f0,direction=“forward”,scope=f1) 开始:AIC=-2.51 y~1 评估中出错(预变量、数据、环境): “closure”类型的“envir”参数无效 我知道如果我想,我可以省略字符串公式部分:

>f0 f1步(f0,direction=“forward”,scope=f1)
开始:AIC=-2.51
y~1
Df平方和RSS AIC
0.66667 -2.51223
+x0 1 0.66667-0.51223
+x1 10 0.66667-0.51223
电话:
lm(公式=y~1,数据=df)
系数:
(截取)
0.6667

但我希望能够动态命名我的因变量,而无需硬编码。

您就快到了。您只需要在字符串公式周围添加一个
as.formula
函数,例如

df <- data.frame(x0=c(1,2,3), x1=c(3,2,1), y=c(1,0,1))
f0 <- lm(as.formula("y ~ 1"), data=df)
f1 <- formula(lm(as.formula("y ~ ."), data=df))
step(f0, direction="forward", scope=f1)

# make some string formulae objects
step0 <- "y ~ 1"
step1 <- "y ~ ."

# use as.formula
s0 <- lm(as.formula(step0), data=df)
s1 <- formula(lm(as.formula(step1), data=df))
step(s0, direction="forward", scope=s1)

df正如@konrad rudolph在评论中所建议的那样,您可以使用
bquote
在回归中动态命名因变量,如:


dependentVariable如果您想“动态命名[您的]因变量”,则绝对不需要使用字符串。您可以在运行时从表达式构造公式,例如
as.formula(bquote((var)~)
,其中
var=as.name('y')
。还可以查看
dependentVariable  <- as.name("y")
f0 <- lm(as.formula(bquote(.(dependentVariable) ~ 1)), data=df)
f1 <- formula(lm(bquote(.(dependentVariable) ~ .), data=df))
step(f0, direction="forward", scope=f1)
dependentVariable  <- "y"
f0 <- lm(as.formula(paste0(dependentVariable," ~ 1")), data=df)
#f1 <- formula(lm(as.formula(paste0(dependentVariable," ~ .")), data=df)) #Does call lm
#f1 <- as.formula(paste0(" ~ ", paste(names(df)[!grepl(dependentVariable, names(df))], collapse="+"))) #Does not call lm
f1 <- reformulate(names(df)[!grepl(dependentVariable, names(df))]) #Or using reformulate which creates a formula from a character vector
step(f0, direction="forward", scope=f1)
a <- lm("y ~ 1", data=df)
b <- lm(as.formula("y ~ 1"), data=df)
environment(formula(a)) #<environment: 0x56252c8a5fe0>
environment(formula(b)) #<environment: R_GlobalEnv>
f0 <- lm(as.formula("y ~ 1"), data=df) #as.formula is added here
f1 <- formula(lm("y ~ .", data=df))
step(f0, direction="forward", scope=f1)