Sección 6 Estimación por máxima verosimilitud
Los ejemplos que hemos visto han sido todos de estimadores plug-in (o por sustitución): si queremos saber una cantidad poblacional, y tenemos una muestra dada, entonces calculamos la estadística de interés como si la muestra fuera la población. Por ejemplo, para estimar la mediana poblacional usamos la mediana muestral, si queremos estimar la media poblacional usamos la media muestral, y así sucesivamente. Estos estimadores usualmente dan resultados razonables (pero hay que checar usando muestra bootstraps, por ejemplo, y pensar lo que estamos haciendo).
Cuando sabemos más acerca de la población y usamos un modelo teórico es posible hacer más: dependiendo de qué cantidades se quieren estimar, podemos construir estimadores que sean óptimos en algún sentido siempre y cuando se cumplan los supuestos teóricos, como veremos ahora.
Por ejemplo: ¿deberíamos estimar el centro de una distribución simétrica con la media o con la mediana, o quizá con una media recortada?
En esta parte construiremos la teoría básica de estimación cuando trabajamos con modelos teóricos conocidos. El objetivo es entender las ideas básicas de estos procedimientos, y cómo evaluar sus resultados.
Recordatorio: las ventajas de usar modelos teóricos para describir distribuciones de datos está en que es posible comprimir más eficientemente la información, es posible construir modelos más complejos juntando varios de estos modelos y de sus dependencias, y de que es posible hacer más teoría útil que nos guíe. La desventaja es que es necesario que esos supuestos teóricos sean razonables.
Introducción a estimación por máxima verosimilitud
Uno de los procedimientos más estándar en esta situación es el método de máxima verosimilitud. Los estimadores de máxima verosimilitud tienen propiedades convenientes, y dan en general resultados razonables siempre y cuando los supuestos sean razonables.
Máxima verosimilitud es un proceso intuitivo, y consiste en aprender o estimar valores de parámetros desconocidos suponiendo para los datos su explicación más probable. Para esto, usando supuestos y modelos, requeriremos calcular la probabilidad de un conjunto de observaciones.
Ejemplo. Adaptado de (Chihara and Hesterberg 2018). Supongamos que una máquina produce dos tipos de bolsas de 25 galletas: la mitad de las veces produce una bolsa con 5 galletas de avena y 20 de chispas de chocolate, y la otra mitad produce bolsas con 23 galletas de avena y 2 de chispas de chocolate.
Tomamos una bolsa, y no sabemos qué tipo de bolsa es (parámetro desconocido). Extraemos al azar una de las galletas, y es de chispas de chocolate (observación).
Por máxima verosimilitud, inferimos que la bolsa que estamos considerando tiene 5 galletas de avena. Esto es porque es más probable observar una galleta de chispas en las bolsas que contienen 5 galletas de avena que en las bolsas que contienen 23 galletas de avena. Podemos cuantificar la probabilidad que “acertemos” en nuestra inferencia.
Cómo se aprecia en el ejemplo anterior, el esquema general es:
- Existe un proceso del que podemos obtener observaciones de algún sistema o población real.
- Tenemos un modelo probabilístico que dice cómo se producen esas observaciones a partir del sistema o población real.
- Usualmente este modelo tiene algunas cantidades que no conocemos, que rigen el proceso y cómo se relaciona el proceso con las observaciones.
Nuestro propósito es:
- Extraemos observaciones del proceso
\[x_1, x_2, \ldots, x_n.\] - Queremos aprender de los parámetros desconocidos del proceso para calcular cantidades de interés acerca del sistema o población real
En principio, los modelos que consideramos pueden ser complicados y tener varias partes o parámetros. Veamos primero un ejemplo clásico con un solo parámetro, y cómo lo resolveríamos usando máxima verosimilitud.
Nota: Cuando decimos muestra en general nos referimos a observaciones independientes obtenidas del mismo proceso (ver la sección de distribución de muestreo) para ver qué significa que sea independientes. Este esquema es un supuesto que simplifica mucho los cálculos, como discutimos antes. Muchas veces este supuesto sale del diseño de la muestra o del estudio, pero en todo caso es importante considerar si es razonable o no para nuestro problema particular.
Denotemos por \(f(x; \theta)\) la función de densidad para una variable aleatoria continua con párametro asociado \(\theta.\) Denotamos por \(X_1, \ldots, X_n,\) una muestra aleatoria de \(n\) observaciones de esta distribución y por \(x_1, \ldots, x_n\) los valores observados de esta muestra aleatoria.
Ejemplo. Supongamos que queremos saber qué proporción de registros de una base de datos tiene algún error menor de captura. No podemos revisar todos los registros, así que tomamos una muestra de 8 registros, escogiendo uno por uno al azar de manera independiente. Revisamos los 8 registros, y obtenemos los siguientes datos:
\[x_1 = 0, x_2 = 1, x_3 = 0, x_4 = 0, x_5 =1, x_6 =0, x_7 =0, x_8 =0\]
donde 1 indica un error menor. Encontramos dos errores menores. ¿Cómo estimamos el número de registros con errores leves en la base de datos?
Ya sabemos una respuesta razonable para nuestro estimador puntual, que sería \(\hat{p}=2/8=0.25\). Veamos cómo se obtendría por máxima verosimilitud.
Según el proceso con el que se construyó la muestra, debemos dar una probabilidad de observar los 2 errores en 8 registros. Supongamos que en realidad existe una proporción \(p\) de que un registro tenga un error. Entonces calculamos
Probabilidad de observar la muestra:
\[P(X_1 = 0, X_2 = 1, X_3 = 0, X_4 = 0, X_5 =1, X_6 =0, X_7 =0, X_8 =0)\]
es igual a
\[P(X_1 = 0)P(X_2 = 1)P(X_3 = 0)P( X_4 = 0)P(X_5 =1)P(X_6 =0)P(X_7 =0)P(X_8 =0)\] pues la probabilidad de que cada observación sea 0 o 1 no depende de las observaciones restantes (la muestra se extrajo de manera independiente).
Esta última cantidad tiene un parámetro que no conocemos: la proporcion \(p\) de registros con errores. Así que lo denotamos como una cantidad desconocida \(p\). Nótese entonces que \(P(X_2=1) = p\), \(P(X_3=0) = 1-p\) y así sucesivamente, así que la cantidad de arriba es igual a
\[(1-p)p(1-p)(1-p)p(1-p)(1-p)(1-p) \]
que se simplifica a
\[ \mathcal{L}(p) = p^2(1-p)^6\]
Ahora la idea es encontrar la p que maximiza la probabilidad de lo que observamos. En este caso se puede hacer con cálculo, pero vamos a ver una gráfica de esta función y cómo resolverla de manera numérica.
<- function(p){
verosimilitud ^2 * (1-p)^6
p
}<- tibble(x = seq(0,1, 0.001)) %>% mutate(prob = map_dbl(x, verosimilitud))
dat_verosim ggplot(dat_verosim, aes(x = x, y = prob)) + geom_line() +
geom_vline(xintercept = 0.25, color = "red") +
xlab("p")
Nótese que esta gráfica:
- Depende de los datos, que pensamos fijos.
- Cuando cambiamos la \(p\), la probabilidad de observar la muestra cambia. Nos interesa ver las regiones donde la probabilidad es relativamente alta.
- El máximo está en 0.25.
- Así que el estimador de máxima verosimilitud es \(\hat{p} = 0.25\), que es también el estimador usual de plugin en este caso.
Para uniformizar la notación con el caso continuo que veremos más adelante, usaremos la notación
\[P(X=x) = f(x)\] donde \(f\) es la función de densidad (en este caso, función de masa de probabilidad) de \(X\). Si esta función depende de un parámetro, escribimos \[f(x ;\theta)\]
Definición. Sean \(X_1, \ldots, X_n\) una muestra de una densidad \(f(x; \theta)\) y sean \(x_1,x_2,\ldots, x_n\) los valores observados.
La función de verosimilitud del párametro de interés \(\theta\) está definida por \[\begin{align} \mathcal{L}(\theta; x_1, \ldots, x_n) = \prod_{i = 1}^n f(x_i; \theta). \end{align}\]
Esta función nos dice qué tan creible es el valor del parámetro \(\theta\) dada la muestra observada. A veces también la denotamos por \(\mathcal{L}_n(\theta)\).
Ahora definimos qué es un estimador de máxima verosimilitud.
Definición. Un estimador de máxima verosimilitud lo denotamos por \(\hat \theta_{\textsf{MLE}}\) y es un valor que satisface \[\begin{align} \hat \theta_{\textsf{MLE}} = \underset{\theta \, \in \, \Theta}{\arg\max}\, \mathcal{L}(\theta; x_1, \ldots, x_n), \end{align}\] donde \(\Theta\) denota el espacio parametral. Es decir, el espacio válido de búsqueda congruente con la definición del modelo.
- Considera el caso de una normal con media y varianza desconocidas. ¿Cuáles son los espacios parametrales para efectuar \(\mathsf{MLE}\)?
- Considera el caso de una Binomial con parámetro \(p\) desconocidos. ¿Cuál es el espacio parametral para la búsqueda del \(\mathsf{MLE}\)?
Obsérvese que para construir la verosimilitud y en consecuencia buscar por estimadores de máxima verosimlitud necesitamos:
- Un modelo teórico de cómo es la población con parámetros e
- Información de cómo se extrajo la muestra,
y entonces podemos resolver nuestro problema de estimación convirtiéndolo en uno de optimización.
Probamos esta idea con un proceso más complejo.
Ejemplo. Supongamos que una máquina puede estar funcionando correctamente o no en cada corrida. Cada corrida se producen 500 productos, y se muestrean 10 para detectar defectos. Cuando la máquina funciona correctamente, la tasa de defectos es de 3%. Cuando la máquina no está funcionando correctamente la tasa de defectos es de 20%
Supongamos que escogemos al azar 11 corridas, y obervamos los siguientes número de defectuosos:
\[1, 0, 0, 3 ,0, 0, 0, 2, 1, 0, 0\]
La pregunta es: ¿qué porcentaje del tiempo la máquina está funcionando correctamente?
Primero pensemos en una corrida. La probabilidad de observar una sucesión particular de \(r\) defectos es
\[0.03^r(0.97)^{(10-r)}\] cuando la máquina está funcionando correctamente.
Si la máquina está fallando, la misma probabilidad es
\[0.2^r(0.8)^{(10-r)}.\]
Ahora supongamos que la máquina trabaja correctamente en una proporción \(p\) de las corridas. Entonces la probabilidad de observar \(r\) fallas se calcula promediando (probabilidad total) sobre las probabilidades de que la máquina esté funcionando bien o no:
\[0.03^r(0.97)^{(10-r)}p + 0.2^r(0.8)^{(10-r)}(1-p)\] Y esta es nuestra función de verosimilitud para una observación.
Suponemos que las \(r_1,r_2, \ldots, r_{11}\) observaciones son independientes (por ejemplo, después de cada corrida la máquina se prepara de una manera estándar, y es como si el proceso comenzara otra vez). Entonces tenemos que multiplicar estas probabilidades para cada observación \(r_1\):
# creamos la función de verosimilitud con los datos observados como dados
<- function(p) {
verosim <- c(1, 2, 0, 3, 0, 0, 0, 2, 1, 0, 3)
r <- 0.03^r*(0.97)^(10-r)
q_func <- 0.2^r*(0.8)^(10-r)
q_falla prod(p * q_func + (1 - p) * q_falla)
}
verosim(0.1)
# Una alternativa que nos da más flexibilidad para generar la función de
# verosimilitud, es crear una función que recibe los datos observados y nos
# regresa la función de verosimilitud correspondiente
# Entonces, cal_verosim es una función que regresa una función
<- function(r){
calc_verosim <- 0.03 ^ r * (0.97) ^ (10 - r)
q_func <- 0.2 ^ r * (0.8) ^ (10 - r)
q_falla function(p){
#nota: esta no es la mejor manera de calcularlo, hay
# que usar logaritmos.
prod(p * q_func + (1 - p) * q_falla)
}
}<- calc_verosim(r = c(1, 0, 0, 3, 0, 0, 0, 2, 1, 0, 0))
verosim verosim(0.1)
## [1] 2.692087e-14
<- tibble(x = seq(0, 1, 0.001)) %>%
dat_verosim mutate(prob = map_dbl(x, verosim))
ggplot(dat_verosim, aes(x = x, y = prob)) + geom_line() +
geom_vline(xintercept = 0.773, color = "red") +
xlab("prop funcionado")
Y nuestra estimación puntual sería de alrededor de 80%.
Máxima verosimilitud para observaciones continuas
Cuando las observaciones \(x_1,\ldots, x_n\) provienen de una distribución continua, no tiene sentido considerar \(P(X = x_i)\), pues siempre es igual a cero.
Sin embargo, podemos escribir para pequeños valores \(\epsilon \ll 1\) \[\begin{align} P(x - \epsilon < X < x + \epsilon | \theta) = \int_{x - \epsilon}^{x + \epsilon} f(t; \theta) \, \text{d} t \approx 2 \epsilon f(x; \theta), \end{align}\] donde \(f(x; \theta)\) es la función de densidad de \(X.\) Por lo tanto, \[\begin{align} \begin{split} P&(x_1 - \epsilon < X_1 < x_1 + \epsilon, \ldots, x_n - \epsilon < X_n < x_n + \epsilon | \theta) \\ &= \prod_{i = 1}^n P(x_i - \epsilon < X_i < x_i + \epsilon | \theta) \\ &= \prod_{i = 1}^n 2 \epsilon f(x_i; \theta) = (2\epsilon)^n \prod_{i = 1}^n f(x_i; \theta). \end{split} \end{align}\]
Notemos que si \(\epsilon \rightarrow 0\) la ecuación rápidamente converge a cero. Pero para pequeños valores de \(\epsilon\) la ecuación que nos interesa es proporcional a \(\prod_{i = 1}^n f(x_i; \theta).\)
De esta forma, nuestra definición de máxima verosimilitud y estimadores de máxima verosimilitud es la misma para el caso continuo (verifica las definiciones de la sección anterior).
Ejemplo. Supongamos que tenemos una muestra \(x_1\ldots, x_n\) extraidas de una distribución exponencial con tasa \(\lambda>0\) donde no conocemos \(\lambda\). ¿Cuál es el estimador de máxima verosimilitud de \(\lambda\)?
Para \(\lambda>0\), tenemos que
\[{\mathcal L}(\lambda) = \prod_{i=1}^n \lambda e^{-\lambda x_i}\] de modo que
\[{\mathcal L}(\lambda) = \lambda^n e^{-\lambda \sum_{i=1}^nx_i} = \lambda^n e^{-n\lambda\bar{x}} = e^{n(\log\lambda - \lambda\bar{x})}\] Que podemos maximizar usando cálculo para obtener \(\hat{\lambda}_{\mathsf{ML}} = \frac{1}{\bar{x}}\) (demuéstralo). Discute por qué esto es intuitivamente razonable: ¿cuál es el valor esperado de una exponencial con parámetro \(\lambda\)?
Aspectos numéricos
Encontrar el estimador de máxima verosimilitud (\(\textsf{MLE}\)) es automático en la mayoría de los casos. En teoría, podemos reutilizar la misma rutina numérica para encontrar el estimador sin ninguna ayuda de la analista. Esto contrasta con otras técnicas de estimación en donde se requieren cálculos y manipulación de ecuaciones.
Sin embargo, hay situaciones que se pueden evitar de manera general. Por ejemplo, cuando calculamos la verosimilitud arriba, nótese que estamos multiplicando números que pueden ser muy chicos (por ejemplo \(p^6\), etc). Esto puede producir desbordes numéricos fácilmente. Por ejemplo para un tamaño de muestra de 1000, podríamos tener que calcular
<- 0.1
p <- (p ^ 800)*(1-p)^200
proba proba
## [1] 0
En estos casos, es mejor hacer los cálculos en escala logarítmica. El logaritmo convierte productos en sumas, y baja exponentes multiplicando. Si calculamos en escala logaritmica la cantidad de arriba, no tenemos problema:
<- 800 * log(p) + 200 * log(1-p)
log_proba log_proba
## [1] -1863.14
Ahora notemos que
- Maximizar la verosimilitud es lo mismo que maximizar la log-verosimilitud, pues el logaritmo es una función creciente. Si \(x_{\max}\) es el máximo de \(f\), tenemos que \(f(x_{\max})>f(x)\) para cualquier \(x\), entonces tomando logaritmo, \[\log(f(x_{max}))>\log(f(x)),\] para cualquier \(x.\) Pues el logaritmo respeta la desigualdad por ser creciente.
- Usualmente usamos la log-verosimilitud para encontrar el estimador de máxima verosimilitud.
- Hay razónes teóricas y de interpretación por las que también es conveniente hacer esto.
Definición. La log-verosimilitud la denotamos usualmente por \[\ell_n(\theta) = \log \left(\mathcal{L}_n(\theta)\right),\] donde hemos suprimido la dependencia en la muestra por conveniencia.
Ejemplo. En nuestro primer ejemplo,
<- function(p){
log_verosimilitud 2*log(p) + 6*log(1-p)
}<- tibble(x = seq(0,1, 0.01)) %>% mutate(log_prob = map_dbl(x, log_verosimilitud))
dat_verosim ggplot(dat_verosim, aes(x = x, y = log_prob)) + geom_line() +
geom_vline(xintercept = 0.25, color = "red") +
xlab("p")
Obtenemos el mismo máximo. Podemos incluso resolver numéricamente:
<- optim(p = 0.5, log_verosimilitud, control = list(fnscale = -1),
solucion method = "Brent", lower = 0, upper = 1)
$par solucion
## [1] 0.25
Y en nuestro segundo ejemplo:
<- function(r){
calc_log_verosim <- 0.03^r*(0.97)^(10-r)
q_func <- 0.2^r*(0.8)^(10-r)
q_falla function(p){
#nota: esta no es la mejor manera de calcularlo, hay
# que usar logaritmos.
sum(log(p * q_func + (1 - p) * q_falla))
}
}<- calc_log_verosim(c(1, 0, 0, 3, 0, 0, 0, 2, 1, 0, 0))
log_verosim log_verosim(0.1)
## [1] -31.24587
<- optim(p = 0.2, log_verosim, control = list(fnscale = -1),
solucion method = "Brent", lower = 0, upper = 1)
$par solucion
## [1] 0.7733766
$convergence solucion
## [1] 0
<- tibble(x = seq(0,1, 0.001)) %>% mutate(log_verosimilitud = map_dbl(x, log_verosim))
dat_verosim ggplot(dat_verosim, aes(x = x, y = log_verosimilitud)) + geom_line() +
geom_vline(xintercept = 0.775, color = "red") +
xlab("prop funcionado")
Nótese que la verosimilitud la consideramos función de los parámetros, donde los datos están fijos.
Podemos construir una función que genera la función de verosimilitud dependiendo de los datos. En nuestro primer ejemplo de muestras de registros erróneos, podríamos construir una función que genera la log verosimilitud dependiendo del tamaño de muestra y del número de errores encontrado:
<- function(n, n_err){
construir_log_verosim # n es tamaño de muestra
# n_err el número de errores detectados (datos)
<- n - n_err
n_corr <- function(p){
log_verosim * log(p) + n_corr * log(1-p)
n_err
} }
Cuando fijamos \(n\) y \(n_{\textsf{err}}\), esta función genera otra función, la log verosimilitud, que es la que queremos optimizar.
Supongamos entonces que sacamos 20 registros al azar y observamos 10 incorrectos. La función de verosimilitud es
<- construir_log_verosim(20, 10) log_vero
tibble(x = seq(0,1,0.001)) %>%
mutate(log_ver = log_vero(x)) %>%
ggplot(aes(x = x, y = log_ver)) +
geom_line() +
geom_vline(xintercept = 0.5, color = 'red')
Ejemplo. Supongamos que en una población de transacciones hay un porcentaje \(p\) (desconocido) que son fraudulentas. Tenemos un sistema de clasificación humana que que marca transacciones como sospechosas. Con este sistema hemos medido que la proporción de transacciones normales que son marcadas como sospechosas es de 0.1%, y que la proporción de transacciones fraudulentas que son marcadas como sospechosas es de 98%. Supongamos que extraemos una muestra de 2000 transacciones, de manera que todas ellas tiene la misma probabilidad de ser fraudulentas. El sistema de clasificación marca 4 transacciones como sospechosas ¿Cómo estimamos la proporción de transacciones fraudulentas en la población?
Solución: sea \(p\) la proporción de transacciones fraudulentas. Entonces la probabilidad de que una transacción sea marcada como sospechosa es (proba total):
\[0.98p + 0.001(1-p)\]
Pues tenemos que contar 98% de la proporción \(p\) de fraudulentas (correctamente detectadas) más 0.1% de la proporción \((1-p)\) de fraudulentas. Escribimos entonces nuestra función de verosimilitud
<- function(n, n_sosp){
crear_log_verosim # devolver la función log verosimilitud
<- function(pct){
log_verosimilitud_pct # sup que pct es la proporcentaje de fraudes,
# que es el parámetro que queremos estimar
<- 0.98 * pct / 100 + 0.001 * (1 - pct / 100)
prob_sosp <- n_sosp * log(prob_sosp) + (n - n_sosp) * log(1- prob_sosp)
log_prob
log_prob
}
log_verosimilitud_pct }
La verosimilitud es una función de \(p\).
<- crear_log_verosim(n = 2000, n_sosp = 4) log_verosim
A continuación la mostramos de manera gráfica.
No se ve muy claro dónde ocurre el máximo, pero podemos ampliar cerca de cero la misma gráfica:
- Vemos que alrededor de 0.1% maximiza la probabilidad de haber observado 4 transacciones sospechosas.
- Notamos sin embargo que varios valores alrededor de este valor tienen probabilidad similar, así que también son consistentes con los datos (por ejemplo, valores como 0.05 o 0.15 tienen probabilidad similar). Tendremos que considerar esto para evaluar la incertidumbre en nuestra estimación.
- Obsérvese adicionalmente que si no tomáramos en cuenta las probabilidades de falsos negativos y falsos positivos la estimación simple daría \(4/2000 = 0.002\) (0.2%), que es dos veces más grande que nuestra estimación puntual por máxima verosimilitud.
Ejemplo. Este es un ejemplo donde mostramos que cuando el soporte de las densidades teóricas es acotado hay que tener cuidado en la definición de la verosimilitud. En este caso, el soporte de la variable aleatoria es el párametro de interés. Supongamos que nuestros datos son generados por medio de una distribución uniforme en el intervalo \([0,b].\) Contamos con una muestra de \(n\) observaciones generadas de manera independiente \(X_i \sim U[0,b]\) para \(i= 1, \ldots, n.\) Sin embargo, no conocemos el valor de \(b\).
¿Cómo es la función de log verosimilitud \({\mathcal L}_n(b)\) para este caso? Nótese que cuando el parámetro \(b\) es menor que alguna \(x_i\), tenemos que \({\mathcal L}_n(b) = 0\): la verosimilitud es cero si tomamos una \(b\) más chica que algún dato, pues este valor es incosistente del todo con los datos observados. En otro caso,
\[{\mathcal L}_n(b) = \frac{1}{b^n},\] pues la función de densidad de una uniforme en \([0,b]\) es igual a \(1/b\) en el intervalo \([0,b]\), y 0 en otro caso. Podemos escribir entonces:
<- function(x){
crear_verosim <- length(x)
n <- function(b){
verosim <- ifelse(all(x <= b), 1, 0)
indicadora / b^n
indicadora
} }
Ahora podemos hacer máxima verosimilitud para un ejemplo:
set.seed(234)
<- runif(10, 0, 3)
x <- crear_verosim(x)
verosim <- optimize(verosim, c(-1000, 1000), maximum = TRUE)
res_opt $maximum res_opt
## [1] 2.788167
Y nótese que, como esperaríamos, este valor es el máximo de la muestra:
max(x)
## [1] 2.788158
La gráfica de la función de verosimilitud es:
tibble(b = seq(-1, 5, 0.001)) %>%
mutate(verosim_1 = map_dbl(b, ~ verosim(.x))) %>%
ggplot() +
geom_line(aes(x = b, y = verosim_1)) +
geom_rug(data = tibble(x = x), aes(x = x), colour = "red")
Podemos escribir en una fórmula como:
\[\begin{align} \mathcal{L}(b; x_1, \ldots, x_n) = \prod_{i = 1}^n 1_{[0,b]}(x_i) \frac1b. \end{align}\]
Y podríamos resolver analíticamente como sigue:
Si consideramos \[ \hat b_{\textsf{MLE}} = x_{\max} = \max\{x_i\},\] notemos que cualquier valor observado necesariamente satisface \[x_i \leq \hat b_{\textsf{MLE}},\] y por lo tanto todas las funciones indicadoras están encendidas. El valor de la verosimilitud es igual a \[\mathcal{L}(\hat b_{\textsf{MLE}}; x_1, \ldots, x_n) = \left(\frac{1}{x_{\max}}\right)^n \geq \left (\frac1b\right )^n\] para cualquier \(b\geq x_{\max}\). Como la verosimilitud para \(b<x_{\max}\) es igual a cero, esto demuestra que el máximo de la muestra es el estimador de máxima verosimilitud de \(b\).
Observación. Este ejemplo también tiene dificultades numéricas, pues la verosimilitud presenta discontinuidades y regiones con derivada igual a cero, y la mayoria de los algoritmos numéricos no tienen garantías buenas de covergencia al máximo en estos casos. Si aplicamos sin cuidado descenso en gradiente, por ejemplo, podríamos comenzar incorrectamente en un valor \(b_0 < x_{\max}\) y el algoritmo no avanzaría al máximo.
Máxima verosimilitud para más de un parámetro
Si nuestro modelo contiene más de un parámetro desconocido podemos también usar máxima verosimilitud. En este caso, optimizamos sobre todos los parámetros usando cálculo o alguna rutina numérica.
Ejemplo. Considera el caso de \(n\) muestras iid de un modelo Gaussiano. Es decir, \(X_1, \ldots, X_n \sim \mathsf{N}(\mu, \sigma^2).\) Consideremos que ambos parámetros son desconocidos y nos gustaria encontrar el \(\textsf{MLE}\). Para este problema denotamos \(\theta \in \mathbb{R}^2\), donde \(\theta_1 = \mu\) y \(\theta_2 = \sigma^2.\)
La función de verosimiltud se puede calcular (ignorando algunas constantes multiplicativas) como \[\begin{align} \mathcal{L}_n(\theta) &= \prod_{i = 1}^n \frac{1}{\sigma} \, \exp\left( - \frac{(x_i - \mu)^2}{2\sigma^2}\right) \\ &= \theta_2^{-\frac{n}{2}}\exp\left( - \frac{1}{2 \theta_2} \sum_{i = 1}^n (x_i - \theta_1)^2 \right). \end{align}\]
A continuación mostramos la representación gráfica de la función de verosimilitud de este ejemplo. Notamos lo mismo que para los ejemplos anteriores. Conforme más datos tenemos, más nos acercamos a los valores reales que no conocemos.
Ejemplo. Como ejercicio, podemos encontrar los estimadores de máxima verosimilitud cuando tenemos una muestra \(X_1, \ldots, X_n \sim \mathsf{N}(\mu, \sigma^2).\) (puedes derivar e igualar el cero para encontrar el mínimo). También podemos resolver numéricamente, por ejemplo:
Supongamos que tenemos la siguiente muestra:
set.seed(41852)
<- rnorm(150, mean = 1, sd = 2) muestra
La función generadora de la log verosimilitud para una muestra es (ve la expresión del ejercicio anterior y calcula su logaritmo), y generamos la función de verosimilitud para nuestra muestra:
<- function(x){
crear_log_p <- function(pars){
log_p = pars[1]
media = pars[2]
desv_est # ve la ecuación del ejercicio anterior
<- (x - media) / desv_est
z <- -(log(desv_est) + 0.5 * mean(z ^ 2))
log_verosim
log_verosim
}
log_p
}<- crear_log_p(muestra) log_p
Ahora optimizamos:
<- optim(c(0, 0.5), log_p, control = list(fnscale = -1, maxit = 1000),
res method = "Nelder-Mead")
$convergence res
## [1] 0
<- tibble(parametro = c("media", "sigma"), estimador = res$par) %>%
est_mv column_to_rownames(var = "parametro")
est_mv
## estimador
## media 1.136001
## sigma 1.838421
Verifica que el estimador de la media y de la desviación estándar es el que esperábamos (y que puedes derivar analíticamente):
<- length(muestra)
n <- function(x) sqrt(mean((x - mean(x))^2))
sd_n c(media = mean(muestra), sigma = sd_n(muestra)) %>% round(4)
## media sigma
## 1.1364 1.8392
Ejemplo. Supongamos que en una población de estudiantes tenemos dos tipos: unos llenaron un examen de opción múltiple al azar (1 de 5), y otros contestaron las preguntas intentando sacar una buena calificación. Suponemos que una vez que conocemos el tipo de estudiante, todas las preguntas tienen la misma probabilidad de ser contestadas correctamente, de manera independiente. El modelo teórico está representado por la siguiente simulación:
<- function(p_azar, p_corr){
sim_formas <- rbinom(1, 1, 1 - p_azar)
tipo if(tipo==0){
# al azar
<- rbinom(1, 10, 1/5)
x else {
} # no al azar
<- rbinom(1, 10, p_corr)
x
}
x }
Y una muestra se ve como sigue:
set.seed(12)
<- map_dbl(1:200, ~ sim_formas(0.3, 0.75))
muestra qplot(muestra)
Supongamos que no conocemos la probabildad de contestar correctamente ni la proporción de estudiantes que contestó al azar. ¿Como estimamos estas dos cantidades?
Escribimos la verosimilitud:
<- function(x){
crear_log_p
<- function(pars){
log_p = pars[1]
p_azar = pars[2]
p_corr sum(log(p_azar * dbinom(x, 10, 1/5) + (1 - p_azar) * dbinom(x, 10, p_corr)))
}
log_p }
Creamos la función de verosimilitud con los datos
<- crear_log_p(muestra) log_p
y optimizamos
<- optim(c(0.5, 0.5), log_p, control = list(fnscale = -1))
res $par res
## [1] 0.2827061 0.7413276
En este caso, obtenemos estimaciones razonables de ambos parámetros. Nota: dependiendo de los datos, este problema puede estar mal condicionado. Por ejemplo, ¿qué pasa si la probabilidad de acertar cuando se contesta bien está cercano al azar?
La siguiente pregunta qué nos interesa hacer es: ¿cómo estimamos la variabilidad de estos estimadores? Más adelante veremos una respuesta basada en teoría, pero también podemos resolver este problema usando el bootstrap.