2017-02-24 42 views
0

當我做預測使用forecast庫,我注意到以下預期的代碼不運行:錯誤的TS(X):「TS」對象必須有一個或幾個觀測

library(forecast) 
library(dplyr) 
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100)) 

get <- function (df1){ 
    ts1 <- ts((df1%>%filter(gp==2))$dt) 
    as.numeric(forecast(ar(ts1),15)$mean) 
}  

print(get(df1)) 

返回的錯誤是:

錯誤TS(X): 'TS' 對象必須有一個或多個觀察

可能它是由ar或引起功能。因爲如果您將功能更改爲ets或其他功能,該功能運行良好。

什麼是更奇怪的是,如果你的代碼更改爲:

library(forecast) 
library(dplyr) 
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100)) 
ts1 <- ts((df1%>%filter(gp==2))$dt) 

get <- function (ts1){ 
    as.numeric(forecast(ar(ts1),15)$mean) 
} 


print(get(ts1)) 

的代碼也運行正常。我認爲這可能是ar函數中的一個錯誤,並且問題與範圍有關。對此有何想法?

回答

2

問題是與範圍界定有關。 forecast()試圖找到用於擬合模型的時間序列。預測包中的函數(如ets)將此信息存儲在模型對象中,因此forecast()很容易找到它。但ar()來自統計軟件包,它不存儲用於擬合模型的時間序列。所以forecast()去尋找它。如果在get()函數之外運行代碼,則它可以正常工作,因爲forecast()設法在本地環境中找到ts1對象。但是在get()函數中會導致錯誤。

一個簡單的解決方法是調用forecast之前將信息添加到擬合模型:

library(forecast) 
library(dplyr) 
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100)) 
ts1 <- ts((df1%>%filter(gp==2))$dt) 

get <- function (ts1){ 
    fit <- ar(ts1) 
    fit$x <- ts1 
    as.numeric(forecast(fit,15)$mean) 
} 

print(get(ts1)) 

或者,使用predict代替forecast

library(dplyr) 
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100)) 
ts1 <- ts((df1%>%filter(gp==2))$dt) 

get <- function (ts1){ 
    fit <- ar(ts1) 
    as.numeric(predict(fit,n.ahead=15)$pred) 
} 

print(get(ts1)) 
相關問題