使用包预测时取消记录时间序列

时间:2013-03-28 03:52:02

标签: r time-series

您好我使用包预测来进行时间序列预览。 我想知道如何在最终预测图中取消系列。使用预测包我不知道如何取消记录我的系列。这是一个例子:

library(forecast)
data <- AirPassengers
data <- log(data) #with this AirPassengers data not nessesary to LOG but with my private data it is...because of some high picks...
ARIMA <- arima(data, order = c(1, 0, 1), list(order = c(12,0, 12), period = 1)) #Just a fake ARIMA in this case... 
plot(forecast(ARIMA, h=24)) #but my question is how to get a forecast plot according to the none log AirPassenger data

enter image description here

因此记录了图像。我希望拥有相同的ARIMA模式,但不包含无数据。

3 个答案:

答案 0 :(得分:9)

没有必要使用@ndoogan提出的黑客攻击。 forecast.Arima具有用于撤消转换的内置工具。以下代码将执行所需操作:

fc <- forecast(ARIMA, h=24, lambda=0)

更好的是,将模型转换为模型本身:

ARIMA <- Arima(data, order=c(1,0,1), list(order=c(1,0,1),period=12)), lambda=0)
fc <- forecast(ARIMA, h=24)

请注意,您需要使用Arima包中的forecast函数执行此操作,而不是使用arima包中的stats函数。

@Hemmo是正确的,这种反向转换不会给出预测分布的平均值,因此不是最佳的MSE预测。但是,它将给出预测分布的中位数,因此将给出最佳的MAE预测。

最后,@ Swiss12000使用的假模型没有意义,因为季节性部分的频率为1,因此与非季节性部分混淆。我想你可能意味着我在上面的代码中使用的模型。

答案 1 :(得分:7)

@ ndoogan答案的问题是对数不是线性变换。这意味着E [exp(y)]!= exp(E [y])。 Jensen's inequality实际上给出了E [exp(y)]&gt; = exp(E [y])。这是一个简单的演示:

set.seed(1)
x<-rnorm(1000)
mean(exp(x))
[1] 1.685356
exp(mean(x))
[1] 0.9884194

以下是有关预测的案例:

# Simulate AR(1) process
set.seed(1)
y<-10+arima.sim(model=list(ar=0.9),n=100)

# Fit on logarithmic scale
fit<-arima(log(y),c(1,0,0))

#Simulate one step ahead
set.seed(123)
y_101_log <- fit$coef[2]*(1-fit$coef[1]) + 
             fit$coef[1]*log(y[100]) + rnorm(n=1000,sd=sqrt(fit$sigma2))

y_101<-exp(y_101_log) #transform to natural scale

exp(mean(y_101_log)) # This is exp(E(log(y_101)))
[1] 5.86717          # Same as exp(predict(fit,n.ahead=1)$pred) 
                     # differs bit because simulation

mean(y_101)          # This is E(exp(log(y_101)))=E(y_101)
[1] 5.904633

# 95% Prediction intervals:

#Naive way:
pred<-predict(fit,n.ahead=1)
c(exp(pred$pred-1.96*pred$se),exp(pred$pred+1.96*pred$se))
pred$pred pred$pred 
 4.762880  7.268523 

# Correct ones:
quantile(y_101,probs=c(0.025,0.975))
    2.5%    97.5% 
4.772363 7.329826 

这也为您的问题提供了一般意义上的解决方案:

  1. 适合您的模型
  2. 模拟该模型中的多个样本(例如,如上所述提前一步预测)
  3. 对于每个模拟样本,进行逆变换以获得原始比例的值
  4. 从这些模拟样本中,您可以将期望值计算为普通均值,或者如果需要置信区间,则计算经验分位数。

答案 2 :(得分:3)

这有点像黑客,但它似乎做你想要的。根据您的拟合模型ARIMA

fc<-forecast(ARIMA,h=24)
fc$mean<-exp(fc$mean)
fc$upper<-exp(fc$upper)
fc$lower<-exp(fc$lower)
fc$x<-exp(fc$x)

现在绘制它

plot(fc)

enter image description here