2

数式を使用するモデル構築関数をプログラムしようとしていますが、モデルupdate関数の仕組みを理解するのに問題があります。

関数を使用するとエラーになる、簡略化された関数を次に示しupdateます。

modelx <- function(formula) {         
  mf <- mc <- match.call()                         
  mf <- mf[c(1L,  match("formula", names(mf), 0L))]      
  mf[[1L]] <- as.name("model.frame")
  mf <- eval(mf, parent.frame())
  y <- model.response(mf, "numeric")
  mt <- attr(mf, "terms")      
  X <- model.matrix(mt, mf)
  out<-list(y=y,X=X)
  out$call<-mc
  out
}

コードはlm関数の最初からほとんどコピーされています。いくつかのサンプル データと 2 つのモデル:

y<-x<-x1<-x2<-1:10
model<-modelx(y ~ x)
model1<-modelx(y ~ x1)

最初のモデルの更新は機能しませんが、2 番目のモデルは機能します。

 model<-update(model, . ~ . + x2)
    Error in model.frame.default(formula = y ~ x + x2) : 
    invalid type (list) for variable 'x'
 model1<-update(model1, . ~ . + x2)

out$terms <- mtの出力にコンポーネントを追加するとmodelx、両方のケースですべてが機能します。このコンポーネントが必要な理由と、2 番目のケースではそれがなくても更新機能が機能するのに、最初のケースでは機能しないのはなぜですか?

4

1 に答える 1

4

update( ?update)のヘルプを見ると、次のように表示されます。

説明

update は、モデルを更新して (デフォルトで) 再適合させます。これは、オブジェクトに格納されている呼び出しを抽出し、呼び出しを更新し、(既定では) その呼び出しを評価することによって行われます。たとえば、データ フレームが修正された場合など、引数を 1 つだけ指定して update を呼び出すと便利な場合があります。

update() および同様の関数での「呼び出しの抽出」は、単純に x$call を取得するデフォルト メソッドを備えた (S3) 汎用関数である getCall() を使用します。

このため、update() は、新しいモデル クラスに対して自動的に、またはそのクラスに単純な getCall() メソッドを提供することによって (デフォルト メソッドを介して) 機能することがよくあります。

使用法

update(オブジェクト, ...)

getCall(x, ...)

getCall情報がパラメーターの名前である関数に渡され、xこれがあなたと名前の衝突を経験しx、言語があなたよりもローカルxを選択しているため、衝突が発生しているように見えますx

于 2013-03-04T13:19:37.450 に答える