1

予測子が別の値で分類される線形回帰を実行していますが、新しいデータのモデル化された応答を生成するのに問題があります。

最初に、予測子と誤差項のランダム値をいくつか生成します。次に、応答を作成します。予測子の係数は、カテゴリ変数の値に依存することに注意してください。予測子とそのカテゴリに基づいて計画行列を構成します。

set.seed(1)

category = c(rep("red", 5), rep("blue",5))
x1 = rnorm(10, mean = 1, sd = 1)
err = rnorm(10, mean = 0, sd = 1)

y = ifelse(category == "red", x1 * 2, x1 * 3)
y = y + err

df = data.frame(x1 = x1, category = category)

dm = as.data.frame(model.matrix(~ category + 0, data = df))
dm = dm * df$x1

fit = lm(y ~ as.matrix(dm) + 0, data = df)

# This line will not produce a warning
predictOne = predict.lm(fit, newdata = dm)

# This line WILL produce a warning
predictTwo = predict.lm(fit, newdata = dm[1:5,])

警告は次のとおりです。

「newdata」には 5 行ありましたが、見つかった変数には 10 行ありました

私が非常に間違っていない限り、変数名に問題はないはずです。(この掲示板には、その問題を示唆する議論が 1 つまたは 2 つあります。) 最初の予測は正常に実行されますが、2 番目の予測はうまくいかないことに注意してください。唯一の変更点は、2 番目の予測が計画行列の最初の 5 行のみを使用することです。

考え?

4

3 に答える 3

4

あなたが何をしようとしているのかは 100% わかりませんが、数式がどのように機能するかについて簡単に説明すると、問題が解決されると思います。

基本的な考え方は非常に単純です。数式とデータ フレームの 2 つを渡します。式の用語はすべて、データ フレーム内の変数の名前である必要があります。

これで、そのガイドラインに正確に従わなくても作業を開始できますがlm、問題が発生することを求めているだけです。立ち止まって、モデルの仕様を見て、R が探している場所について考えてみてください。

lm基本的に、式の名前を呼び出すと、実際にはデータフレームに見つかりませんdf。したがって、私はそれdfがまったく使用されていないと思います。

次に、呼び出すmodel.frame(fit)と、変数を呼び出す必要があるとRが考えるものがわかります。奇妙なことに気づきましたか?

model.frame(fit)
            y as.matrix(dm).categoryblue as.matrix(dm).categoryred
1   2.2588735                  0.0000000                 0.3735462
2   2.7571299                  0.0000000                 1.1836433
3  -0.2924978                  0.0000000                 0.1643714
4   2.9758617                  0.0000000                 2.5952808
5   3.7839465                  0.0000000                 1.3295078
6   0.4936612                  0.1795316                 0.0000000
7   4.4460969                  1.4874291                 0.0000000
8   6.1588103                  1.7383247                 0.0000000
9   5.5485653                  1.5757814                 0.0000000
10  2.6777362                  0.6946116                 0.0000000

で呼び出されるものはありas.matrix(dm).categoryblueますdmか? ええ、私はそうは思いませんでした。

私はあなたが次のようなことをするつもりだったと思います(確かではありません):

df$y <- y
fit <- lm(y~category - 1,data = df)
于 2013-01-22T02:42:10.617 に答える
2

Joranは正しい方向に進んでいます。この問題は列名に関連しています。私がやりたかったのは、独自の計画行列を作成することでした。これは、たまたま、実行する必要がなかったものです。次のコード行を使用してモデルを実行すると、スムーズに航行できます。

fit = lm(y ~ x1:category + 0, data = df)

その式の指定は、計画行列の手動構築に取って代わります。

私自身の計画行列を使用することは、私が過去に行ったことであり、適合パラメーターと診断は、本来あるべきものとまったく同じでした。私はpredict関数を使用していなかったので、Rが"data="パラメーターを破棄していることを知りませんでした。警告はかっこいいでしょう。Rは厳しい愛人です。

于 2013-01-22T15:07:30.797 に答える