2015-12-29 75 views
2

預測到實際值差異()我已經看過轉換雙重差分R中

時間序列預測:轉換差分預測回差水平前

如何「undifference」一時間序列變量

這些都不幸給出了任何明確的答案,如何使用差分法(diff())在ARIMA中完成預測,以便在固定序列中達成。

代碼示例。

## read data and start from 1 jan 2014 
dat<-read.csv("rev forecast 2014-23 dec 2015.csv") 
val.ts <- ts(dat$Actual,start=c(2014,1,1),freq=365) 

##Check how we can get stationary series 
plot((diff(val.ts))) 
plot(diff(diff(val.ts))) 
plot(log(val.ts)) 
plot(log(diff(val.ts))) 
plot(sqrt(val.ts)) 
plot(sqrt(diff(val.ts))) 
##I found that double differencing. i.e.diff(diff(val.ts)) gives stationary series. 

#I ran below code to get value of 3 parameters for ARIMA from auto.arima 
ARIMAfit <- auto.arima(diff(diff(val.ts)), approximation=FALSE,trace=FALSE, xreg=diff(diff(xreg))) 
#Finally ran ARIMA 
fit <- Arima(diff(diff(val.ts)),order=c(5,0,2),xreg = diff(diff(xreg))) 

#plot original to see fit 
plot(diff(diff(val.ts)),col="orange") 
#plot fitted 
lines(fitted(fit),col="blue") 

這給了我一個完美的合適時間系列。但是,如何將擬合的值從目前的形式轉換爲其原始度量?我的意思是從雙重差異到實際數字?對於log我知道我們可以做10 ^擬合(適合)平方根有類似的解決方案,但是如何做差分,這種雙差分?

對此有任何幫助請在R?經過幾天的嚴格練習,我被困在這一點上。

我跑了測試,以檢查差異對auto.arima函數的模型擬合是否有任何影響,並發現它。所以auto.arima無法處理非平穩系列,需要部分分析師將系列轉換爲平穩。

首先,auto.arima沒有任何差異。橙色是實際值,藍色是合適的。

ARIMAfit <- auto.arima(val.ts, approximation=FALSE,trace=FALSE, xreg=xreg) 
plot(val.ts,col="orange") 
lines(fitted(ARIMAfit),col="blue") 

其次,我想差分

ARIMAfit <- auto.arima(diff(val.ts), approximation=FALSE,trace=FALSE, xreg=diff(xreg)) 
plot(diff(val.ts),col="orange") 
lines(fitted(ARIMAfit),col="blue") 

enter image description here

第三,我沒差分2倍。

ARIMAfit <- auto.arima(diff(diff(val.ts)), approximation=FALSE,trace=FALSE, 
xreg=diff(diff(xreg))) 
plot(diff(diff(val.ts)),col="orange") 
lines(fitted(ARIMAfit),col="blue") 

enter image description here

目視檢查可以建議第三圖形是更準確的所有的。我知道這一點。面臨的挑戰是如何將這種雙倍差異形式的擬合值轉換爲實際度量值!

回答

2

如果您希望差分有必要獲得平穩性,那麼爲什麼不簡單地在函數調用中包含最大差分順序呢?也就是說,ARIMA中的「I」是在擬合ARMA模型之前的差分順序,使得如果

y = diff(diff(x))並且y是ARMA(p,q)過程,則

然後

X如下的ARIMA(p,2,q)的過程。

auto.arima()中,您指定與d參數的差異(如果涉及季節則指定D)。所以,你想是這樣的(最多3個差異):

fit <- auto.arima(val.ts, d=3, ...) 

這個,你可以驗證擬合值確實會映射到原始數據

plot(val.ts) 
lines(fit, col="blue") 
2

diff相反的是cumsum,但您需要知道每個差異的起始值。

e.g:

set.seed(1234) 
x <- runif(100) 
z <- cumsum(c(x[1], cumsum(c(diff(x)[1], diff(diff(x)))))) 
all.equal(z, x) 
[1] TRUE 

分享一些您的數據進行重複的例子,以更好地幫助回答這個問題。