-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy path31_loglik.Rmd
More file actions
484 lines (339 loc) · 26.5 KB
/
31_loglik.Rmd
File metadata and controls
484 lines (339 loc) · 26.5 KB
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
# Verosimilitud {#loglik}
En este capítulo se mostrará como usar R para obtener la función de log-verosimilitud y estimadores por el método de máxima verosimilitud.
## Función de verosimilitud
El concepto de verosimilitud fue propuesto por @Fisher22 en el contexto de estimación de parámetros. En la Figura \@ref(fig:fisher) se muestra una fotografía de Ronald Aylmer Fisher.
```{r fisher, echo=FALSE, fig.cap='Fotografía de Ronald Aylmer Fisher (1890-1962).', dpi=400, fig.align='center', out.width = '40%'}
knitr::include_graphics("images/Fisher.png")
```
La función de verosimilitud para un vector de parámetros $\boldsymbol{\theta}$ dada una muestra aleatoria $\boldsymbol{x}=(x_1, \ldots,x_n)^\top$ con una distribución asumida se define usualmente como:
\begin{equation}
L(\boldsymbol{\theta} | \boldsymbol{x}) = \prod_{i=1}^{n} f(x_i | \boldsymbol{\theta}),
(\#eq:lik)
\end{equation}
donde $x_i$ representa uno de los elementos de la muestra aleatoria y $f(\cdot)$ es la función de masa/densidad de la distribución de la cual se obtuvo $\boldsymbol{x}$.
## Función de log-verosimilitud
La función de log-verosimilitud $l(\boldsymbol{\theta} | \boldsymbol{x})$ se define como el logaritmo de la función de verosimilitud $L(\boldsymbol{\theta} | \boldsymbol{x})$, es decir
\begin{equation}
l(\boldsymbol{\theta} | \boldsymbol{x}) = \log L(\boldsymbol{\theta} | \boldsymbol{x}) = \sum_{i=1}^{n} \log f(x_i | \boldsymbol{\theta})
(\#eq:loglik)
\end{equation}
## Método de máxima verosimilitud para estimar parámetros
El método de máxima verosimilitud se usa para estimar los parámetros de una distribución. El objetivo de este método es encontrar los valores de $\boldsymbol{\theta}$ que maximizan a $L(\boldsymbol{\theta} | \boldsymbol{x})$ o a $l(\boldsymbol{\theta} | \boldsymbol{x})$, los valores encontrados se representan usualmente por $\hat{\boldsymbol{\theta}}$.
```{block2, type='rmdnote'}
Asumiendo un modelo estadístico parametrizado por una cantidad fija y desconocida $\theta$, la verosimilitud $L(\theta)$ es la probabilidad de los datos observados $x$ como una función de $\theta$ [@pawitan_2013]. Si la variable de interés es discreta se usa la probabilidad y si es continua se usa la densidad para obtener la verosimilitud.
```
### Ejemplo {-}
En este ejemplo vamos a considerar la distribución binomial cuya función de masa de probabilidad está dada por:
$$f(x)=P(X=x)=\binom{n}{x} p^x (1-p)^{n-x}, \quad 0<p<1, \quad n \leq 1, 2, \ldots, \quad 0 \leq x \leq n$$
La distribución binomial anterior tiene sólo un parámetro $p$, por lo tanto en este caso se $\theta=p$.
Suponga que se tiene el vector `rta` que corresponde a una muestra aleatoria de una distribución binomial con parámetro $n=5$ conocido.
```{r}
rta <- c(2, 2, 1, 1, 1, 1, 0, 2, 1, 2,
1, 0, 1, 2, 1, 0, 0, 2, 2, 1)
```
1) Calcular el valor de log-verosimilitud $l(\theta)$ si asumiendo que $p=0.30$ en la distribución binomial.
Para obtener el valor de $l(\theta)$ en el punto $p=0.30$ se aplica la definición dada en la expresión \@ref(eq:loglik). Como el problema trata de una binomial se usa entonces la función de masa `dbinom` evaluada en la muestra `rta`, el parámetro `size` como es conocido se reemplaza por el valor de cinco y en el parámetro `prob` se cambia por 0.3. Como interesa la función de log-verosimilitud se debe incluir `log=TRUE`. A continuación el código necesario.
```{r}
sum(dbinom(x=rta, size=5, prob=0.3, log=TRUE))
```
Por lo tanto $l(\theta)= -24.55$
2) Construir una función llamada `ll` a la cual le ingrese valores del parámetro $p$ de la binomial y que la función entregue el valor de log-verosimilitud.
La función solicitada tiene un cuerpo igual al usado en el numeral anterior, a continuación el código necesario para crearla.
```{r}
ll <- function(prob) sum(dbinom(x=rta, size=5, prob=prob, log=T))
```
Vamos a probar la función en dos valores arbitrarios $p=0.15$ y $p=0.80$ que pertenezcan al dominio del parámetro $p$ de la distribución binomial.
```{r}
ll(prob=0.15) # Individual para p=0.15
ll(prob=0.80) # Individual para p=0.80
```
El valor de log-verosimilitud para $p=0.15$ fue de -25.54 mientras que para $p=0.80$ fue de -98.46.
Vamos ahora a chequear si la función `ll` está vectorizada y para esto usamos el código mostrado a continuación y deberíamos obtener un vector con los valores `c(-25.54, -98.56)`.
```{r}
ll(prob=c(0.15, 0.80))
```
No obtuvimos el resultado esperado, eso significa que nuestra función no está vectorizada. Ese problema lo podemos solucionar así:
```{r}
ll <- Vectorize(ll)
ll(prob=c(0.15, 0.80))
```
Vemos que ahora que cuando se ingresa un vector a la función `ll` se obtiene un vector.
```{block2, type='rmdnote'}
Necesitamos que la función `ll` esté vectorizada para poder dibujarla y para poder optimizarla.
```
3) Dibujar la curva log-verosimilitud $l(\theta)$, en el eje X debe estar el parámetro $p$ del cual depende la función de log-verosimilitud.
En la Figura \@ref(fig:loglik1) se presenta la curva solicitada.
```{r loglik1, fig.align='center', fig.cap='Función de log-verosimilitud para el ejemplo sobre binomial.', fig.asp=0.9, fig.width=5, echo=TRUE}
curve(ll, lwd=4, col='dodgerblue3',
xlab='Probabilidad de éxito (p)', las=1,
ylab="Loglik(p)")
grid()
```
4) Observando la Figura \@ref(fig:loglik1), ¿cuál esl el valor de $p$ que maximiza la función de log-verosimilitud?
Al observar la Figura \@ref(fig:loglik1) se nota que el valor de $p$ que maximiza la función log-verosimilitud está muy cerca de 0.2.
5) ¿Cuál es el valor exacto de $p$ que maximiza la función log-verosimilitud?
En R existe la función `optimize` que sirve para encontrar el valor que __minimiza__ una función uniparamétrica en un intervalo dado, sin embargo, aquí interesa es maximimizar la función de log-verosimilitud, por esa razón se construye la función `minusll` que es el negativo de la función `ll` para así poder usar `optimize`. A continuación el código usado. \index{optimize}
```{r}
minusll <- function(x) -ll(x)
optimize(f=minusll, interval=c(0, 1))
```
Del resultado anterior se observa que cuando $p=0.23$ el valor máximo de log-verosimilitud es -23.32 (negativo de `minusll`).
### Ejemplo {-}
Suponga que la estatura de una población se puede asumir como una normal $N(170, 25)$. Suponga también que se genera una muestra aleatoria de 50 observaciones de la población con el objetivo de recuperar los valores de la media y varianza poblacionales a partir de la muestra aleatoria.
La muestra se va a generar con la función `rnorm` pero antes se fijará una semilla con la intención de que el lector pueda replicar el ejemplo y obtener la misma muestra aleatoria aquí generada, el código para hacerlo es el siguiente.
```{r}
set.seed(1235) # La semilla es 1235
y <- rnorm(n=50, mean=170, sd=5)
y[1:7] # Para ver los primeros siete valores generados
```
1) Construya la función de log-verosimilitud para los parámetros de la normal dada la muestra aleatoria `y`.
Abajo se muestra la forma de construir la función de log-verosimilitud.
```{r}
ll <- function(param) {
media <- param[1] # param es el vector de parámetros
desvi <- param[2]
sum(dnorm(x=y, mean=media, sd=desvi, log=TRUE))
}
```
```{block2, type='rmdwarning'}
Siempre que el interés sea encontrar los valores que maximizan una función de log-verosimilitud, los parámetros de la distribución __deben__ ingresar a la función `ll` como un vector. Esto se debe hacer para poder usar las funciones de búsqueda `optim` y `nlminb`.
```
2) Dibujar la función de log-verosimilitud.
En la Figura \@ref(fig:loglik2) se muestra el gráfico de niveles para la superficie de log-verosimilitud. De esta figura se nota claramente que los valores que maximizan la superficie están alrededor de $\mu=170$ y $\sigma=5$.
```{r loglik2, fig.cap='Gráfico de niveles para la función de log-verosimilitud para el ejemplo sobre normal.', fig.asp=0.6, fig.width=9}
ll1 <- function(a, b) sum(dnorm(x=y, mean=a, sd=b, log=TRUE))
ll1 <- Vectorize(ll1)
xx <- seq(from=160, to=180, by=0.5)
yy <- seq(from=3, to=7, by=0.5)
zz <- outer(X=xx, Y=yy, ll1)
filled.contour(x=xx, y=yy, z=zz, nlevels=20,
xlab=expression(mu), ylab=expression(sigma),
color = topo.colors)
```
3) Obtenga los valores de $\mu$ y $\sigma$ que maximizan la función de log-verosimilitud.
Para obtener los valores solicitados vamos a usar la función `nlminb` que es un optimizador. A la función `nlminb` se le debe indicar por medio del parámetro `objective` la función que queremos optimizar (minimizar); el parámetro `start` es un vector con los valores iniciales para comenzar la búsqueda de $\mu$ y $\sigma$; los parámetros `lower` y `upper` sirven para delimitar el espacio de búsqueda. A continuación se muestra el código usado para obtener los valores que minimizan a `minusll`, es decir, los valores que maximizan la función de log-verosimilitud. \index{nlminb}
```{r}
minusll <- function(x) -ll(x)
nlminb(objective=minusll, start=c(163, 3.4),
lower=c(160, 3), upper=c(180, 7))
```
De la salida anterior podemos observar que los valores óptimos de $\mu$ y $\sigma$ son 170.338 y 5.424 respectivamente, resultado que coincide con lo observado en la Figura \@ref(fig:loglik2) y con los valores reales de simulación de la muestra. Esto indica que el procedimiento de estimación de parámetros por máxima verosimilitud entrega valores insesgados de los parámetros a estimar.
Un resultado interesante de la salida anterior es que se reporta el valor mínimo que alcanza la función `minusll`, este valor fue de 155.5, por lo tanto, se puede afirmar que el valor máximo de log-verosimilitud es -155.5.
Otros resultados importantes de la salida anterior son el valor de `convergence=0` que indica que la búsqueda fue exitosa; `iterations=13` indica que se realizaron 13 pasos desde el punto inicial `start` hasta las coordenadas de optimización.
```{block2, type='rmdnote'}
En R se tienen dos funciones básicas para optimizar funciones, es decir, para encontrar los valores que minimizan una función dada. Esas dos funciones son `nliminb` y `optim`. Para optimizar en una sola dimensión se usa la función `optimize`.
```
4) ¿Hay alguna función para obtener directamente el valor que maximiza la función log-verosimilitud?
La respuesta es si. Si la distribución estudiada es una de las distribuciones básicas se puede usar la función `fitdistr` del paquete básico **MASS**. Esta función requiere de los datos que se ingresan por medio del parámetro `x`, y de la distribución de los datos que se ingresa por medio del parámetro `densfun`. La función `fitdistr` admite 15 distribuciones diferentes para hacer la búsqueda de los parámetros que caracterizan una distribución, se sugiere consultar la ayuda de la función `fitdistr` escribiendo en la consola `help(fitdistr)`. A continuación el código usado. \index{fitdistr}
```{r, message=FALSE}
require(MASS) # El paquete ya está instalado, solo se debe cargar
res <- fitdistr(x=y, densfun='normal')
res
```
El objeto `res` contiene los resultados de usar `fitdistr`. En la primer línea están los valores de los parámetros que maximizan la función de log-verosimilitud, en la parte de abajo, dentro de paréntesis, están los errores estándar o desviaciones de éstos estimadores.
Al objeto `res` es de la clase _fitdistr_ y por lo tanto se le puede aplicar la función genérica `logLik` para obtener el valor de la log-verosimilitud. Se sugiere consultar la ayuda de la función `logLik` escribiendo en la consola `help(logLik)`. A continuación el código para usar `logLik` sobre el objeto `res`.
```{r}
logLik(res)
```
De esta última salida se observa que el valor coincide con el obtenido cuando se usó `nlminb`.
### Ejemplo {-}
Generar $n=100$ observaciones de una gamma con parámetro de forma igual a 2, parámetro de tasa igual a 0.5 y luego responder las preguntas.
1) ¿Cómo se puede generar la muestra aleatoria solicitada?
Para generar la muestra aleatoria (`ma`) solicitada se fijó la semilla con el objetivo de que el lector pueda obtener los mismos resultados de este ejemplo.
```{r}
n <- 100
set.seed(12345)
ma <- rgamma(n=n, shape=2, rate=0.5)
```
2) Asumiendo que la muestra aleatoria proviene de una normal (lo cual es incorrecto), estime los parámetros de la distribución normal.
```{r}
fit1 <- fitdistr(x=ma, densfun='normal')
fit1
```
3) Asumiendo que la muestra aleatoria proviene de una gamma estime los parámetros de la distribución gamma.
```{r, warning=FALSE}
fit2 <- fitdistr(x=ma, densfun='gamma')
fit2
```
En la salida anterior están los valores estimados de los parámetros de la distribución por el método de máxima verosimilitud, observe la cercanía de éstos con los verdaderos valores de 2 y 0.5 para forma y tasa respectivamente.
4) Dibuje dos qqplot, uno asumiendo distribución normal y el otro distribución gamma. ¿Cuál distribución se ajusta mejor a los datos simulados?
Para dibujar el qqplot se usa la función genérica `qqplot`, recomendamos consultar @hernandez_correa para los detalles de cómo usar esta función. Al usar `qqplot` para obtener el qqplot normal y gamma es necesario indicar los valores $\hat{\boldsymbol{\theta}}$ obtenidos en el numeral anterior, por eso es que en el código mostrado a continuación aparece `mean=4.3083, sd=2.8085` en el qqplot normal y `shape=2.23978, rate=0.51988` en el qqplot gamma.
```{r normgamma, fig.cap='Gráfico cuantil cuantil normal y gamma para la muestra simulada.', fig.asp=0.6, fig.width=9}
par(mfrow=c(1, 2))
qqplot(y=ma, pch=19,
x=qnorm(ppoints(n), mean=4.3083, sd=2.8085),
main='Normal Q-Q Plot',
xlab='Theoretical Quantiles',
ylab='Sample Quantiles')
qqplot(y=ma, pch=19,
x=qgamma(ppoints(n), shape=2.23978, rate=0.51988),
main='Gamma Q-Q Plot',
xlab='Theoretical Quantiles',
ylab='Sample Quantiles')
```
En la Figura \@ref(fig:normgamma) se muestran los qqplot solicitados. Se observa claramente que al asumir normalidad (lo cual es incorrecto), los puntos del qqplot no están alineados, mientras que al asumir distribución gamma (lo cual es correcto), los puntos si están alineados. De esta figura se concluye que la muestra `ma` puede provenir de una $Gamma(2.23978, 0.51988)$.
```{block2, type='rmdtip'}
Para obtener el gráfico cuantil cuantil bajo normalidad se puede usar directamente la función `qqnorm`, consultar @hernandez_correa para mayores detalles.
```
```{block2, type='rmdwarning'}
En este ejemplo se eligió la mejor distribución entre dos candidatas usando una herramienta gráfica, lo que se recomienda usar algún método menos subjetivo (cuantitativo) para tomar decisiones.
```
5) Para comparar modelos se puede utilizar el _Akaike information criterion_ ($AIC$) propuesto por @Akaike74 que sirve para medir la calidad relativa de los modelos estadísticos, la expresión para calcular el indicador es $AIC=-2 \, \hat{l}+2 \, df$, donde $\hat{l}$ corresponde al valor de $\log$-verosimilitud y $df$ corresponde al número de parámetros estimados del modelo. Siempre el modelo elegido es aquel modelo con el menor valor de $AIC$. Calcular el $AIC$ para los modelos asumidos normal y gamma.
```{r}
-2 * logLik(fit1) + 2 * 2 # AIC para modelo normal
-2 * logLik(fit2) + 2 * 2 # AIC para modelo gamma
```
De los resultados anteriores se concluye que entre los dos modelos, el mejor es el gamma porque su $AIC=466$ es el menor de toos los $AIC$.
```{block2, type='rmdnote'}
Modelos anidados pueden ser comparados por medio del _global deviance_ ($GD$) dado por $GD=-2 \, \hat{l}$ y modelos no anidados por medio del _Generalized Akaike information criterion_ ($GAIC$) propuesto por @Akaike83 y dado por $GAIC=-2 \, \hat{l} + \sharp \, df$ siendo $\sharp$ el valor de penalidad por cada parámetro adicional en el modelo; cuando $\sharp = 2$, el $GAIC$ coincide con el $AIC$ y el _Schwarz Bayesian criterion_ ($SBC$) propuesto por @Schwarz se dá cuando el valor de penalidad es $\sharp = \log(n)$ donde $n$ es el número de observaciones del modelo; siempre el modelo elegido es aquel modelo con el menor valor de cualquiera de los criterios de información anteriores.
```
## Score e Información de Fisher
En esta sección se explican los conceptos y utilidad de la función Score y la Información de Fisher.
### Score e Información de Fisher en el caso univariado.
La función Score denotada por $S(\theta)$ se define como la primera derivada de la función de log-verosimilitud así:
$$
S(\theta) \equiv \frac{\partial}{\partial \theta} l(\theta)
$$
y el estimador de máxima verosimilitud $\hat{\theta}$ se encuentra solucionando la igualdad
$$
S(\theta) = 0
$$
En el valor máximo $\hat{\theta}$ la curva $l(\theta)$ es cóncava hacia abajo y por lo tanto la segunda derivada es negativa, así la curvatura $I(\theta)$ se define como
$$
I(\theta) \equiv - \frac{\partial^2}{\partial \theta^2} l(\theta)
$$
Una curvatura grande $I(\hat{\theta})$ está asociada con un gran pico en la función de log-verosimilitud y eso significa una menor incertidumbre sobre el parámetro $\theta$ [@pawitan_2013]. En particular la varianza del estimador de máxima verosimilitud está dada por
$$Var(\hat{\theta})=I^{-1}(\hat{\theta})$$
### Ejemplo {-}
Suponga que se desea estudiar una variable que tiene distribución Poisson con parámetro $\lambda$ desconocido. Suponga además que se tienen dos situciones:
- Un solo valor 5 para estimar $\lambda$.
- Cuatro valores 5, 10, 6 y 15 para estimar $\lambda$.
Dibujar la función $l(\lambda)$ para ambos casos e identificar la curvatura.
A continuación el código para evaluar la función $l(\lambda)$ para cada caso.
```{r}
# Caso 1
w <- c(5)
ll1 <- function(lambda) sum(dpois(x=w, lambda=lambda, log=T))
ll1 <- Vectorize(ll1)
# Caso 2
y <- c(5, 10, 6, 15)
ll2 <- function(lambda) sum(dpois(x=y, lambda=lambda, log=T))
ll2 <- Vectorize(ll2)
```
En la Figura \@ref(fig:loglikpoisson) se muestran las dos curvas $l(\lambda)$ para cada uno de los casos. De la figura se observa claramente que cuando se tienen 4 observaciones la curva es más puntiaguda y por lo tanto menor incertibumbre sobre el parámetro $\lambda$ a estimar.
```{r loglikpoisson, fig.cap='Curvas de log-verosimilitud para los dos casos.', fig.height=4, fig.width=5, echo=FALSE}
upper <- 25
curve(ll1, from=0, to=upper, las=1, ylim=c(-20, 0),
xlab=expression(lambda), lwd=5, col='blue3',
ylab=expression(paste("l(", lambda, ")")))
curve(ll2, from=0, to=upper, add=TRUE, lwd=5, col='tomato')
legend('topright', legend=c('Con 5', 'Con 5, 10, 6 y 15'),
lwd=3, col=c('blue3', 'tomato'), bty='n')
```
## Método de máxima verosimilitud para estimar parámetros en modelos de regresión
En esta sección se mostrará como estimar los parámetros de un modelo de regresión general.
### Ejemplo {-}
Considere el modelo de regresión mostrado abajo. Simule 1000 observaciones del modelo y use la función `optim` para estimar los parámetros del modelo.
\begin{align*}
y_i &\sim N(\mu_i, \sigma^2), \\
\mu_i &= -2 + 3 x_1, \\
\sigma &= 5, \\
x_1 &\sim U(-5, 6).
\end{align*}
El código mostrado a continuación permite simular un conjunto de valores con la estructura anteior.
```{r}
n <- 1000
x1 <- runif(n=n, min=-5, max=6)
y <- rnorm(n=n, mean=-2 + 3 * x1, sd=5)
```
El vector de parámetros del modelo anterior es $\boldsymbol{\theta}=(\beta_0, \beta_1, \sigma)^\top=(-2, 3, 5)^\top$, el primer elemento corresponde al intercepto, el segundo a la pendiente y el último a la desviación.
```{r}
minusll <- function(theta, y, x1) {
media <- theta[1] + theta[2] * x1 # Se define la media
desvi <- theta[3] # Se define la desviación.
- sum(dnorm(x=y, mean=media, sd=desvi, log=TRUE))
}
```
Ahora vamos a usar la función `optim` para encontrar los valores que maximizan la función de log-verosimilitud, el código para hacer eso se muestra a continuación. En el parámetro `par` se coloca un vector de posibles valores de $\boldsymbol{\theta}$ para iniciar la búsqueda, en `fn` se coloca la función de interés, en `lower` y `upper` se colocan vectores que indican los límites de búsqueda de cada parámetro, los $\beta_k$ pueden variar entre $-\infty$ y $\infty$ mientras que el parámetro $\sigma$ toma valores en el intervalo $(0, \infty)$. Como la función `minusll` tiene argumentos adicionales `y` e `x1`, estos pasan a la función `optim` al final como se muestra en el código.
```{r}
res1 <- optim(par=c(0, 0, 1), fn=minusll, method='L-BFGS-B',
lower=c(-Inf, -Inf, 0), upper=c(Inf, Inf, Inf),
y=y, x1=x1)
```
En el objeto `res1` está el resultado de la optimización, para explorar los resultados usamos
```{r}
res1
```
De la salida anterior se observa que el vector de parámetros estimado es $\hat{\beta}_0 = `r res1$par[1]`$, $\hat{\beta}_1 = `r res1$par[2]`$ y $\hat{\sigma} = `r res1$par[3]`$, se observa también que el valor de la máxima log-verosimilitud fue de `r -res1$value`. Vemos entonces que el vector estimado está muy cerca del verdadero $\boldsymbol{\theta}=(\beta_0=-2, \beta_1=3, \sigma=5)^\top$.
```{block2, type='rmdnote'}
Cuando se usa `optim` es necesario decirle que inicie la búsqueda de $\boldsymbol{\theta}$ a partir de un lugar. Por esa razón se usó `par=c(0, 0, 1)`, esto significa que la búsqueda inicia en el tripleta $\beta_0=0$, $\beta_1=0$ y $\sigma=1$.
```
En algunas ocasiones es mejor hacer la búsqueda de los parámetros en el intervalo $(-\infty, \infty)$ que en una región limitada como por ejemplo $(0, \infty)$ o $(-1, 1)$, ya que las funciones de búsqueda podrían tener problemas en los bordes de esos intervalos. Una estrategia usual en este tipo de casos es aplicar una transformación apropiada al parámetro que tiene el dominio limitado. En el presente ejemplo $\sigma$ sólo puede tomar valores mayores que cero y una transformación de tipo $\log$ podría ser muy útil ya que $\log$ relaciona los reales positivos con todos los reales. La transformación para este problema sería $\log(\sigma)=\beta_3$ o escrita de forma inversa $\sigma=\exp(\beta_3)$. El nuevo parámetro $\beta_3$ puede variar en $(-\infty, \infty)$ pero al ser transformado por la función exponencial este se volvería un valor apropiado para $\sigma$. Para implementar esta variación lo único que se debe hacer es modificar la línea 3 de la función `minusll` como se muestra a continuación:
```{r}
minusll <- function(theta, y, x1) {
media <- theta[1] + theta[2] * x1
desvi <- exp(theta[3]) # <<<<<---- El cambio fue aquí
- sum(dnorm(x=y, mean=media, sd=desvi, log=TRUE))
}
```
Para hacer la búsqueda se procede de forma similar, abajo el código necesario.
```{r}
res2 <- optim(par=c(0, 0, 0), fn=minusll, method='L-BFGS-B',
y=y, x1=x1)
res2
```
De la salida anterior se observa que el vector de parámetros estimado es $\hat{\beta}_0 = `r res2$par[1]`$, $\hat{\beta}_1 = `r res2$par[2]`$ y $\hat{\sigma} = \exp(`r res2$par[3]`)=`r exp(res2$par[3])`$, se observa también que el valor de la máxima log-verosimilitud fue de `r -res2$value`. Vemos entonces que el vector estimado está muy cerca del verdadero $\boldsymbol{\theta}=(\beta_0=-2, \beta_1=3, \sigma=5)^\top$.
## Paquete maxLik
El paquete **maxLik** tiene un conjunto de funciones útiles para estación por máxima verosimilitud y varias viñetas que pueden ser consultadas [en este enlace](https://cran.r-project.org/web/packages/maxLik/index.html).
### Ejemplo {-}
En este ejemplo vamos a repetir un ejemplo anterior con la distribución normal.
```{r}
set.seed(1235) # La semilla es 1235
y <- rnorm(n=50, mean=170, sd=5)
y[1:7] # Para ver los primeros siete valores generados
```
Ahora vamos a crear la función de log-verosimilitud de la siguiente manera:
```{r}
ll <- function(param) {
media <- param[1] # param es el vector de parámetros
desvi <- param[2]
sum(dnorm(x=y, mean=media, sd=desvi, log=TRUE))
}
```
Ahora vamos a estimar los parametros con el paquete **maxLik**.
```{r message=FALSE}
library(maxLik)
A <- matrix(c(1, 0,
0, 1), byrow=TRUE, ncol=2)
B <- c(0, 0)
m <- maxLik(ll, start=c(media=163, desvi=3.4),
constraints=list(ineqA=A, ineqB=B))
summary(m)
```
## EJERCICIOS {-}
1) Al inicio del Capítulo \@ref(central) se presentó la base de datos sobre medidas del cuerpo, consulte la explicación sobre la base de datos y responda lo siguiente.
+ Si se asume que la `edad` tiene distribución normal, ¿cuáles son los estimadores de máxima verosimilitud para $\mu$ y $\sigma$?
+ Como el histograma para la edad muestra un sesgo a la derecha se podría pensar que la distribución gamma sería una buena candidata para explicar las edades observadas. Asumiendo una distribución gamma, ¿cuáles son los estimadores de máxima verosimilitud para los parámetros?
+ ¿Cuál de los dos modelos es más apropiado para explicar la variable de interés? Calcule el $AIC$ para decidir.
2) En el capítulo \@ref(discretas) se presentó un ejemplo donde se usó la base de datos sobre cangrejos hembra. Consulte la explicación sobre la base de datos y responda lo siguiente.
+ Suponga que el número de satélites sobre cada hembra es una variable que se distribuye Poisson. Construya en R la función de log-verosimilitud $l$, dibuje la función $l$ y encuentre el estimador de máxima verosimilitud de $\lambda$.
+ Repita el ejercicio anterior asumiendo que el número de satélites se distribuye binomial negativo.
+ ¿Cuál de los dos modelos es más apropiado para explicar la variable de interés? Calcule el $AIC$ para decidir.
3) Al inicio del Capítulo \@ref(varia) se presentó la base de datos sobre apartamentos usados en Medellín, consulte la explicación sobre la base de datos y responda lo siguiente.
+ Dibuje una densidad para la variable área del apartamento.
+ Describa lo encontrado en esa densidad.
+ ¿Qué distribuciones de 2 parámetros podrían explicar el comportamiento del área de los apartamentos? Mencione al menos 3.
+ Para cada una de las distribuciones anteriores dibuje un gráfico de contornos o calor para la función de log-verosimilitud y estime los parámetros de la distribución elegida.
+ ¿Cuál de los dos modelos es más apropiado para explicar la variable de interés? Calcule el $AIC$ para decidir.
4) Considere el siguiente modelo de regresión.
\begin{align*}
y_i &\sim Gamma(shape_i, scale_i), \\
\log(shape_i) &= 3 - 7 x_1, \\
\log(scale_i) &= 3 - 1 x_2, \\
x_1 &\sim U(0, 1), \\
x_2 &\sim Poisson(\lambda=3)
\end{align*}
+ Simule 100 observaciones del modelo anterior.
+ Escriba el vector de parámetros del problema.
+ Construya la función `minusll` para el problema.
+ Use la función `optim` para estimar los parámetros del problema.