2012-04-16 16 views
5

私は今日Rコードで奇妙な動作を実現しました。 AICで段階的に回帰した結果のブートストラップ機能を含むパッケージ{boot.StepAIC}を試しました。しかし、私は統計的な背景がここに問題(私はそう望む)だとは思わない。
私はこれは私のコード例であるR.のトップレベルでの機能を使用することができます。機能は機能しますが(boot.stepAIC)、別の機能 - 環境問題の中でエラーを投げますか?

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 

しかし、私はそれを独自の関数でラップしたかったのです。私はデータとその式をその関数に渡します。

モデルの適合が strsplitで100ブートストラップ標本のエラーで失敗した(nam.vars、 ":"):しかし、私は言って)(boot.stepAIC内のエラーを取得する非文字引数

# 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 

だからここで間違いはありますか?私はそれが地方や地球環境と何か関係がなければならないと思われますね。

+0

私は前に 'boot.stepAIC'を使用しますが、それはまた、式が(あまりにも環境問題に関連している)関数に渡される方法で行う必要があり疑っていません。いくつかのアイデアについては、http://stackoverflow.com/q/6877534、http://stackoverflow.com/q/7666807を参照してください。特に、lm'または '' 'を呼び出すdo.call'経由boot.stepAIC'は引数が渡​​される前に評価されているとして、その後に役立つことがあります。あなたはまた、コメントで' as.name'提案を調査することがあります。これらの問題は厄介です - 幸運! – Aaron

+0

http://stackoverflow.com/q/8998884/210673も同じ問題であるように見えます。 – Aaron

+0

私はこれをすでに読んでいる。私は問題が関連していると思います。 – Sebastian

答えて

4

答えを提供anova test fails on lme fits created with pasted formulaのようにdo.callを使用します。

関数内で実行formへのアクセス権を持っていません。このような地球環境で再現することができます。我々はlm式としてform.1を使用して、そしてそれはが失敗します削除されていることを参照してください。

> 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) 
+0

ありがとうございます。包括的な説明のために、私はその点を見ます。私はまた2つの関連記事を読んだ。正直言って、私はまだこれらの問題でいくつか頭痛があります。その動作の「ユースケース」は何ですか?私は2つのオブジェクトをその関数に渡し、呼び出し関数のコンテキストで実行する必要があります。私はRやboot.stepAIC(誰が "責める"か分からない)に地球環境にリダイレクトするようなポイントは見当たりません。ポイントは、関数がオブジェクトをどのコンテキストで探しているかをどのように確認できるかです。これまでのところ私の理解は、関数ではなくdo.call()を直接使用することです。それに関する戦略は? – Sebastian

+0

さて、私はそれを少し演奏しましたが、私はまだ文脈を理解しようとしています。あなたの最後の例では、基本的にグローバル変数(または親変数)の名前を渡し、グローバル変数dat.testの関数からアクセスします。それは参照による呼び出しですか?モデリング関数が参照戦略によって呼出しを使用することもありますが、純粋に値を呼び出すと仮定しても、それは可能でしょうか? – Sebastian

+0

1) 'boot.stepAIC'は' update'を使います。これは線形モデルの呼び出しを再実行します。呼び出しが関数オブジェクト( 'form'など)の名前を持つ場合、そのオブジェクトはアクセス可能でなければなりません。 2)各関数には環境(通常は作成された環境)と、親環境の連鎖があり、オブジェクトを探すために探します。ただし、別の関数内で関数を実行しても、この親チェーンは変更されません。チェーンの終わりには地球環境があるので、 'form'が地球環境にあるとき、それを見つけることができます。しかし、 'form'が呼び出し関数の環境にあるとき、それはできません。 – Aaron

関連する問題