Estimación de ARIMA a mano

15

Estoy tratando de entender cómo se estiman los parámetros en el modelado ARIMA / Box Jenkins (BJ). Desafortunadamente, ninguno de los libros que he encontrado describe el procedimiento de estimación como el procedimiento de estimación de probabilidad de registro en detalle. Encontré el sitio web / material didáctico que fue muy útil. La siguiente es la ecuación de la fuente mencionada anteriormente.

LL(θ)=-norte2Iniciar sesión(2π)-norte2Iniciar sesión(σ2)-t=1nortemit22σ2

Quiero aprender la estimación ARIMA / BJ haciéndolo yo mismo. Así que usé para escribir un código para estimar ARMA a mano. A continuación se muestra lo que hice en R ,RR

  • Simulé ARMA (1,1)
  • Escribió la ecuación anterior como una función
  • Usó los datos simulados y la función de optimización para estimar los parámetros AR y MA.
  • También ejecuté el ARIMA en el paquete de estadísticas y comparé los parámetros ARMA de lo que hice a mano. A continuación se muestra la comparación:

Comparación

** A continuación están mis preguntas:

  • ¿Por qué hay una ligera diferencia entre las variables estimadas y calculadas?
  • ¿Funciona ARIMA en retransmisiones R o el procedimiento de estimación es diferente al que se describe a continuación en mi código?
  • He asignado e1 o error en la observación 1 como 0, ¿es esto correcto?
  • ¿También hay una manera de estimar los límites de confianza de los pronósticos utilizando el hessian de la optimización?

Muchas gracias por su ayuda como siempre.

Debajo está el 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
pronosticador
fuente
1
TnorteTT=norte+1g1+0.000000001σ
He cambiado la ecuación y ahora refleja lo que está en el código. No estoy seguro de cómo podría eliminar +0.000000001 porque causará "NaNs" debido a que es divisible por 0 y también debido al problema de log (0)
pronosticador
2
Existe el concepto de probabilidad exacta. Requiere el conocimiento de parámetros iniciales como el primer valor del error de MA (una de sus preguntas). Las implementaciones generalmente difieren con respecto a cómo tratan los valores iniciales. Lo que suelo hacer es (que no se menciona en muchos libros) es también maximizar ML wrt los valores iniciales.
Cagdas Ozgenc
3
Eche un vistazo a lo siguiente de Tsay, no cubre todos los casos, pero fue muy útil para mí: faculty.chicagobooth.edu/ruey.tsay/teaching/uts/lec8-08.pdf
Cagdas Ozgenc
1
@CagdasOzgenc como lo señalaron sus valores iniciales es la causa de la diferencia. Puedo aceptar su comentario como respuesta si publica sus comentarios como respuesta.
pronosticador

Respuestas:

6

Existe el concepto de probabilidad exacta. Requiere el conocimiento de parámetros iniciales como el primer valor del error de MA (una de sus preguntas). Las implementaciones generalmente difieren con respecto a cómo tratan los valores iniciales. Lo que suelo hacer es (que no se menciona en muchos libros) es también maximizar ML wrt los valores iniciales.

Eche un vistazo a lo siguiente de Tsay, no cubre todos los casos, pero fue muy útil para mí:

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

Cagdas Ozgenc
fuente
3

¿Leíste la página de ayuda de la arimafunción? Aquí está el extracto relevante:

La probabilidad exacta se calcula a través de una representación en el espacio de estado del proceso ARIMA, y las innovaciones y su varianza encontradas por un filtro de Kalman. La inicialización del proceso ARMA diferenciado utiliza la estacionariedad y se basa en Gardner et al. (1980) Para un proceso diferenciado, los componentes no estacionarios reciben un previo difuso (controlado por kappa). Las observaciones que todavía están controladas por el previo difuso (determinado por tener una ganancia de Kalman de al menos 1e4) se excluyen de los cálculos de probabilidad. (Esto da resultados comparables a arima0 en ausencia de valores faltantes, cuando las observaciones excluidas son precisamente las eliminadas por la diferenciación).

También es relevante un parámetro method=c("CSS-ML", "ML", "CSS"):

Método de ajuste: máxima probabilidad o minimizar la suma de cuadrados condicional. El valor predeterminado (a menos que falten valores) es usar la suma de cuadrados condicional para encontrar los valores iniciales, luego la máxima probabilidad.

Sus resultados no difieren mucho de los producidos por la arimafunción, por lo que definitivamente lo hizo todo bien.

Recuerde que si desea comparar los resultados de dos procedimientos de optimización, debe asegurarse de que los valores iniciales son los mismos y se utiliza el mismo método de optimización; de lo contrario, los resultados podrían diferir.

mpiktas
fuente