Stima ARIMA a mano


15

Sto cercando di capire come vengono stimati i parametri nella modellazione ARIMA / Box Jenkins (BJ). Sfortunatamente nessuno dei libri che ho incontrato descrive in dettaglio la procedura di stima come la procedura di stima Log-Likelihood. Ho trovato il sito web / materiale didattico molto utile. Di seguito è riportata l'equazione dalla fonte di cui sopra.

LL(θ)=-n2log(2π)-n2log(σ2)-Σt=1net22σ2

Voglio imparare la stima ARIMA / BJ facendola da solo. Quindi ho usato per scrivere un codice per stimare l'ARMA a mano. Di seguito è riportato ciò che ho fatto in R ,RR

  • Ho simulato ARMA (1,1)
  • Ha scritto l'equazione sopra come una funzione
  • Utilizzato i dati simulati e la funzione di ottimizzazione per stimare i parametri AR e MA.
  • Ho anche eseguito l'ARIMA nel pacchetto delle statistiche e confrontato i parametri ARMA con quello che ho fatto a mano. Di seguito è riportato il confronto:

Confronto

** Di seguito sono le mie domande:

  • Perché c'è una leggera differenza tra le variabili stimate e calcolate?
  • ARIMA funziona in backcast R o la procedura di stima differisce da quanto indicato di seguito nel mio codice?
  • Ho assegnato e1 o errore all'osservazione 1 come 0, è corretto?
  • Esiste anche un modo per stimare i limiti di confidenza delle previsioni utilizzando l'assia dell'ottimizzazione?

Grazie mille per il tuo aiuto come sempre.

Di seguito è riportato il codice:

## 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

1
TnTT=n+1g1+0.000000001σ

Ho modificato l'equazione e ora riflette ciò che è nel codice. Non sono sicuro di come avrei potuto rimuovere +0.000000001 perché causerà "NaNs" a causa di divisibile per 0 e anche a causa del problema di log (0)
previsioni

2
C'è il concetto di probabilità esatta. Richiede la conoscenza dei parametri iniziali come il valore del pugno dell'errore MA (una delle tue domande). Le implementazioni di solito differiscono per quanto riguarda il modo in cui trattano i valori iniziali. Quello che di solito faccio (che non è menzionato in molti libri) è anche quello di massimizzare anche i valori iniziali.
Cagdas Ozgenc,


1
@CagdasOzgenc come indicato dai tuoi valori iniziali è la causa della differenza. Posso accettare il tuo commento come risposta se pubblichi i tuoi commenti come risposta.
previsioni

Risposte:


6

C'è il concetto di probabilità esatta. Richiede la conoscenza dei parametri iniziali come il valore del pugno dell'errore MA (una delle tue domande). Le implementazioni di solito differiscono per quanto riguarda il modo in cui trattano i valori iniziali. Quello che faccio di solito (che non è menzionato in molti libri) è anche quello di massimizzare anche i valori iniziali.

Dai un'occhiata a quanto segue da Tsay, non copre tutti i casi, ma è stato molto utile per me:

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


3

Hai letto la pagina di aiuto della arimafunzione? Ecco il brano pertinente:

La probabilità esatta viene calcolata tramite una rappresentazione nello spazio degli stati del processo ARIMA e le innovazioni e la loro varianza rilevate da un filtro Kalman. L'inizializzazione del processo ARMA differenziato utilizza la stazionarietà e si basa su Gardner et al. (1980). Per un processo differenziato ai componenti non stazionari viene dato un precedente diffuso (controllato da kappa). Le osservazioni che sono ancora controllate dal precedente diffuso (determinato avendo un guadagno di Kalman di almeno 1e4) sono escluse dai calcoli della probabilità. (Ciò fornisce risultati comparabili ad arima0 in assenza di valori mancanti, quando le osservazioni escluse sono precisamente quelle lasciate cadere dalla differenziazione.)

Rilevante è anche un parametro method=c("CSS-ML", "ML", "CSS"):

Metodo di adattamento: massima probabilità o minimizzare la somma dei quadrati condizionata. L'impostazione predefinita (a meno che non vi siano valori mancanti) è utilizzare la somma dei quadrati condizionale per trovare i valori iniziali, quindi la massima probabilità.

I tuoi risultati non differiscono molto da quelli prodotti dalla arimafunzione, quindi hai sicuramente ottenuto tutto a posto.

Ricordare che se si desidera confrontare i risultati di due procedure di ottimizzazione, è necessario assicurarsi che i valori iniziali siano gli stessi e venga utilizzato lo stesso metodo di ottimizzazione, altrimenti i risultati potrebbero differire.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.