7

潜在的な説明変数の長いベクトルを実行し、それぞれの応答変数を順番に回帰させたいと考えています。モデル式を貼り付けるのではなく、ここで示すようreformulate()に を使用することを考えています。

以下の関数fun()は、目的のモデルに合わせて仕事をしているようです。ただし、 call 要素には、 valueではなく、構築された Formula オブジェクトの名前が記録されていることに注意してください。

## (1) Function using programmatically constructed 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)
4

1 に答える 1

2

R 環境とスコーピングに関連する何かが噛み付くような状況はないと主張するのをいつもためらっていますが、... さらに調査した結果、上記の最初の使用法は安全に見えます

印刷された呼び出しは、ちょっとしたニシンであることがわかりました。

他の関数 (および および によって抽出されたもの) によって実際に使用される式、fit オブジェクトの要素に格納されたものあり、実際の式を正しく取得します。(要素には class のオブジェクトが含まれています。これは、一連の属性が付加された単なるです。)formula()as.formula()termsterms"terms""formula"

私の質問のすべての提案と関連するコメントが同じ"formula"オブジェクトを保存していることを確認するには (関連する環境まで)、次を実行します。

## First the three approaches in my post
formula(fun(XX=c("cyl", "disp")))
# mpg ~ cyl + disp
# <environment: 0x026d2b7c>

formula(lm(mpg ~ cyl + disp, data=mtcars))
# mpg ~ cyl + disp

formula(fun2(XX=c("cyl", "disp"))$call)
# mpg ~ cyl + disp
# <environment: 0x02c4ce2c>

## Then Gabor Grothendieck's idea
XX = c("cyl", "disp")
ff <- reformulate(response="mpg", termlabels=XX)
formula(do.call("lm", list(ff, quote(mtcars))))  
## mpg ~ cyl + disp

が実際に fit オブジェクトformula()の要素から出力を導出していることを確認するには、 と を見てください。termsstats:::formula.lmstats:::formula.terms

于 2013-07-03T21:50:01.873 に答える