7

我今天在我的 R 代码中意识到了一个奇怪的行为。我尝试了一个包 {boot.StepAIC},其中包含一个引导函数,用于使用 AIC 逐步回归的结果。但是我不认为统计背景是问题所在(我希望如此)。
我可以在 R 的顶层使用该函数。这是我的示例代码。

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 个引导样本中失败 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 

那么错误在哪里呢?我想这一定与当地和全球环境有关,不是吗?

4

1 回答 1

5

在使用粘贴公式创建的 lme 拟合上使用do.callas in anova 测试失败提供了答案。

boot.stepAICform在函数内运行时无权访问;可以像这样在全球环境中重新创建;我们看到它lmform.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)
于 2012-04-16T21:03:46.390 回答