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:

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:

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.