好吧,如果你看两个版本的调用,你会发现它们并不完全相同
lm(Fertility~1, data=splits[[2]])$call # lm(formula = Fertility ~ 1, data = splits[[2]]) null_list[[2]]$call # lm(formula = Fertility ~ 1, data = x)
注意如何 data= 每个参数都不同。前者仍然指向一个有效的全局变量,后者指向 x 哪个不存在了。该 step() 函数尝试在调用它的上下文中计算公式。在这种背景下 x 是你的循环计数器。如果你改变了 select() 功能
data=
x
step()
select()
select <- function(z) { null <- null_list[[z]] full <- full_list[[z]] step(null, scope=list(lower=null, upper=full, direction='forward')) } select(2)
你会得到一个不同的错误
Error in is.data.frame(data) : object 'x' not found
这基本上意味着 step() 无法回到包含可用于重新拟合模型添加或减去协变量的数据的变量。
一个解决方法是将数据嵌入到 lm() 自称。你可以这样做
lm()
null_list <- lapply(splits, function(x) {do.call("lm", list(Fertility~1, data=x))}) full_list <- lapply(splits, function(x) {do.call("lm", list(Fertility~., data=x))})
但是你会看到这会产生一个“看起来很混乱”的电话,但结果应该是一样的。
遗憾的是,这是非标准评估的副作用。如果,这将是很好的 step() 寻找中的数据 $model 完整模型的属性,但我相信当你有NA值时这不匹配所以R别无选择,只能尝试重新评估 data= 某些上下文中的参数。
$model