2012-08-03 69 views
7

當一個數據幀警告計算預測值

x 
    Date  Val 
    1/1/2012 7 
    2/1/2012 9 
    3/1/2012 20 
    4/1/2012 24 
    5/1/2012 50 
a <- seq(as.Date(tail(x, 1)$Date), by="month", length=5) 
a <- data.frame(a) 
x.lm <- lm(x$Val ~ x$Date) 

x.pre<-predict(x.lm, newdata=a) 

我得到這個工作ERRO:

Warning message: 
'newdata' had 5 rows but variable(s) found have 29 rows 

我究竟做錯了什麼?

這裏是dput輸出:

dput(x) 
structure(list(Date = structure(c(14610, 14641, 14669, 14700, 
14730, 14761, 14791, 14822, 14853, 14883, 14914, 14944, 14975, 
15006, 15034, 15065, 15095, 15126, 15156, 15187, 15218, 15248, 
15279, 15309, 15340, 15371, 15400, 15431, 15461), class = "Date"), 
    Val = c(45, 51, 56, 56, 59, 60, 60, 60, 64, 65, 75, 73, 74, 
    80, 87, 91, 92, 96, 109, 108, 123, 129, 133, 143, 127, 127, 
    123, 121, 130)), .Names = c("Date", "Val"), row.names = c(NA, 
29L), class = "data.frame") 
+1

你的第一行中的'z'是否應該是'x'?否則我們不知道'z'是什麼。你沒有收到錯誤,你會收到警告。另外,你向我們展示的任何東西都有29行,所以我們不能重複這一點。使用'dput'向我們顯示您的實際數據。 – Justin 2012-08-03 20:47:27

+0

對不起,是的,它是x。我只是更新它 – user1471980 2012-08-03 20:50:32

回答

10

你的變量名,如存儲在x.lm模型,請參閱x數據幀。在a中沒有相同名稱的變量,所以它會再次使用來自x的那29個,這可能不是您想要的,因此是警告。你可以做下面的始終使用的型號命名Date不合格的變量:

a <- seq(as.Date(tail(x, 1)$Date), by="month", length=5) 
a <- data.frame(Date = a) 
x.lm <- lm(Val ~ Date, data=x) 
x.pre<-predict(x.lm, newdata=a) 
+1

或'x.lm < - lm(Val_D Date,data = x);預測(x.lm,newdata = data.frame(Date = a))' – 2012-08-03 21:53:57

+0

@BenBolker,你說的對,'with(x,...)'可能是過度殺傷的。相應地更改了我的答案。謝謝。 – MvG 2012-08-04 05:54:30

+0

順便提一句,有沒有什麼方法可以看R參數傳遞如何工作,不會傷害到你的大腦? – 2014-08-06 21:33:13

1

data.frame a有一個名爲a列。您使用名稱爲ValDate的列創建了您的模型,以便查找它。

當你讓你data.frame a名稱列Date,你是好去:

a <- data.frame(Date=a) 

然後它在運行時的警告。

根據註釋:

編輯您的通話lm是:

lm(Val ~ Date, data=x) 
+0

仍然給我的警告,因爲變量在這裏被稱爲'x $ Date'。即使實際上在數據框中調用它「x $ Date」似乎也不夠用。就像OP寫的那樣,你測試過了嗎?如果是這樣,你的R版本和我的2.15.1版本可能有區別。 – MvG 2012-08-03 21:27:34

+0

@MvG是的,你是對的,我在擺弄和忘記的時候改變了OP的代碼。 – Justin 2012-08-03 22:02:07

0

如果你不能讓predict.lm()的工作,那麼你應該嘗試使用function()寫自己的功能:

yourown_function<- function(predictor1, predictor2,...){intercept+b1*predictor1+b2*predictor2+...} 

使用yourown_function從任何新的數據幀預測:使用新的值

newvalues<- yourown_function(predictor1=data.frame$predictor1, predictor2=data.frame$predictor2,....) 

,你可以COMPUT e殘差,MSE等...

+0

這種字體和格式真的很難讀,Dude。 – skyline75489 2015-04-22 09:47:54

0

而不是x.lm < -lm(x $ Val〜x $ Date,data = x)使用x.lm(Val_ Date,data = x) 。在lm函數中刪除變量名前的數據集名稱應該有所幫助。