20 votos

Errores de convergencia MLE con espacio de estados SARIMAX

Estoy intentando encajar un conjunto de datos de media hora de duración de un año en SARIMAX de Python statsmodels. He trazado el correlograma e indica términos AR y MA muy por encima de 5 cada uno, y términos periódicos (diarios) de alrededor de 2. Pero incluso yendo más allá del orden 2 en los términos AR o MA, ya sean estacionales o no estacionales. Pero incluso yendo más allá del orden 2 en los términos AR o MA de tipo estacional o no estacional da un error de convergencia MLE.

C:\Users\<user>\AppData\Local\Continuum\miniconda3\lib\site-packages\statsmodels\base\
model.py:496: ConvergenceWarning: Maximum Likelihood optimization failed to converge. 
Check mle_retvals
  "Check mle_retvals", ConvergenceWarning)

Entiendo que es un modelo no lineal y que no converge, pero no sé cómo proceder. mle_retvals no es una propiedad del SARIMAXResults objeto . Se tarda más de una hora en ajustar todo el conjunto de datos, por lo que me veo obligado a utilizar sólo uno o dos meses de datos cuando itero. Sospecho intuitivamente que esto reduce el orden potencial de los términos que pueden ser acomodados por el ajuste SARIMAX sin problemas de convergencia, aunque no tengo una comprensión profunda de los conceptos aquí.

Otros detalles posiblemente importantes son que faltan muchos valores en todo el conjunto de datos, y estoy confiando en el formulario de espacio de estados para imputar estos valores que faltan.

¿Cómo puedo solucionar los errores de convergencia que obtengo con SARIMAX? ¿Qué aspectos debo comprobar que podrían estar causando los problemas? ¿Suelen solucionarse estos problemas? Gracias.

Actualización: No sé qué ha pasado ahora, pero estoy recibiendo un objeto mle_retvals

{'Hinv': array([[1, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0],
        [0, 0, 1, 0, 0, 0],
        [0, 0, 0, 1, 0, 0],
        [0, 0, 0, 0, 1, 0],
        [0, 0, 0, 0, 0, 1]]),
 'converged': False,
 'fcalls': 44,
 'fopt': 0.22864169058350794,
 'gcalls': 33,
 'gopt': array([ 0.33676031, -0.35390488, -0.01763243, -0.09141768, -0.12037386,
         0.08537955]),
 'warnflag': 2}

Esto fue para order=(2,0,2) y seasonal_order=(1,0,0,48). Y ahora también me doy cuenta de que había una advertencia antes de la ConvergenceWarning

Warning: Desired error not necessarily achieved due to precision loss.

Así que el hessiano es singular; ¿no parece un problema de datos? probablemente esto significa que los datos son de orden inferior al modelo? Pero eso no se refleja en la ACF y PACF de la serie residual interpolada del modelo (1,0,2),(1,0,0,48), donde hay muchos picos por encima del nivel de significación (véase PACF más abajo). Para ello he utilizado el algoritmo BFGS.

PACF showing significant peaks in residuals

Interpolar los datos para eliminar los valores que faltan no cambia nada.

Cambio de algoritmo : Nelder-Mead parecía requerir muchas iteraciones, pero finalmente converge para (2,0,2),(1,0,0,48), ver PACF abajo

PACF showing significant peaks in residuals

24voto

masto Puntos 946

Primero, mle_retvals debe ser un atributo de SARIMAXResults si se construye utilizando un fit para que puedas comprobarlo. ¿Qué obtiene cuando intenta print(res.mle_retvals) ?

En segundo lugar, ¿parecen "aproximados" los parámetros estimados, o no tienen sentido? ¿O son NaN?

Sin saber más: podrías intentar aumentar el número máximo de iteraciones, por ejemplo.

mod = sm.tsa.SARIMAX(endog, order=(p,d,q))
res = mod.fit(maxiter=200)

También puede probar una rutina de optimización diferente (por ejemplo, nm para Nelder-Mead):

res = mod.fit(maxiter=200, method='nm')

Podrías intentar calcular mejores parámetros de arranque de alguna manera. La rutina por defecto puede no ser buena para datos horarios y puede no ser buena con muchos datos perdidos, por ejemplo:

params = [...]
res = mod.fit(start_params=params)

Por último, si no funciona nada más, para ver si son los datos que faltan propiamente dicho ese es el problema, podría intentar imputar los datos (por ejemplo, con Pandas interpolate o algo así) y ver si el modelo converge entonces (los parámetros estimados no se aplicarían al conjunto de datos original, pero al menos podría saber si ese era el problema).

Actualización

Supongo que la función de verosimilitud puede ser bastante plana y/o tener muchos mínimos locales. Eso también podría explicar por qué powell (que es un método sin derivadas) ayuda.

Creo que es probable que el modelo básico SARIMAX sea demasiado "romo" para datos de tan alta frecuencia. Por ejemplo, existen posibilidades de patrones estacionales muy largos (por ejemplo, semanales) que son una carga computacional para el modelo básico, y puede haber efectos de calendario que deben tenerse en cuenta. Creo que estas características dificultarían la interpretación de las autocorrelaciones y podrían hacer que pareciera necesario un gran número de rezagos para ajustar bien el modelo.

Por desgracia, la mejor manera de proceder probablemente sólo pueda determinarse observando los datos y reflexionando sobre ellos. Puede que quiera empezar con modelos SARIMAX sencillos y de bajo orden, y echar un vistazo a los residuos y los diagnósticos asociados (p. ej. res.plot_diagnostics() para empezar).

También puede intentar utilizar un filtro (por ejemplo seasonal_decompose o bk_filter ) para eliminar los efectos cíclicos a distintas frecuencias antes de ajustar el modelo SARIMAX. También puede utilizar la herramienta X13 de la Oficina del Censo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X