Como fazer previsões com detecção de outliers no R? - Procedimento e método de análise de séries temporais

16

Tenho dados de séries temporais mensais e gostaria de fazer previsões com detecção de outliers.

Esta é a amostra do meu conjunto de dados:

       Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
2006  7.55  7.63  7.62  7.50  7.47  7.53  7.55  7.47  7.65  7.72  7.78  7.81
2007  7.71  7.67  7.85  7.82  7.91  7.91  8.00  7.82  7.90  7.93  7.99  7.93
2008  8.46  8.48  9.03  9.43 11.58 12.19 12.23 11.98 12.26 12.31 12.13 11.99
2009 11.51 11.75 11.87 11.91 11.87 11.69 11.66 11.23 11.37 11.71 11.88 11.93
2010 11.99 11.84 12.33 12.55 12.58 12.67 12.57 12.35 12.30 12.67 12.71 12.63
2011 12.60 12.41 12.68 12.48 12.50 12.30 12.39 12.16 12.38 12.36 12.52 12.63

Tenho referido procedimento de análise de séries temporais e métodos usando R , para fazer uma série de diferente modelo de previsão, no entanto, não parece ser preciso. Além disso, não tenho certeza de como incorporar os tsoutliers nele.

Eu tenho outro post sobre a minha investigação de tsoutliers e modelagem e procedimento de arima por aqui também.

Portanto, este é o meu código atualmente, que é semelhante ao link no.1.

Código:

product<-ts(product, start=c(1993,1),frequency=12)

#Modelling product Retail Price

#Training set
product.mod<-window(product,end=c(2012,12))
#Test set
product.test<-window(product,start=c(2013,1))
#Range of time of test set
period<-(end(product.test)[1]-start(product.test)[1])*12 + #No of month * no. of yr
(end(product.test)[2]-start(product.test)[2]+1) #No of months
#Model using different method
#arima, expo smooth, theta, random walk, structural time series
models<-list(
#arima
product.arima<-forecast(auto.arima(product.mod),h=period),
#exp smoothing
product.ets<-forecast(ets(product.mod),h=period),
#theta
product.tht<-thetaf(product.mod,h=period),
#random walk
product.rwf<-rwf(product.mod,h=period),
#Structts
product.struc<-forecast(StructTS(product.mod),h=period)
)

##Compare the training set forecast with test set
par(mfrow=c(2, 3))
for (f in models){
    plot(f)
    lines(product.test,col='red')
}

##To see its accuracy on its Test set, 
#as training set would be "accurate" in the first place
acc.test<-lapply(models, function(f){
    accuracy(f, product.test)[2,]
})
acc.test <- Reduce(rbind, acc.test)
row.names(acc.test)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.test <- acc.test[order(acc.test[,'MASE']),]

##Look at training set to see if there are overfitting of the forecasting
##on training set
acc.train<-lapply(models, function(f){
    accuracy(f, product.test)[1,]
})
acc.train <- Reduce(rbind, acc.train)
row.names(acc.train)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.train <- acc.train[order(acc.train[,'MASE']),]

 ##Note that we look at MAE, MAPE or MASE value. The lower the better the fit.

Este é o gráfico das minhas previsões diferentes, que não parecem muito confiáveis ​​/ precisas, através da comparação do conjunto de "teste" vermelho e do conjunto "previsto" azul. Gráfico de previsão diferente Previsão diferente

Precisão diferente dos respectivos modelos de conjunto de teste e treinamento

Test set
                    ME      RMSE       MAE        MPE     MAPE      MASE      ACF1 Theil's U
theta      -0.07408833 0.2277015 0.1881167 -0.6037191 1.460549 0.2944165 0.1956893 0.8322151
expsmooth  -0.12237967 0.2681452 0.2268248 -0.9823104 1.765287 0.3549976 0.3432275 0.9847223
randomwalk  0.11965517 0.2916008 0.2362069  0.8823040 1.807434 0.3696813 0.4529428 1.0626775
arima      -0.32556886 0.3943527 0.3255689 -2.5326397 2.532640 0.5095394 0.2076844 1.4452932
struc      -0.39735804 0.4573140 0.3973580 -3.0794740 3.079474 0.6218948 0.3841505 1.6767075

Training set
                     ME      RMSE       MAE         MPE     MAPE      MASE    ACF1 Theil's U
theta      2.934494e-02 0.2101747 0.1046614  0.30793753 1.143115 0.1638029  0.2191889194        NA
randomwalk 2.953975e-02 0.2106058 0.1050209  0.31049479 1.146559 0.1643655  0.2190857676        NA
expsmooth  1.277048e-02 0.2037005 0.1078265  0.14375355 1.176651 0.1687565 -0.0007393747        NA
arima      4.001011e-05 0.2006623 0.1079862 -0.03405395 1.192417 0.1690063 -0.0091275716        NA
struc      5.011615e-03 1.0068396 0.5520857  0.18206018 5.989414 0.8640550  0.1499843508        NA

Pela precisão dos modelos, podemos ver que o modelo mais preciso seria o modelo theta. Não sei por que a previsão é muito imprecisa e acho que um dos motivos seria que eu não tratei os "discrepantes" no meu conjunto de dados, resultando em uma previsão ruim para todos os modelos.

Este é o meu enredo outliers

Gráfico de Outliers Outliers

saída de tsoutliers

ARIMA(0,1,0)(0,0,1)[12]                    

Coefficients:
        sma1    LS46    LS51    LS61    TC133   LS181   AO183   AO184   LS185   TC186    TC193    TC200
      0.1700  0.4316  0.6166  0.5793  -0.5127  0.5422  0.5138  0.9264  3.0762  0.5688  -0.4775  -0.4386
s.e.  0.0768  0.1109  0.1105  0.1106   0.1021  0.1120  0.1119  0.1567  0.1918  0.1037   0.1033   0.1040
       LS207    AO237    TC248    AO260    AO266
      0.4228  -0.3815  -0.4082  -0.4830  -0.5183
s.e.  0.1129   0.0782   0.1030   0.0801   0.0805

sigma^2 estimated as 0.01258:  log likelihood=205.91
AIC=-375.83   AICc=-373.08   BIC=-311.19

 Outliers:
    type ind    time coefhat  tstat
1    LS  46 1996:10  0.4316  3.891
2    LS  51 1997:03  0.6166  5.579
3    LS  61 1998:01  0.5793  5.236
4    TC 133 2004:01 -0.5127 -5.019
5    LS 181 2008:01  0.5422  4.841 
6    AO 183 2008:03  0.5138  4.592
7    AO 184 2008:04  0.9264  5.911
8    LS 185 2008:05  3.0762 16.038
9    TC 186 2008:06  0.5688  5.483
10   TC 193 2009:01 -0.4775 -4.624
11   TC 200 2009:08 -0.4386 -4.217
12   LS 207 2010:03  0.4228  3.746
13   AO 237 2012:09 -0.3815 -4.877
14   TC 248 2013:08 -0.4082 -3.965
15   AO 260 2014:08 -0.4830 -6.027
16   AO 266 2015:02 -0.5183 -6.442

Gostaria de saber como posso "analisar" / prever meus dados ainda mais, com esses conjuntos de dados relevantes e a detecção de outliers, etc. Por favor, me ajude no tratamento dos outliers e também na previsão.

Por fim, gostaria de saber como combinar as diferentes previsões de modelos, como o que a @forecaster mencionou no link nº 1, combinar o modelo diferente provavelmente resultará em uma melhor previsão / previsão.

EDITADO

Eu gostaria de incorporar os valores discrepantes em outros modelos estão bem.

Eu tentei alguns códigos, por exemplo.

forecast.ets( res$fit ,h=period,xreg=newxreg)
Error in if (object$components[1] == "A" & is.element(object$components[2], : argument is of length zero

forecast.StructTS(res$fit,h=period,xreg=newxreg)
Error in predict.Arima(object, n.ahead = h) : 'xreg' and 'newxreg' have different numbers of columns

Existem alguns erros produzidos, e não tenho certeza sobre o código correto para incorporar os outliers como regressores. Além disso, como trabalho com thetaf ou rwf, pois não há forecast.theta ou forecast.rwf?

Ted
fonte
1
Talvez você deve tomar uma outra abordagem para obter ajuda, como re-edição contínua não parece trabalho
IrishStat
Concordo com @irishstat, as duas respostas abaixo fornecem resposta direta à sua pergunta e parecem ter recebido pouca atenção.
forecaster
Tente ler a documentação das funções específicas que estão fornecendo erros, o ETS e o thetaf não têm a capacidade de lidar com regressores.
forecaster

Respostas:

7

Esta resposta também está relacionada aos pontos 6 e 7 da sua outra pergunta .

Os outliers são entendidos como observações que não são explicadas pelo modelo, portanto, seu papel nas previsões é limitado no sentido de que a presença de novos outliers não será prevista. Tudo o que você precisa fazer é incluir esses valores discrepantes na equação da previsão.

No caso de um outlier aditivo (que afeta uma única observação), a variável que contém esse outlier será simplesmente preenchida com zeros, pois o outlier foi detectado para uma observação na amostra; no caso de uma mudança de nível (uma mudança permanente nos dados), a variável será preenchida com outras para manter a mudança nas previsões.


A seguir, mostro como obter previsões em R sobre um modelo ARIMA com os valores discrepantes detectados por 'tsoutliers'. A chave é definir corretamente o argumento newxregque é passado predict.

(Isso é apenas para ilustrar a resposta à sua pergunta sobre como tratar discrepantes ao fazer previsões, não abordo a questão de saber se o modelo ou as previsões resultantes são a melhor solução.)

require(tsoutliers)
x <- c(
  7.55,  7.63,  7.62,  7.50,  7.47,  7.53,  7.55,  7.47,  7.65,  7.72,  7.78,  7.81,
  7.71,  7.67,  7.85,  7.82,  7.91,  7.91,  8.00,  7.82,  7.90,  7.93,  7.99,  7.93,
  8.46,  8.48,  9.03,  9.43, 11.58, 12.19, 12.23, 11.98, 12.26, 12.31, 12.13, 11.99,
 11.51, 11.75, 11.87, 11.91, 11.87, 11.69, 11.66, 11.23, 11.37, 11.71, 11.88, 11.93,
 11.99, 11.84, 12.33, 12.55, 12.58, 12.67, 12.57, 12.35, 12.30, 12.67, 12.71, 12.63,
 12.60, 12.41, 12.68, 12.48, 12.50, 12.30, 12.39, 12.16, 12.38, 12.36, 12.52, 12.63)
x <- ts(x, frequency=12, start=c(2006,1))
res <- tso(x, types=c("AO","LS","TC"))

# define the variables containing the outliers for
# the observations outside the sample
npred <- 12 # number of periods ahead to forecast 
newxreg <- outliers.effects(res$outliers, length(x) + npred)
newxreg <- ts(newxreg[-seq_along(x),], start = c(2012, 1))

# obtain the forecasts
p <- predict(res$fit, n.ahead=npred, newxreg=newxreg)

# display forecasts
plot(cbind(x, p$pred), plot.type = "single", ylab = "", type = "n", ylim=c(7,13))
lines(x)
lines(p$pred, type = "l", col = "blue")
lines(p$pred + 1.96 * p$se, type = "l", col = "red", lty = 2)  
lines(p$pred - 1.96 * p$se, type = "l", col = "red", lty = 2)  
legend("topleft", legend = c("observed data", 
  "forecasts", "95% confidence bands"), lty = c(1,1,2,2), 
  col = c("black", "blue", "red", "red"), bty = "n")

previsões

Editar

A função predictusada acima retorna previsões baseadas no modelo ARIMA escolhido, ARIMA (2,0,0) armazenado res$fite nos outliers detectados res$outliers. Temos uma equação de modelo como esta:

yt=j=1mωjeuj(B)Eut(tj)+θ(B)ϕ(B)α(B)ϵt,ϵtNEuD(0 0,σ2),

eujjtsoutliersEut

javlacalle
fonte
então o que você fez foi adicionar discrepantes ao argumento "newxreg". Isso é chamado de regressor? Posso saber o uso do regressor? Além disso, através do uso de regressor na função "prever", ele ainda usa o ARIMA? ou é um método de previsão diferente? Muito obrigado por sua ajuda no uso de tsoutliers. = D
Ted
é possível incorporar outliers como regressor para serem usados ​​na previsão em outros modelos também? como modelo estrutural básico, teta, passeio aleatório e etc?
Ted
@Ted Sim, as previsões são baseadas em um modelo ARMA. Eu editei minha resposta com alguns detalhes sobre isso.
Javlacalle
Você pode incorporar variáveis ​​regressivas que contêm efeitos como mudanças de nível, outliers aditivos, ... também em outros modelos, por exemplo, passeio aleatório, modelo estrutural de série temporal, ... Se você está perguntando como usar algum software para fazer isso, provavelmente deve perguntar em outra postagem e considerar se a pergunta é mais adequada para outros sites como o stackoverflow .
Javlacalle
Ah ok. Outra pergunta seria: você sabe se existe uma diferença entre usar previsão e previsão ? Se houver, qual é a diferença
Ted
2

O uso de um software que ajudei a desenvolver um modelo razoável para suas 72 observações incluiria uma transformação de potência (logs), pois a variação do erro é vinculável ao valor esperado. Isso também é bastante óbvio no gráfico original, onde o olho pode detectar uma variação maior no nível mais alto. insira a descrição da imagem aquicom actual.fit/forecast insira a descrição da imagem aquie uma plotagem dos insira a descrição da imagem aquiresíduos finais . Observe os limites de confiança mais realistas, levando em consideração a transformação de poder. Embora essa resposta não use R, ela eleva a fasquia quanto ao que um modelo razoável usando R pode incluir.

IrishStat
fonte