MLE proporciona un marco que aborda precisamente esta cuestión. Introduce una función de verosimilitud, que es una función que produce otra función. Esta función de probabilidad toma un vector de parámetros, a menudo denominado theta, y produce una función de densidad de probabilidad (PDF) que depende de theta.
La función de densidad de probabilidad (PDF) de una distribución es una función que toma un valor, x, y devuelve su probabilidad dentro de la distribución. Por lo tanto, las funciones de probabilidad se expresan normalmente de la siguiente manera:
El valor de esta función indica la probabilidad de observar x a partir de la distribución definida por la PDF con theta como parámetros.
La meta
Al construir un modelo de pronóstico, tenemos muestras de datos y un modelo parametrizado, y nuestro objetivo es estimar los parámetros del modelo. En nuestros ejemplos, como los modelos de regresión y MA, estos parámetros son los coeficientes en las fórmulas del modelo respectivo.
El equivalente en MLE es que tenemos observaciones y una PDF para una distribución definida sobre un conjunto de parámetros, theta, que son desconocidos y no directamente observables. Nuestro objetivo es estimar theta.
El enfoque MLE implica encontrar el conjunto de parámetros, theta, que maximiza la función de verosimilitud dados los datos observables, x.
Suponemos que nuestras muestras, x, se extraen de una distribución con una función de probabilidad conocida que depende de un conjunto de parámetros, theta. Esto implica que la probabilidad de observar x bajo esta función de probabilidad es esencialmente 1. Por lo tanto, identificar los valores theta que hacen que nuestro valor de función de probabilidad sea cercano a 1 en nuestras muestras debería revelar los verdaderos valores de los parámetros.
probabilidad condicional
Observe que no hemos hecho ninguna suposición sobre la distribución (PDF) en la que se basa la función de probabilidad. Ahora, supongamos que nuestra observación X es un vector (x_1, x_2, …, x_n). Consideraremos una función de probabilidad que represente la probabilidad de observar x_n condicional a que ya hayamos observado (x_1, x_2, …, x_{n-1}) —
Esto representa la probabilidad de observar solo x_n dados los valores anteriores (y theta, el conjunto de parámetros). Ahora, definimos la función de probabilidad condicional de la siguiente manera:
Más adelante veremos por qué es útil emplear la función de verosimilitud condicional en lugar de la función de verosimilitud exacta.
Logística de probabilidad
En la práctica, suele ser conveniente utilizar el logaritmo natural de la función de verosimilitud, denominada función de log-verosimilitud:
Esto es más conveniente porque a menudo trabajamos con una función de probabilidad que es una función de probabilidad conjunta de variables independientes, que se traduce en el producto de la probabilidad de cada variable. Tomar el logaritmo convierte este producto en una suma.
Para simplificar, demostraré cómo estimar el modelo de media móvil más básico: MA(1):
Aquí, x_t representa las observaciones de la serie temporal, alfa y beta son los parámetros del modelo que se estimarán y los épsilons son ruido aleatorio extraído de una distribución normal con media cero y cierta varianza (sigma), que también se estimará. Por lo tanto, nuestro “theta” es (alfa, beta, sigma), que pretendemos estimar.
Definamos nuestros parámetros y generemos algunos datos sintéticos usando Python:
import pandas as pd
import numpy as npSTD = 3.3
MEAN = 0
ALPHA = 18
BETA = 0.7
N = 1000
df = pd.DataFrame({"et": np.random.normal(loc=MEAN, scale=STD, size=N)})
df["et-1"] = df["et"].shift(1, fill_value=0)
df["xt"] = ALPHA + (BETA*df["et-1"]) + df["et"]
Tenga en cuenta que hemos establecido la desviación estándar de la distribución del error en 3,3, con alfa en 18 y beta en 0,7. Los datos se ven así:
Función de verosimilitud para MA(1)
Nuestro objetivo es construir una función de verosimilitud que aborde la pregunta: ¿qué probabilidad hay de observar nuestra serie de tiempo X=(x_1,…, x_n) suponiendo que sean generadas por el proceso MA(1) descrito anteriormente?
El desafío al calcular esta probabilidad radica en la dependencia mutua entre nuestras muestras, como se desprende del hecho de que tanto x_t como x_{t-1} dependen de e_{t-1), lo que hace que no sea trivial determinar la probabilidad conjunta de observar todas las muestras (lo que se conoce como probabilidad exacta).
Por lo tanto, como se analizó anteriormente, en lugar de calcular la probabilidad exacta, trabajaremos con una probabilidad condicional. Comencemos con la probabilidad de observar una sola muestra dadas todas las muestras anteriores:
Esto es mucho más sencillo de calcular porque:
Todo lo que queda es calcular la probabilidad condicional de observar todas las muestras:
aplicando un logaritmo natural se obtiene:
cuál es la función que debemos maximizar.
Código
Utilizaremos el GenericLikelihoodModel clase de statsmodels para nuestra implementación de estimación MLE. Como se describe en el tutorial En el sitio web de statsmodels, simplemente necesitamos subclasificar esta clase e incluir nuestro cálculo de función de probabilidad:
from scipy import stats
from statsmodels.base.model import GenericLikelihoodModel
import statsmodels.api as smclass MovingAverageMLE(GenericLikelihoodModel):
def initialize(self):
super().initialize()
extra_params_names = ['beta', 'std']
self._set_extra_params_names(extra_params_names)
self.start_params = np.array([0.1, 0.1, 0.1])
def calc_conditional_et(self, intercept, beta):
df = pd.DataFrame({"xt": self.endog})
ets = [0.0]
for i in range(1, len(df)):
ets.append(df.iloc[i]["xt"] - intercept - (beta*ets[i-1]))
return ets
def loglike(self, params):
ets = self.calc_conditional_et(params[0], params[1])
return stats.norm.logpdf(
ets,
scale=params[2],
).sum()
La función loglike es esencial implementar. Dados los valores de parámetros iterados paramsy las variables dependientes (en este caso, las muestras de series de tiempo), que se almacenan como miembros de la clase self.endogcalcula el valor de probabilidad logarítmica condicional, como comentamos anteriormente.
Ahora vamos a crear el modelo y ajustarlo a nuestros datos simulados:
df = sm.add_constant(df) # add intercept for estimation (alpha)
model = MovingAverageMLE(df["xt"], df["const"])
r = model.fit()
r.summary()
y la salida es:
¡Y eso es! Como se demostró, MLE estimó con éxito los parámetros que seleccionamos para la simulación.
La estimación incluso de un modelo MA(1) simple con máxima verosimilitud demuestra el poder de este método, que no sólo nos permite hacer un uso eficiente de nuestros datos sino que también proporciona una base estadística sólida para comprender e interpretar la dinámica de los datos de series de tiempo.
Espero que les haya gustado !
[1] Andrés Lesniewski, Análisis de series temporales2019, Baruch College, Nueva York
[2] Eric Zivot, Estimación de modelos ARMA2005
A menos que se indique lo contrario, todas las imágenes son del autor.