4

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

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

在此处输入图像描述

所以图像被记录下来。我想拥有相同的 ARIMA 模型,但没有记录数据。

4

3 回答 3

11

没有必要使用@ndoogan 提出的 hack。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,因此与非季节性部分混淆。我想你可能是指我在上面的代码中使用的模型。

于 2013-03-31T00:11:03.210 回答
8

@ndoogan 的答案的问题是对数不是线性变换。这意味着 E[exp(y)] != exp(E[y])。Jensen 不等式实际上给出了 E[exp(y)] >= 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. 从这些模拟样本中,您可以将期望值计算为普通平均值,或者如果您需要置信区间,则可以计算经验分位数。
于 2013-03-28T13:47:42.960 回答
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)

在此处输入图像描述

于 2013-03-28T04:46:52.923 回答