2012-01-27 28 views
43

posted earlier today關於我使用predict函數得到的錯誤。我得以糾正,並認爲我走在了正確的道路上。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) 

現在,當我跑,我得到這個錯誤信息:

,我用來建立模型,它有21個觀測
Error in `$<-.data.frame`(`*tmp*`, "estimate", value = c(60980.3823396919, : 
    replacement has 21 rows, data has 3 

我原來的數據幀。我現在試圖根據模型預測3個值。

我要麼不真正理解這個函數,要麼在我的代碼中有錯誤。

幫助,將不勝感激。

感謝

+1

你幾乎肯定需要用'data'參數'lm'噸得到這個工作,即'模型< - LM(總共〜優惠券,data = df)'。然後,我會建議'優惠券$估計< - 預測(模型,newdata =優惠券)$總計' – 2012-01-27 03:46:30

+0

@BenBolker我同意第一部分,不太確定第二部分。我認爲'預測(模型,新數據=優惠券)'應該是他想要的。 – joran 2012-01-27 03:50:26

+0

@joran是的,我認爲你是對的。 – 2012-01-27 03:51:18

回答

65

首先,要使用

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

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

其次,通過說lm(Total ~ Coupon),您正在擬合使用Total作爲響應變量的模型,以Coupon作爲預測變量。也就是說,您的模型的形式爲Total = a + b*Coupon,其中ab爲待估計的係數。請注意,響應位於~的左側,以及右側的預測變量。

正因爲如此,當你問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) 
+0

我認爲你已經倒過來了。此外,'new.df'應該包含'Coupon'而不是'Total'。另外,我對原始問題的回答也適用;) – 2012-01-27 04:12:02

+1

@ JoshO'Brien:我要去看OP發佈的新數據,它指定了'Total'的值。這意味着他實際上是在模型之後預測「優惠券」。 – 2012-01-27 04:15:13

+0

但他總是在公式的LHS上加上'Total',就像你在帖子的開頭部分一樣!除非我令人難以置信地感到困惑,否則'Coupon'應該是預測指標。 (並不是說它和你想要達到的概念一樣重要)。 – 2012-01-27 04:22:44

7

謝謝洪,這正是我遇到的問題。您得到的錯誤表明行數是錯誤的,但問題實際上是模型已經使用最終以錯誤參數名稱命名的命令進行了訓練。

這實際上是一個非常關鍵的細節,對於lm等是完全不明顯的。本教程的一些內容引用了諸如lm([email protected]$Palmitic)這樣的行 - 最後以橄欖油$ Area NOT Area的變量名結尾,因此無法使用使用anewdata<-data.frame(Palmitic=2)創建條目。如果您使用lm([email protected],data=olive)那麼變量名稱是正確的,並且預測工作。

真正的問題是,該錯誤消息並不表示該問題的所有:

警告信息:「anewdata」有發現有X 行

1行,但變量(S)
+0

謝謝,這是非常重要的一點,我也遇到了你提到的錯誤。將答案應用於Hong的回答:如果new.df中的列未被命​​名爲「Total」,即與原始數據框相同的列名,那麼他會得到您(和我)得到的錯誤。因此,確保新數據中的列名與原始模型中的預測變量相同是非常重要的。 – NeonBlueHair 2014-11-08 21:47:17

+0

將此標記爲不是答案。使用'@'操作符表示你正在處理一個S4對象,這與原始問題和答案無關。你已經錯誤地把你的困難與一個沒有明確規定的作業問題混淆在一起,而這個問題已經得到了充分的回答。 – 2016-12-01 02:31:48

2

而不是您在預測代碼中使用newdate的新數據,請驗證一次。並只使用Coupon$estimate <- predict(model, Coupon) 它會工作。

1

爲了避免錯誤,關於新數據集的一個重點是自變量的名稱。它必須與模型中報告的相同。另一種方法是窩兩個功能,而無需創建一個新的數據集

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