今天我实现了一个奇怪的现象,在我的R代码里面。 我尝试了包{boot.StepAIC},它包括用于与所述AIC逐步回归的结果的自举功能。 不过,我不认为统计背景是这里的问题(我希望如此)。
我可以在河的顶层使用函数这是我的示例代码。
require(MASS)
require(boot.StepAIC)
n<-100
x<-rnorm(n); y<-rnorm(n,sd=2); z<-rnorm(n,sd=3); res<-x+y+z+rnorm(n,sd=0.1)
dat.test<-as.data.frame(cbind(x,y,z,res))
form.1<-as.formula(res~x+y+z)
boot.stepAIC(lm(form.1, dat.test),dat.test) # should be OK - works at me
不过,我想换行,在一个自己的功能。 我传递数据和式给该函数。 但我得到内boot.stepAIC(错误)说:
模型拟合在100 bootstrap样本错误strsplit失败(nam.vars,“:”):非字符参数
# custom function
fun.boot.lm.stepAIC<-function(dat,form) {
if(!inherits(form, "formula")) stop("No formula given")
fit.lm<-lm(formula=form,data=dat)
return(boot.stepAIC(object=fit.lm,data=dat))
}
fun.boot.lm.stepAIC(dat=dat.test,form=form.1)
# results in an error
那么,是错误了吗? 我想这一定有事情做与当地和全球环境,不是吗?
使用do.call
在方差分析与粘贴的公式创建LME拟合未能提供答案。
boot.stepAIC
没有进入form
时的函数中运行; 能在这样的全球环境中重新创建; 我们看到lm
使用form.1
作为公式,去掉它boot.stepAIC
失败。
> form.1<-as.formula(res~x+y+z)
> mm <- lm(form.1, dat.test)
> mm$call
lm(formula = form.1, data = dat.test)
> rm(form.1)
> boot.stepAIC(mm,dat.test)
# same error as OP
使用do.call
确实工作。 这里我用as.name
为好; 否则mm
对象携带周围的整个数据集,而不是只是它的名称。
> form.1<-as.formula(res~x+y+z)
> mm <- do.call("lm", list(form.1, data=as.name("dat.test")))
> mm$call
lm(formula = res ~ x + y + z, data = dat.test)
> rm(form.1)
> boot.stepAIC(mm,dat.test)
若要将此原来的问题,我应该这样做:
fun.boot.lm.stepAIC<-function(dat,form) {
if(!inherits(form, "formula")) stop("No formula given")
mm <- do.call("lm", list(form, data=as.name(dat)))
do.call("boot.stepAIC", list(mm,data=as.name(dat)))
}
form.1<-as.formula(res~x+y+z)
fun.boot.lm.stepAIC(dat="dat.test",form=form1)
此作品太多,但整个数据集被包含在最终的输出对象,并最终输出到控制台,以及。
fun.boot.lm.stepAIC<-function(dat,form) {
if(!inherits(form, "formula")) stop("No formula given")
mm <- do.call("lm", list(form, data=dat))
boot.stepAIC(mm,data=dat)
}
form.1<-as.formula(res~x+y+z)
fun.boot.lm.stepAIC(dat=dat.test,form=form.1)
文章来源: function works (boot.stepAIC ) but throws an error inside another function - environment issue?