سؤال

أنا نشرت في وقت سابق اليوم حول خطأ كنت أواجهه عند استخدام 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top