2015-04-08 1 views
2

j'ai observé quelque chose d'étrange en montage d'un modèle ARMA en utilisant la fonction arma {} tseries et arima {} statistiques dans R.Le curieux cas de la modélisation ARIMA en utilisant R

Il y a une différence radicale dans la procédures d'estimation adoptées par les deux fonctions, filtre de Kalman dans arima {stats} par opposition à l'estimation ML dans arma {tseries}. Compte tenu de la différence dans les procédures d'estimation entre les deux fonctions, on ne s'attendrait pas à ce que les résultats soient radicalement différents pour les deux fonctions si nous utilisons la même série temporelle.

Eh bien, semble qu'ils peuvent!

Générez les séries temporelles ci-dessous et ajoutez 2 valeurs aberrantes.

set.seed(1010) 
ts.sim <- abs(arima.sim(list(order = c(1,0,0), ar = 0.7), n = 50)) 
ts.sim[8] <- ts.sim[12]*8 
ts.sim[35] <- ts.sim[32]*8 

Ajuster un modèle ARMA en utilisant la fonction deux.

# Works perfectly fine 
arima(ts.sim, order = c(1,0,0)) 
# Works perfectly fine 
arma(ts.sim, order = c(1,0)) 

Modifier le niveau des timeseries par un facteur de 1 milliard

# Introduce a multiplicative shift 
ts.sim.1 <- ts.sim*1000000000 
options(scipen = 999) 
summary(ts.sim.1) 

Fit un modèle ARMA en utilisant les 2 fonctions:

# Works perfectly fine 
arma(ts.sim.1, order = c(1,0)) 

# Does not work 
arima(ts.sim.1, order = c(1,0,0)) 

## Error in solve.default(res$hessian * n.used, A): system is 
computationally singular: reciprocal condition number = 1.90892e-19 

Où je me suis dit à ce problème était quand Le logiciel SAS a réussi à exécuter la procédure proc x12 pour effectuer le test de saisonnalité, mais la même fonction sur R m'a donné l'erreur ci-dessus. Cela m'a vraiment fait réfléchir et regarder les résultats de SAS avec scepticisme, mais il se pourrait que ce soit quelque chose à voir avec l'arima {stats}.

Quelqu'un peut-il essayer d'expliquer la raison de l'erreur ci-dessus qui nous limite à adapter un modèle en utilisant arima {stats}?

Répondre

8

Le problème se pose dans la fonction stats::arima lors du calcul de la matrice de covariance des coefficients. Le code n'est pas très robuste aux effets d'échelle en raison de grand nombre, et les accidents dans le calcul de l'inverse de la matrice hessienne dans cette ligne:

var <- crossprod(A, solve(res$hessian * n.used, A)) 

Le problème est évité en escaladant simplement les données. Par exemple

arima(ts.sim.1/100, order = c(1,0,0)) 

fonctionnera.

La fonction tseries::arma ne fonctionne cependant pas "parfaitement bien". Il renvoie un message d'avertissement:

En arma(ts.sim.1, order = c(1, 0)):-hessois semidéfinie négative

Cela peut aussi être évité par mise à l'échelle:

arma(ts.sim.1/1000, order = c(1,0)) 
+0

Merci pour votre commentaire Rob. La raison pour laquelle j'ai dit que les résultats d'arma() étaient parfaitement bien était que les coefficients mon estimation bêta reste à peu près le même et mon interception augmente d'un milliard, ce qui est logique intuitivement.Vous avez raison, la mise à l'échelle corrige le problème que nous voyons dans la fonction arima() mais il est toujours étonnant de constater que l'estimation ne s'est même pas produite avec arima(). – Shreyes