私は、潜在的な説明変数であるベクトル を順番に回帰したいと考えています。 を一緒に貼り付けるのではなく、reformulate()
、 as demonstrated hereと考えています。プログラムで構築された数式を使用するうえでの落とし穴はありますか?
以下の機能fun()
は、希望のモデルに合った仕事をしているようです。しかし、 は、の値ではなく、という名前の構成式オブジェクト のという名前を呼び出し要素に記録することに注意してください。
## (1) Function using programatically contructed formula
fun <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
lm(ff, data=mtcars)
}
fun(XX=c("cyl", "disp"))
#
# Call:
# lm(formula = ff, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058
## (2) Result of directly specified formula (just for purposes of comparison)
lm(mpg ~ cyl + disp, data=mtcars)
#
# Call:
# lm(formula = mpg ~ cyl + disp, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058
私の質問:はこの内の任意の危険性はありますか?たとえば、後でupdate
、またはpredict
または をモデルフィットオブジェクトに適用したい場合(おそらく他の環境から)、これは 問題になることがありますか?
それにもかかわらず、記録されている のコール権を取得するのは少し面倒な選択肢です。eval(substitute())
を使用します。どのようにしてもこれは一般により安全な構造ですか?
fun2 <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
eval(substitute(lm(FF, data=mtcars), list(FF=ff)))
}
fun2(XX=c("cyl", "disp"))$call
## lm(formula = mpg ~ cyl + disp, data = mtcars)
私はこの問題が 'update'を使って慎重になると思います。[http://stackoverflow.com/questions/13690184/update-inside-a-function-only-searches-the-global-environment]を参照してください。通常、これらの落とし穴は 'data.table'を使って調べることができます - [http://stackoverflow.com/questions/15096811/why-is-using-update-on-a-lm-inside-a- @ 15376891#15376891] – mnel
これは動作します: 'do.call(" lm "、list(ff、quote(mtcars)))' –
@G.Grothendieck - ありがとう。それは良いように見え、道路の下で何の問題も生じないはずです。 (また、興味深いリンクのためのmnelに感謝します。) –