3

以下のコードに問題があり、理解しようとしています。

x = rnorm(50)
y  = 3 * x +rnorm(50)

df_eq  <- data.frame(x, y)

model1  <- lm(y ~ x - 1)
model2  <- lm(df_eq[,2] ~ df_eq[,1] - 1)

xpred <- data.frame(x = seq(from = -2, to = 2, length = 5))

ypred <- predict(object = model1, newdata = xpred)
ypred2 <- predict(object = model2, newdata = xpred)

上記のコードでは、ypred と ypred2 の両方が同じ結果を生成することを期待しています。ypred (5 つの予測された「yhat」値) で期待している答えが得られますが、ypred2 にはエラーがあり、期待どおりの結果が得られません。

次のコードで ypred2 がエラーを生成する理由を誰か説明してもらえますか (少なくとも R 2.15.2 では)。

コードの唯一の重要な違いは、"model1" と "model2" の生成方法にあると思います。

私の理解では、予測関数では、newdata は、model1 および model2 オブジェクトに格納されているモデルに基づいて、「yhat」値を予測したい新しい一連の観測値を生成します。

何が根本的に違うのか

モデル1 <- lm(y ~ x - 1)

model2 <- lm(df_eq[,2] ~ df_eq[,1] - 1) ?

さらに重要なことは、答えが簡単な場合、誰かが R の「フードの下」との違いをどのように理解したかを説明できますか? 将来、この種の問題をどのように理解できるかを知ることができれば幸いです。上記のコードでオブジェクトの構造を調べてみましたが、答えには近づいていません。

前もって感謝します。

4

1 に答える 1

6

R の観点からはpredict.lm、オブジェクトを渡しますmodel2。「わかりました、lmここにオブジェクトがあります。変数名は何ですか?」と表示されます。

> formula(model2)
df_eq[, 2] ~ df_eq[, 1] - 1

Ok。応答変数が呼び出され df_eq[, 2]、予測変数が呼び出され df_eq[, 1]ます。ここで、R は次のように考えていますxpred

うーん。その名前では何もありません。

実際の警告はmodel.frame.default、適切なモデル フレームを構築しようとしているときに によってスローされ、その過程でモデルを適合させるために使用された元のデータ値に戻ります。

モデルを一般的に (またはそれ以外で) 適合させるための正しいイディオムは次のlmようになります。

lm(y ~ x, data = df_eq)

R がグローバル環境内のオブジェクトの名前を取得することに依存しないでください。関連する列を含むデータ フレームを指定し、それらの列名を数式で使用してください。

于 2013-04-08T19:26:40.753 に答える