Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Previsão de uma série temporal usando Monte Carlo

0 votos
17 visitas
perguntada Jul 5 em Estatística por Pedro Campelo (21 pontos)  

Discuta as propriedades de previsão ótimas tendo como
base simulações e o Capítulo 4 do livro do Hamilton - Time Series
Analysis. Basicamente use Monte Carlo para gerar séries temporais
lineares e discuta empiricamente as propriedades apresentadas no
livro do Hamilton, nesse conjunto de slides e no Livro Elements of
Forecasting - Diebold.

Compartilhe

1 Resposta

0 votos
respondida Jul 5 por Pedro Campelo (21 pontos)  
editado Jul 8 por Pedro Campelo

Bons modelos de previsão devem:

  • Ser não viesados e com média nula;
  • Ter erros de um passo a frente modelados por um ruído branco;
  • Ter erros de h passos a frente modelados por MA(h);
  • Ter variâncias de h passos a frente não decrescentes que convergem
    para a variância do processo que deseja-se prever;
  • Ser ortogonais a informacão disponvel;

Para comparar dois modelos de previsão, podemos comparar:

  • Erro médio, variância do erro, erro médio quadrático, erro médio
    absoluto;
  • Distribuicão acumulada dos erros;
  • Usar o Diebold-Mariano;

Para este exercício, criei a série y baseada nos seus valores passados, de modo que:

Yt = -0.5 Yt-1 + 0.25 Yt-3 - 0.125 Yt-5 + 0.0625 Yt-7 + Ut,
onde Ut ~ N(0,1)

E assim, construí 4 modelos de previsão: Ridge, Elastic-Net, Lasso e Adalasso. Para comparar estes modelos, verifiquei quais parâmetros chegaram mais perto dos parâmetros da série inicialmente criada. O código foi desenvolvido no R:

#Construir a série y
T=1000
lags = c(1,3,5,7)     #defininado as variáveis y(p) diferente de zero
set.seed(1)
u = rnorm(T)
y = rep(NA,T)
y[1:max(lags)] = 0

b = c(-0.5)^(1:length(lags))
  for(i in (max(lags)+1):T){
    y[i] = sum(b*y[i-lags])+u[i]
}
y= y[-c(1:max(lags))]

Criar a matriz dos regressores, onde os possíveis regressores são os 10 valores passados de Y. Isto é, x1 = Yt-1, x2 = Yt-2, ... , x10 = Yt-10:

#Construir as séries de X
Y = embed(y,11)
y = Y[,1]
x = Y[,-1]

Importar a biblioteca "glmeet" para rodar os modelos de previsão:

install.packages("glmnet")
library(glmnet)

lasso = glmnet(x,y)
plot(lasso,xvar="lambda")

A figura abaixo mostra o valor e o número de coeficientes se aproximando de zero a medida que aumentamos o fator de penalização (log(lambda)). Sabemos que o modelo é criado por 4 regressores passados (Yt-1, Yt-3, Yt-5, Yt-7), então o log(lambda ótimo) é aproximadamente -3:

A imagem será apresentada aqui.

Estimar o LASSO e selecionar o melhor modelo por cross-validation:

lasso_cv = cv.glmnet(x,y)
plot(lasso_cv)

Pode-se observar, também, que a medida que aumentamos muito o fator de penalidade, mais coeficientes serão zerados e o Erro Quadrático Médio aumenta de forma exponencial. O log(lambda ótimo) apresenta um baixo EQM:

A imagem será apresentada aqui.

Selecionar modelo via BIC:

library(devtools) 
lasso_bic = ic.glmnet(x,y)

Coeficientes dos modelos:

-Ridge:

ridge = ic.glmnet(x,y,alpha=0)
round(coef(ridge),4)

(Intercept)          V1          V2          V3          V4          V5          V6          V7 
    -0.0023     -0.4698     -0.0012      0.2225     -0.0099     -0.1115      0.0098      0.0533 
         V8          V9         V10 
    -0.0048     -0.0012      0.0012 

-Elastic-Net:

elnet = ic.glmnet(x,y,alpha=0.5)
round(coef(elnet),4)

   (Intercept)          V1          V2          V3          V4          V5          V6          V7 
        -0.0023     -0.4948     -0.0048      0.2384      0.0000     -0.1197      0.0000      0.0552 
             V8          V9         V10 
         0.0000      0.0000      0.0000 

-Lasso:

LASSO_coef = coef(lasso_bic)[-1]
penalty = abs(LASSO_coef+0.01)^(-1)
round(LASSO_coef,4)

    V1      V2      V3      V4      V5      V6      V7      V8      V9     V10 
-0.4958 -0.0050  0.2388  0.0000 -0.1201  0.0000  0.0554  0.0000  0.0000  0.0000 

-adaLasso:

adaLASSO = ic.glmnet(x,y, penalty.factor = penalty)
round(coef(adaLASSO)[-1],4)

    V1      V2      V3      V4      V5      V6      V7      V8      V9     V10 
-0.4951  0.0000  0.2419  0.0000 -0.1211  0.0000  0.0550  0.0000  0.0000  0.0000 

Pode-se observar que o Ridge apresenta uma maior dificuldade de zerar os coeficientes, devido a sua penalização quadrática. O Elastic-Net e o Lasso também não conseguiram zerar o Yt-2. Porém, o adaLasso penaliza os coeficientes próximos de zero que o Lasso não conseguiu zerar, e assim, este modelo zera os parâmetros corretos. Deste modo, o adaLasso apresentou os coeficientes mais próximos dos reais.

comentou Jul 5 por Felipe Carneiro (26 pontos)  
Pedro, ótima implementação.

Você poderia também observar a capacidade preditiva de cada modelo num processo de validação "out-of-sample". Daí olhando, por exemplo, pro MSE e pro R², você conseguiria compará-los de uma maneira mais adequada.
...