web-dev-qa-db-ja.com

Predict()-多分私はそれを理解していない

I 本日前に投稿predict関数を使用して得られたエラーについて。私はそれを修正することができ、私は正しい道にいると思った。

多数の観測(実績)があり、外挿または予測したいデータポイントがいくつかあります。 lmを使用してモデルを作成し、予測変数入力として機能する実際の値でpredictを使用しようとしました。

このコードは以前の投稿からすべて繰り返されていますが、ここにあります:

df <- read.table(text = '
     Quarter Coupon      Total
1   "Dec 06"  25027.072  132450574
2   "Dec 07"  76386.820  194154767
3   "Dec 08"  79622.147  221571135
4   "Dec 09"  74114.416  205880072
5   "Dec 10"  70993.058  188666980
6   "Jun 06"  12048.162  139137919
7   "Jun 07"  46889.369  165276325
8   "Jun 08"  84732.537  207074374
9   "Jun 09"  83240.084  221945162
10  "Jun 10"  81970.143  236954249
11  "Mar 06"   3451.248  116811392
12  "Mar 07"  34201.197  155190418
13  "Mar 08"  73232.900  212492488
14  "Mar 09"  70644.948  203663201
15  "Mar 10"  72314.945  203427892
16  "Mar 11"  88708.663  214061240
17  "Sep 06"  15027.252  121285335
18  "Sep 07"  60228.793  195428991
19  "Sep 08"  85507.062  257651399
20  "Sep 09"  77763.365  215048147
21  "Sep 10"  62259.691  168862119', header=TRUE)

str(df)
'data.frame':   21 obs. of  3 variables:
 $ Quarter   : Factor w/ 24 levels "Dec 06","Dec 07",..: 1 2 3 4 5 7 8 9 10 11 ...
 $ Coupon: num  25027 76387 79622 74114 70993 ...
 $ Total: num  132450574 194154767 221571135 205880072 188666980 ...

コード:

model <- lm(df$Total ~ df$Coupon, data=df)

> model

Call:
lm(formula = df$Total ~ df$Coupon)

Coefficients:
(Intercept)    df$Coupon  
  107286259         1349 

コードの予測(以前のヘルプに基づく):

(これらは、予測値を取得するために使用する予測値です)

Quarter = c("Jun 11", "Sep 11", "Dec 11")
Total = c(79037022, 83100656, 104299800)
Coupon = data.frame(Quarter, Total)

Coupon$estimate <- predict(model, newdate = Coupon$Total)

さて、それを実行すると、次のエラーメッセージが表示されます。

Error in `$<-.data.frame`(`*tmp*`, "estimate", value = c(60980.3823396919,  : 
  replacement has 21 rows, data has 3

モデルの構築に使用した元のデータフレームには、21個の観測がありました。現在、モデルに基づいて3つの値を予測しようとしています。

この関数を本当に理解していないか、コードにエラーがあります。

ヘルプをいただければ幸いです。

ありがとう

56
mikebmassey

まず、使用したい

model <- lm(Total ~ Coupon, data=df)

notmodel <-lm(df$Total ~ df$Coupon, data=df)

次に、lm(Total ~ Coupon)と言うことで、応答変数としてTotalを使用し、予測変数としてCouponを使用するモデルを適合させます。つまり、モデルはTotal = a + b*Couponという形式で、abが推定される係数です。応答は~の左側にあり、予測子は右側にあることに注意してください。

このため、モデルの予測値を提供するようにRに要求する場合、一連の新しいpredictor値、つまりCouponではなくTotalの新しい値を提供する必要があります。

3番目に、newdataの仕様から判断すると、実際にはCouponの関数としてTotalに適合するモデルを追いかけているように見えますが、逆ではありません。これをする:

model <- lm(Coupon ~ Total, data=df)
new.df <- data.frame(Total=c(79037022, 83100656, 104299800))
predict(model, new.df)
86
Hong Ooi

ホンさん、ありがとうございます。表示されるエラーは、行数が間違っていることを示唆していますが、実際の問題は、パラメーターの名前が間違っているコマンドを使用してモデルがトレーニングされていることです。

これは本当に重要な詳細であり、lmなどではまったく明らかではありません。チュートリアルの一部は、lm(olive$Area@olive$Palmitic)のような行を実行することを参照します-最終的にolive $ Area NOT Areaの変数名になるため、anewdata<-data.frame(Palmitic=2)を使用してエントリを作成することはできません。 lm(Area@Palmitic,data=olive)を使用すると、変数名は正しく、予測が機能します。

実際の問題は、エラーメッセージが問題をまったく示していないことです。

警告メッセージ:「anewdata」には1行がありましたが、変数にはX行があることがわかりました

8
David Burton

予測コードでnewdateを使用しているnewdataの代わりに、一度確認してください。 Coupon$estimate <- predict(model, Coupon)を使用するだけで機能します。

2
sumalatha

エラーを回避するために、新しいデータセットに関する重要なポイントは独立変数の名前です。モデルで報告されているものと同じでなければなりません。別の方法は、新しいデータセットを作成せずに2つの関数をネストすることです

model <- lm(Coupon ~ Total, data=df)
predict(model, data.frame(Total=c(79037022, 83100656, 104299800)))

モデルに注意してください。次の2つのコマンドは似ていますが、予測機能の場合、最初の作業では2番目の作業は機能しません。

model <- lm(Coupon ~ Total, data=df) #Ok
model <- lm(df$Coupon ~ df$Total) #Ko
2
Alessio