-
Notifications
You must be signed in to change notification settings - Fork 41
/
09-max-verosimilitud.Rmd
761 lines (574 loc) · 29.9 KB
/
09-max-verosimilitud.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
# Estimación por máxima verosimilitud {#S:max-verosimilitud}
```{r setup, include=FALSE, message=FALSE}
library(tidyverse)
library(patchwork)
library(broom)
source("R/funciones_auxiliares.R")
knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning=FALSE, fig.align = 'center', fig.width = 5, fig.height=3)
comma <- function(x) format(x, digits = 2, big.mark = ",")
theme_set(theme_minimal())
```
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]. 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 galletas 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:
1. Existe un proceso del que podemos obtener observaciones de algún sistema
o población real.
2. Tenemos un modelo probabilístico que dice cómo se producen esas observaciones a partir del sistema o población real.
3. 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:
4. Extraemos observaciones del proceso
$$x_1, x_2, \ldots, x_n.$$
5. 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 \@ref(S:distribucion-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.
```{block, type = 'mathblock'}
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.
```{r}
verosimilitud <- function(p){
p^2 * (1-p)^6
}
dat_verosim <- tibble(x = seq(0,1, 0.001)) %>% mutate(prob = map_dbl(x, verosimilitud))
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)$$
```{block verosimilitud, type = 'mathblock'}
**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.
```{block mle, type = 'mathblock'}
**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.
```
```{block, type = 'ejercicio'}
- 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ámetros $N$ y $p$ desconocidos. ¿Cuáles son los espacios parametrales 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$:
```{r}
calc_verosim <- function(r){
q_func <- 0.03^r*(0.97)^(10-r)
q_falla <- 0.2^r*(0.8)^(10-r)
function(p){
#nota: esta no es la mejor manera de calcularlo, hay
# que usar logaritmos.
prod(p*q_func + (1-p)*q_falla)
}
}
verosim <- calc_verosim(c(1, 0, 0, 3, 0, 0, 0, 2, 1, 0, 0))
verosim(0.1)
```
```{r}
dat_verosim <- tibble(x = seq(0,1, 0.001)) %>% mutate(prob = map_dbl(x, verosim))
ggplot(dat_verosim, aes(x = x, y = prob)) + geom_line() +
geom_vline(xintercept = 0.8, 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
```{r}
p <- 0.1
proba <- (p ^ 800)*(1-p)^200
proba
```
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:
```{r}
log_proba <- 800 * log(p) + 200 * log(1-p)
log_proba
```
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.
```{block log-like, type = 'mathblock'}
**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.
```
```{block, type = 'ejercicio'}
Considera una muestra de variables aleatorias Gaussianas con media $\mu$ y varianza $\sigma^2.$ Escribe la
verosimilitud para una muestra de tamaño $n,$ y después escribe la función de log-verosimilitud. ¿Que interpetación
le das a la ecuación resultante? ¿La has visto en algunos otros ejemplos en secciones anteriores?
*Pista.* Recuerda la sección de regresión local.
```
**Ejemplo.** En nuestro primer ejemplo,
```{r}
log_verosimilitud <- function(p){
2*log(p) + 6*log(1-p)
}
dat_verosim <- tibble(x = seq(0,1, 0.01)) %>% mutate(log_prob = map_dbl(x, log_verosimilitud))
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:
```{r, warning = FALSE}
solucion <- optim(p = 0.5, log_verosimilitud, control = list(fnscale = -1))
solucion$par
```
Y en nuestro segundo ejemplo:
```{r}
calc_log_verosim <- function(r){
q_func <- 0.03^r*(0.97)^(10-r)
q_falla <- 0.2^r*(0.8)^(10-r)
function(p){
#nota: esta no es la mejor manera de calcularlo, hay
# que usar logaritmos.
sum(log(p*q_func + (1-p)*q_falla))
}
}
log_verosim <- calc_log_verosim(c(1, 0, 0, 3, 0, 0, 0, 2, 1, 0, 0))
log_verosim(0.1)
```
```{r}
dat_verosim <- tibble(x = seq(0,1, 0.001)) %>% mutate(log_verosimilitud = map_dbl(x, log_verosim))
ggplot(dat_verosim, aes(x = x, y = log_verosimilitud)) + geom_line() +
geom_vline(xintercept = 0.775, color = "red") +
xlab("prop funcionado")
```
En la función de verosimilitud los datos están fijos y optimizamos con respecto a
las variables que no conocemos. ¿Cómo construimos esta función en general, para cualquier
tamaño de muestra y cualquier número de registros detectados como erróneos?
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:
```{r}
construir_log_verosim <- function(n, n_err){
# n es tamaño de muestra
# n_err el número de errores detectados (datos)
n_corr <- n - n_err
log_verosim <- function(p){
n_err * log(p) + n_corr * log(1-p)
}
}
```
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
```{r}
log_vero <- construir_log_verosim(20, 10)
```
```{r}
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 6 transacciones como fraudulentas. ¿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
```{r}
crear_log_verosim <- function(n, n_sosp){
# devolver la función log verosimilitud
log_verosimilitud_pct <- function(pct){
# sup que pct es la proporcentaje de fraudes,
# que es el parámetro que queremos estimar
prob_sosp <- 0.98 * pct / 100 + 0.001 * (1 - pct / 100)
log_prob <- n_sosp * log(prob_sosp) + (n - n_sosp) * log(1- prob_sosp)
log_prob
}
log_verosimilitud_pct
}
```
La verosimilitud es una función de $p$.
```{r}
log_verosim <- crear_log_verosim(n = 2000, n_sosp = 4)
```
A continuación la mostramos de manera gráfica.
```{r, echo = FALSE}
tibble(x = seq(0,10,0.001)) %>%
mutate(log_ver = log_verosim(x)) %>%
ggplot(aes(x = x, y = log_ver)) +
geom_line() +
xlab("Porcentaje fraudulentas")
```
No se ve muy claro dónde ocurre el máximo, pero podemos ampliar cerca de cero la
misma gráfica:
```{r, echo = FALSE}
tibble(x = seq(0,0.5,0.001)) %>%
mutate(log_ver = log_verosim(x)) %>%
ggplot(aes(x = x, y = log_ver)) +
geom_line() +
xlab("Porcentaje fraudulentas")
```
- 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 $6/2000 = 0.003$ (0.3%), que es
tres 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 particular, 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:
```{r}
crear_verosim <- function(x){
n <- length(x)
verosim <- function(b){
indicadora <- ifelse(all(x <= b), 1, 0)
indicadora / b^n
}
}
```
Ahora podemos hacer máxima verosimilitud para un ejemplo:
```{r}
set.seed(234)
x <- runif(10, 0, 3)
verosim <- crear_verosim(x)
res_opt <- optimize(verosim, c(-1000, 1000), maximum = TRUE)
res_opt$maximum
```
Y nótese que, como esperaríamos, este valor es el máximo de la muestra:
```{r}
max(x)
```
La gráfica de la función de verosimilitud es:
```{r}
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.
### El método de momentos {-}
Un método alternativo para estimación de parámetros es el método de momentos ($\textsf{MOM}$). Para esto
creamos un sistema de ecuaciones de cardinalidad igual al número de parámetros a estimar.
Es decir, consideramos $\theta \in \mathbb{R}^p;$ los momentos teoricos
\begin{align}
m_k(\theta) = \mathbb{E}_f[X^k] = \int_{\mathcal{X}} x^k \, f(x; \theta) \, \text{d} x;
\end{align}
los momentos empíricos
\begin{align}
\hat m_k(\theta) = \frac1n \sum_{i = 1}^n X_i^k;
\end{align}
y creamos el siguiente sistema de ecuaciones:
\begin{align}
m_k(\theta) = \hat m_k(\theta), \qquad k = 1, \ldots, p.
\end{align}
Este sistema explota la aproximación $m_k(\theta) \approx \hat m_k(\theta),$ cuya justificación está determinada
por la *Ley de los grandes números.*
**Ejemplo.** *(continuación).* Para el caso de $n$ observaciones $X_i \sim U[0,b],$ el método de momentos
arroja un estimador de la forma
$$\hat b_{\textsf{MOM}} = 2 \bar X_n.$$
```{block , type = 'ejercicio'}
Considera el caso de una muestra de tamaño $n = 3,$ con observaciones $X_1 = X_2 = 1$ y $X_3= 7$. ¿Cuál es el estimador $\textsf{MOM}$? ¿Qué implicaciones tiene sobre la observación $X_3$?
```
## 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.** 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:
```{r}
sim_formas <- function(p_azar, p_corr){
tipo <- rbinom(1, 1, 1 - p_azar)
if(tipo==0){
# al azar
x <- rbinom(1, 10, 1/5)
} else {
# no al azar
x <- rbinom(1, 10, p_corr)
}
x
}
```
Y una muestra se ve como sigue:
```{r}
set.seed(12)
muestra <- map_dbl(1:200, ~ sim_formas(0.3, 0.75))
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:
```{r}
crear_log_p <- function(x){
log_p <- function(pars){
p_azar = pars[1]
p_corr = pars[2]
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
```{r}
log_p <- crear_log_p(muestra)
```
y optimizamos
```{r}
res <- optim(c(0.5, 0.5), log_p, control = list(fnscale = -1))
res$par
```
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?
**Ejemplo.** (Tomado de [@zuev]). 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.
```{r, echo=FALSE}
knitr::include_graphics('images/mle-normal.png', auto_pdf = TRUE )
```
En las siguientes secciones veremos los métodos clásicos para encontrar el $\textsf{MLE}$. Y mas adelante, estudiaremos los propiedades teóricas que hacen a estos estimadores tan útiles y prácticos en aplicaciones.
**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:
```{r}
set.seed(41852)
muestra <- rnorm(150, mean = 1, sd = 2)
```
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:
```{r}
crear_log_p <- function(x){
log_p <- function(pars){
media = pars[1]
desv_est = pars[2]
n <- length(x)
# ve la ecuación del ejercicio anterior
z <- (x - media) / desv_est
log_verosim <- -(log(desv_est) + 0.5 * mean(z^2))
log_verosim
}
log_p
}
log_p <- crear_log_p(muestra)
```
Ahora optimizamos (checa que el método converge):
```{r}
res <- optim(c(0, 0.5), log_p, control = list(fnscale = -1, maxit = 1000), method = "Nelder-Mead")
res$convergence
est_mv <- tibble(parametro = c("media", "sigma"), estimador = res$par) %>%
column_to_rownames(var = "parametro")
est_mv
```
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):
```{r}
n <- length(muestra)
sd_n <- function(x) sqrt( mean((x - mean(x))^2))
c(media = mean(muestra), sigma = sd_n(muestra)) %>% round(4)
```
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.