您好我使用包预测来进行时间序列预览。 我想知道如何在最终预测图中取消系列。使用预测包我不知道如何取消记录我的系列。这是一个例子:
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模式,但不包含无数据。
答案 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
这也为您的问题提供了一般意义上的解决方案:
答案 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)