7

私は今日、私のRコードで奇妙な振る舞いに気づきました。AICを使用したステップワイズ回帰の結果のブートストラップ関数を含むパッケージ{boot.StepAIC}を試しました。しかし、統計的背景がここに問題があるとは思いません(そう願っています)。
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

do.callas in anova testを使用すると、貼り付けた式で作成された lme フィットで失敗し、答えが得られます。

boot.stepAICform関数内で実行する場合はアクセスできません。このようにグローバル環境で再現できます。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)
于 2012-04-16T21:03:46.390 に答える