No.21101 将来の予測限界を求めるには?  【葉隠】 2014/06/17(Tue) 10:26

いつもお世話になっております。

実は重回帰モデルの予測限界の算出で困っており,ご教示頂けますと幸いです。

20カ月分のデータ(d1)があり,目的変数(Y)に対し,2個の説明変数(X1, X2)で重回帰モデルを作成。

lm01 <- lm(Y ~ X1 + X2, data=d1) ### 重回帰モデル作成
yosoku01 <- 予測値=predict(lm01, interval="predict") ### 予測限界を出力

このモデルlm01に今後4カ月分のX1,X2の見込み値を代入してYの予測限界を出したいのですが,うまくいきません。

例えば,24カ月分のデータ(d2)を用いて,
yosoku02 <- 予測値=predict(lm01, newdata=d2, interval="predict")
としても,下記のエラーが出て計算してくれません。

警告メッセージ:
'newdata' had 24 rows but variables found have 20 rows

この場合,どうしたら21-24カ月目の予測限界を算出できるのでしょうか?

ご教示頂けますと幸いです。

No.21102 Re: 将来の予測限界を求めるには?  【青木繁伸】 2014/06/17(Tue) 10:41

あなたが使っている d1, d2 がどのようになっているか分からないので,エラーの原因を特定できません。
掲示板にデータを貼り込んだらいかが???

適 当なデータを作って実行してみましたが,やはりあなたがいうようなエラーメッセージはでませんでした。しかし,なぜ,yosoku02 <- 予測値=predict(... などと変なことをしているのか分かりませんが,このままだと,私の R バージョンでは,
以下にエラー (yosoku01 <- 予測値) = predict(lm01, interval = "predict") :
オブジェクト 'yosoku01' がありません
などというエラーメッセージをはき出しますが???ね,なんか変な括弧が補われているでしょう??? (yosoku01 <- 予測値) = って,なんなのさ...
yosoku02 <- 予測値 <- predict(...とすれば,そのエラーはでなくなります。
しかし,
警告メッセージ:
In predict.lm(lm01, interval = "predict") :
現在のデータによる予測は未来の応答値を参照しています
という警告メッセージが出ます。

ちなみに,interval = "predict" でも通りますが,ちゃんと,interval = "prediction" と書く方がよいでしょう。

No.21103 Re: 将来の予測限界を求めるには?  【葉隠】 2014/06/17(Tue) 14:01

青木先生

お手数をお掛けして申し訳ありません。
コードの一部を抜粋したため,削除すべき部分が残っていました。
正しくは下記の通りです。

長文になり恐縮ですが,データとコードを掲載させて頂きますので,
どこが間違っているか,ご教示頂けますと幸いです。

<d1:20カ月分のデータ>
Y,X1,X2
5.1,3.5,1.4
4.9,3,1.4
4.7,3.2,1.3
4.6,3.1,1.5
5,3.6,1.4
5.4,3.9,1.7
4.6,3.4,1.4
5,3.4,1.5
4.4,2.9,1.4
4.9,3.1,1.5
5.4,3.7,1.5
4.8,3.4,1.6
4.8,3,1.4
4.3,3,1.1
5.8,4,1.2
5.7,4.4,1.5
5.4,3.9,1.3
5.1,3.5,1.4
5.7,3.8,1.7
5.1,3.8,1.5

<d2:24カ月分のX1とX2>
X1,X2
3.5,1.4
3,1.4
3.2,1.3
3.1,1.5
3.6,1.4
3.9,1.7
3.4,1.4
3.4,1.5
2.9,1.4
3.1,1.5
3.7,1.5
3.4,1.6
3,1.4
3,1.1
4,1.2
4.4,1.5
3.9,1.3
3.5,1.4
3.8,1.7
3.8,1.5
3.4,1.7
3.7,1.5
3.6,1
3.3,1.7

<コード>
### データの読み込み
d1 <- read.csv("d1.csv", header=TRUE)
d2 <- read.csv("d2.csv", header=TRUE)
### 重回帰モデル作成
lm01 <- lm(d1$Y ~ d1$X1 + d1$X2, data=d1)
### 将来の予測値と予測限界の出力
yosoku02 <- predict(lm01, newdata=d2, interval="prediction")

<エラーメッセージ>
警告メッセージ:
'newdata' had 24 rows but variables found have 20 rows

No.21104 Re: 将来の予測限界を求めるには?  【青木繁伸】 2014/06/17(Tue) 15:13

重回帰分析の formula に,「データフレーム名$変数名」という形式の項を書いてはいけません。
以下のようにすればよいだけです。
最初の質問中には formula は,ちゃんと,このように書いていたようなのに...

lm01 <- lm(Y ~ X1 + X2, data=d1)
yosoku02 <- predict(lm01, newdata=d2, interval="prediction")

No.21105 Re: 将来の予測限界を求めるには?  【葉隠】 2014/06/17(Tue) 15:55

青木先生

うまく動きました!
ありがとうございます。

formulaの記述自体が間違っていたとは想定外でした。
勉強不足を痛感しております。

この度は本当に勉強になりました。
今後とも,ご指導のほどお願いいたします。

葉隠

● 「統計学関連なんでもあり」の過去ログ--- 046 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る