سؤال
أنا نشرت في وقت سابق اليوم حول خطأ كنت أواجهه عند استخدام 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 ملاحظة.أحاول الآن التنبؤ بثلاث قيم بناءً على النموذج.
إما أنني لا أفهم هذه الوظيفة حقًا، أو أن لدي خطأ في الكود الخاص بي.
سيكون موضع تقدير المساعدة.
شكرًا
المحلول
أولا، تريد استخدام
model <- lm(Total ~ Coupon, data=df)
لا model <-lm(df$Total ~ df$Coupon, data=df)
.
ثانيا بالقول lm(Total ~ Coupon)
, ، أنت تناسب النموذج الذي يستخدم Total
كمتغير الاستجابة مع Coupon
كما المتنبئ.وهذا هو، النموذج الخاص بك هو من النموذج Total = a + b*Coupon
, ، مع a
و b
المعاملات التي سيتم تقديرها.لاحظ أن الرد يذهب على الجانب الأيسر من ~
, ، والمتنبئ (المتنبئون) على اليمين.
ولهذا السبب، عندما تطلب من R أن يعطيك القيم المتوقعة للنموذج، يجب عليك تقديم مجموعة من القيم الجديدة متنبئ القيم، أي القيم الجديدة ل Coupon
, ، لا Total
.
ثالثا، اذا حكمنا من خلال المواصفات الخاصة بك newdata
, ، يبدو أنك في الواقع تبحث عن نموذج يناسبك Coupon
ك وضيفة من Total
, ، ليس العكس.لفعل هذا:
model <- lm(Coupon ~ Total, data=df)
new.df <- data.frame(Total=c(79037022, 83100656, 104299800))
predict(model, new.df)
نصائح أخرى
شكرًا هونغ، كانت هذه هي المشكلة التي كنت أواجهها بالضبط.يشير الخطأ الذي حصلت عليه إلى أن عدد الصفوف خاطئ، ولكن المشكلة تكمن في الواقع في أن النموذج قد تم تدريبه باستخدام أمر ينتهي بأسماء خاطئة للمعلمات.
هذه في الواقع تفاصيل مهمة وغير واضحة تمامًا بالنسبة للأفلام وما إلى ذلك.تشير بعض البرامج التعليمية إلى القيام بسطور مثل lm(olive$Area@olive$Palmitic)
- ينتهي الأمر بأسماء متغيرة لـ Olive$Area NOT Area، لذلك يتم إنشاء إدخال باستخدام anewdata<-data.frame(Palmitic=2)
لا يمكن بعد ذلك استخدامها.إذا كنت تستخدم lm(Area@Palmitic,data=olive)
إذن فإن أسماء المتغيرات صحيحة ويعمل التنبؤ.
المشكلة الحقيقية هي أن رسالة الخطأ لا تشير إلى المشكلة على الإطلاق:
رسالة تحذير:كان "Anewdata" صفًا واحدًا ولكن المتغيرات (المتغيرات) وجدت أن لديهم صفوف X
بدلاً من البيانات الجديدة التي تستخدمها newdate في كود التنبؤ الخاص بك، تحقق مرة واحدة.واستخدام فقط Coupon$estimate <- predict(model, Coupon)
سوف تعمل.
لتجنب الخطأ، هناك نقطة مهمة حول مجموعة البيانات الجديدة وهي اسم المتغير المستقل.يجب أن يكون هو نفسه كما ورد في النموذج.هناك طريقة أخرى وهي دمج الوظيفتين دون إنشاء مجموعة بيانات جديدة
model <- lm(Coupon ~ Total, data=df)
predict(model, data.frame(Total=c(79037022, 83100656, 104299800)))
انتبه إلى النموذج.الأمران التاليان متشابهان، ولكن بالنسبة لوظيفة التنبؤ، الأول يعمل والثاني لا يعمل.
model <- lm(Coupon ~ Total, data=df) #Ok
model <- lm(df$Coupon ~ df$Total) #Ko