Estimação ARIMA à mão

15

Estou tentando entender como os parâmetros são estimados na modelagem ARIMA / Box Jenkins (BJ). Infelizmente, nenhum dos livros que encontrei descreve o procedimento de estimativa, como o procedimento de estimativa do Log-Likelihood em detalhes. Achei o site / material didático que foi muito útil. A seguir, é apresentada a equação da fonte mencionada acima.

eueu(θ)=-n2registro(2π)-n2registro(σ2)-t=1 1net22σ2

Quero aprender a estimativa do ARIMA / BJ fazendo isso sozinho. Então, usei para escrever um código para estimar o ARMA manualmente. Abaixo está o que eu fiz em R ,RR

  • Simulei o ARMA (1,1)
  • Escreveu a equação acima como uma função
  • Utilizou os dados simulados e a função otim para estimar os parâmetros AR e MA.
  • Também executei o ARIMA no pacote de estatísticas e comparei os parâmetros do ARMA com o que fiz manualmente. Abaixo está a comparação:

Comparação

** Abaixo estão minhas perguntas:

  • Por que há uma pequena diferença entre as variáveis ​​estimadas e calculadas?
  • O ARIMA funciona em backcasts R ou o procedimento de estimativa é diferente do descrito abaixo no meu código?
  • Eu atribui e1 ou erro na observação 1 como 0, está correto?
  • Também existe uma maneira de estimar os limites de confiança das previsões usando o hessian da otimização?

Muito obrigado pela sua ajuda, como sempre.

Abaixo está o código:

## Load Packages

library(stats)
library(forecast)

set.seed(456)


## Simulate Arima
y <- arima.sim(n = 250, list(ar = 0.3, ma = 0.7), mean = 5)
plot(y)

## Optimize Log-Likelihood for ARIMA

n = length(y) ## Count the number of observations
e = rep(1, n) ## Initialize e

logl <- function(mx){

  g <- numeric
  mx <- matrix(mx, ncol = 4)

  mu <- mx[,1] ## Constant Term
  sigma <- mx[,2] 
  rho <- mx[,3] ## AR coeff
  theta <- mx[,4] ## MA coeff

  e[1] = 0 ## Since e1 = 0

  for (t in (2 : n)){
    e[t] = y[t] - mu - rho*y[t-1] - theta*e[t-1]
  }

  ## Maximize Log-Likelihood Function 
  g1 <-  (-((n)/2)*log(2*pi) - ((n)/2)*log(sigma^2+0.000000001) - (1/2)*(1/(sigma^2+0.000000001))*e%*%e)

  ##note: multiplying Log-Likelihood by "-1" in order to maximize in the optimization
  ## This is done becuase Optim function in R can only minimize, "X"ing by -1 we can maximize
  ## also "+"ing by 0.000000001 sigma^2 to avoid divisible by 0
  g <- -1 * g1

  return(g)

}

## Optimize Log-Likelihood
arimopt <- optim(par=c(10,0.6,0.3,0.5), fn=logl, gr = NULL,
                 method = c("L-BFGS-B"),control = list(), hessian = T)
arimopt

############# Output Results###############
ar1_calculated = arimopt$par[3]
ma1_calculated = arimopt$par[4]
sigmasq_calculated = (arimopt$par[2])^2
logl_calculated = arimopt$val
ar1_calculated
ma1_calculated
sigmasq_calculated
logl_calculated

############# Estimate Using Arima###############
est <- arima(y,order=c(1,0,1))
est
previsor
fonte
11
TnTT=n+1 1g1+0.000000001σ
Eu mudei a equação e agora reflete o que está no código. Não tenho certeza de como eu poderia remover +0.000000001 porque isso causará "NaNs" devido ao divisível por 0 e também devido ao problema do log (0)
forecaster
2
Existe o conceito de probabilidade exata. Requer o conhecimento de parâmetros iniciais, como o primeiro valor do erro MA (uma de suas perguntas). As implementações geralmente diferem quanto à forma como tratam os valores iniciais. O que eu costumo fazer é (o que não é mencionado em muitos livros) também é maximizar também a ML com os valores iniciais.
Cagdas Ozgenc
3
Por favor, dê uma olhada no seguinte de Tsay, ele não está cobrindo todos os casos, mas foi bastante útil para mim: faculty.chicagobooth.edu/ruey.tsay/teaching/uts/lec8-08.pdf
Cagdas Ozgenc
11
@CagdasOzgenc, como apontado pelos seus valores iniciais, é a causa da diferença. Posso aceitar seu comentário como resposta se você postar seus comentários como resposta.
Decreto

Respostas:

6

Existe o conceito de probabilidade exata. Requer o conhecimento de parâmetros iniciais, como o primeiro valor do erro MA (uma de suas perguntas). As implementações geralmente diferem quanto à forma como tratam os valores iniciais. O que eu costumo fazer é (o que não é mencionado em muitos livros) também é maximizar também a ML com os valores iniciais.

Por favor, dê uma olhada no seguinte de Tsay, ele não cobre todos os casos, mas foi bastante útil para mim:

http://faculty.chicagobooth.edu/ruey.tsay/teaching/uts/lec8-08.pdf

Cagdas Ozgenc
fonte
3

Você leu a página de ajuda da arimafunção? Aqui está o trecho relevante:

A probabilidade exata é calculada por meio de uma representação em espaço de estado do processo ARIMA, e as inovações e suas variações encontradas por um filtro Kalman. A inicialização do processo diferenciado ARMA utiliza estacionariedade e baseia-se em Gardner et al. (1980). Para um processo diferenciado, os componentes não estacionários recebem um prévio difuso (controlado por kappa). Observações que ainda são controladas pelo difuso anterior (determinado com um ganho de Kalman de pelo menos 1e4) são excluídas dos cálculos de probabilidade. (Isso fornece resultados comparáveis ​​ao arima0 na ausência de valores ausentes, quando as observações excluídas são precisamente aquelas descartadas pela diferenciação.)

Também relevante é um parâmetro method=c("CSS-ML", "ML", "CSS"):

Método de ajuste: probabilidade máxima ou minimizar a soma dos quadrados condicionais. O padrão (a menos que haja valores ausentes) é usar a soma condicional dos quadrados para encontrar os valores iniciais e, em seguida, a probabilidade máxima.

Seus resultados não diferem muito daqueles produzidos por arimafunção, então você definitivamente acertou tudo.

Lembre-se de que, se você quiser comparar os resultados de dois procedimentos de otimização, verifique se os valores iniciais são os mesmos e o mesmo método de otimização é usado, caso contrário, os resultados podem ser diferentes.

mpiktas
fonte