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つの値を予測しようとしています。
この関数を本当に理解していないか、コードにエラーがあります。
ヘルプをいただければ幸いです。
ありがとう
まず、使用したい
model <- lm(Total ~ Coupon, data=df)
notmodel <-lm(df$Total ~ df$Coupon, data=df)
。
次に、lm(Total ~ Coupon)
と言うことで、応答変数としてTotal
を使用し、予測変数としてCoupon
を使用するモデルを適合させます。つまり、モデルはTotal = a + b*Coupon
という形式で、a
とb
が推定される係数です。応答は~
の左側にあり、予測子は右側にあることに注意してください。
このため、モデルの予測値を提供するように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)
ホンさん、ありがとうございます。表示されるエラーは、行数が間違っていることを示唆していますが、実際の問題は、パラメーターの名前が間違っているコマンドを使用してモデルがトレーニングされていることです。
これは本当に重要な詳細であり、lmなどではまったく明らかではありません。チュートリアルの一部は、lm(olive$Area@olive$Palmitic)
のような行を実行することを参照します-最終的にolive $ Area NOT Areaの変数名になるため、anewdata<-data.frame(Palmitic=2)
を使用してエントリを作成することはできません。 lm(Area@Palmitic,data=olive)
を使用すると、変数名は正しく、予測が機能します。
実際の問題は、エラーメッセージが問題をまったく示していないことです。
警告メッセージ:「anewdata」には1行がありましたが、変数にはX行があることがわかりました
予測コードでnewdateを使用しているnewdataの代わりに、一度確認してください。 Coupon$estimate <- predict(model, Coupon)
を使用するだけで機能します。
エラーを回避するために、新しいデータセットに関する重要なポイントは独立変数の名前です。モデルで報告されているものと同じでなければなりません。別の方法は、新しいデータセットを作成せずに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