Ejercicios 05 - Ejemplo de Máxima verosimilitud
Instrucciones
- El trabajo debe ser desarrollado en el lenguaje de programación R (https://cran.r-project.org/).
- Trabaje individualmente.
- Cree un archivo en Rpubs para documentar cada respuesta y procedimiento asociado a la resolución de este ejercicio.
- La dirección (url) respectiva deberá ser subida en la sección de Moodle habilitada para este fin.
Ejemplo de máxima verosimilitud
Se solicita crear un ejemplo de estimación de máxima verosimilitud en el que explique cada paso. Puede utilizar como base el siguiente código utilizando la siguiente función de densidad, suponga que \(\delta\) es conocido: \[ \begin{align} f(x;\beta,\delta)=\beta \delta x^{\delta-1}e^{-\beta x^\delta} && \text{para x>0, 0 en otro caso} \end{align} \] También se aceptarán otras funciones de distribuciones distintas a la anterior y a la del ejemplo. # Máxima verosimilitud
- Se tiene una muestra independiente e idénticamente distribuída. \[ y_1,y_2,...,y_N \]
- Se asume que los datos son generados por alguna función de densidad paramétrica. En particular, los datos se generan con una función de densidad (o función de masa de probabilidad) conocida: \[ y_i \sim f(y|\theta) \] Considerando el hecho de que los datos son independientes e idénticamente distribuidos, se puede construir la siguiente función de verosimilitud:
\[ L(\theta) = \prod^{N}_{i=1}f(y_i|\theta)\\ \log(L(\theta)) = \sum^{N}_{i=1} \log f(y_i |\theta) \]
- Es posible que exista un número infinito de parámetros, se desea elegir los que mejor se “ajusten” a los datos. Para hacer esto es necesario maximizar la función anterior.
Ejemplo utilizando mínimos cuadrados
\[ \begin{align} Y_i = \beta X_i+ U_i && \text{(modelo lineal)}\\ U_i = Y_i - \beta X_i \\ U_i \sim N(0, \sigma^2) && \text{(normalmente distribuido)}\\ Y_i \sim N(\beta X_i, \sigma^2) && \text{(normalmente distribuido)} \end{align} \] La función de densidad esta dada por: \[ f(Y_i|\sigma^2,\beta) \sim \frac{1}{\sqrt{2\pi\sigma^2}}\exp\Big(-\frac{Y_i -\beta X_i}{2\sigma^2}\Big) \] Función de verosimilitud:
\[ L(\sigma^2, \beta) = \prod^{N}_{i=1}f(Y_i|\sigma^2, \beta) = \prod^{N}_{i=1} \frac{1}{\sqrt{2\pi\sigma^2}}\exp\Big(-\frac{Y_i -\beta X_i}{2\sigma^2}\Big) \] \[ \log L(\sigma^2, \beta)=\sum^{n}_{i=1} -\frac{n}{2}\log(2\pi)-\frac{n}{2}\log(\sigma^2) -\frac{1}{2\sigma^2}(Y_i - \beta X_i)^2 \]
Paso 1: Generar los datos
library(pacman)
p_load(data.table, fixest, lattice, magrittr, ggplot2, kableExtra,dplyr)
= 500 # Tamaño de la muestra
N = 5 # Beta
beta = 5 # sigma^2 (Distribución de U)
sigma_2 <- data.table(X = rnorm(N, 0, 5),
DT U = rnorm(N, 0, sqrt(sigma_2))) %>%
:= beta*X + U] .[, Y
Paso 2: Derivar la función de verosimilitud
# Función de verosimilitud
<- function(theta, Y, X){ # theta en este caso es un vector con beta y sigma_2
log_like <- as.matrix(X); Y <- as.matrix(Y);
X <- nrow(X)
N <- theta[1]
beta <- theta[2]
sigma_2 <- Y - beta*X # Cálculo de residuales
e <- -.5*N*log(2*pi)-.5*N*log(sigma_2) - ( (t(e) %*% e)/ (2*sigma_2) ) # Calcula log L, ver ecuación
loglik return(-loglik) # Se utiliza el resultado negativo para la función optim
}
# Graficar la función de verosimilitud
<- function(beta, sigma_2){
log_like_graph <- as.matrix(DT$X); Y <- as.matrix(DT$Y);
X <- nrow(X)
N <- Y - beta*X
e <- -.5*N*log(2*pi)-.5*N*log(sigma_2) - ( (t(e) %*% e)/ (2*sigma_2) )
loglik return(loglik)
}<- Vectorize(log_like_graph)
log_like_graph
# Crear matriz de valores para graficar beta y sigma
<- seq(-10,10, by =1)
beta_vals <- seq(1,10, by =1)
sigma2_vals <- outer(beta_vals, sigma2_vals, log_like_graph)
log_vals
persp(beta_vals, sigma2_vals, log_vals, theta = 7, phi =8 , r= 500)
Paso 3: Estimación por máxima verosimilitud
<- optim(fn=log_like, # Función de verosimilitud
MLE_estimates par=c(1,1), # Estimación inicial
lower = c(-Inf, -Inf), # Límite inferior de los parámetros
upper = c(Inf, Inf), # Límite superior de los parámetros
hessian=TRUE, # Devuelve el Hessiano
method = "L-BFGS-B",
# Entradas personalizadas
Y = DT$Y,
X = DT$X)
# Examinar estimaciones
<- MLE_estimates$par
MLE_par <- sqrt(diag(solve(MLE_estimates$hessian)))
MLE_SE <- data.table(param = c("beta", "sigma_2"),
MLE estimates = MLE_par,
sd = MLE_SE)
kable(MLE)
param | estimates | sd |
---|---|---|
beta | 5.037684 | 0.0204447 |
sigma_2 | 5.469883 | 0.3459457 |
Paso 4: Graficar estimaciones
<- function(beta){
log_like_graph_beta = MLE_par[2]
sigma_2 = as.matrix(DT$X)
X = as.matrix(DT$Y)
Y = nrow(X)
N = Y - beta*X
e <- -.5*N*log(2*pi)-.5*N*log(sigma_2) - ( (t(e) %*% e)/ (2*sigma_2) )
loglik return(loglik)
}
<- function(sigma_2){
log_like_graph_sigma2 = MLE_par[1]
beta = as.matrix(DT$X)
X = as.matrix(DT$Y)
Y = nrow(X)
N = Y - beta*X
e <- -.5*N*log(2*pi)-.5*N*log(sigma_2) - ( (t(e) %*% e)/ (2*sigma_2) )
loglik return(loglik)
}
# Vectorizar
<- Vectorize(log_like_graph_beta)
log_like_graph_beta <- Vectorize(log_like_graph_sigma2)
log_like_graph_sigma2
# Graficar
<- ggplot(data = data.frame(beta = 0), mapping = aes(beta = beta)) +
beta stat_function(fun = log_like_graph_beta) +
xlim(-40,40) + theme_bw() +xlab("beta") + ylab("log lik")
<- ggplot(data = data.frame(sigma2 = 0), mapping = aes(sigma2 = sigma2)) +
sigma2 stat_function(fun = log_like_graph_sigma2) +
xlim(1,20) + theme_bw() +xlab("sigma2") + ylab("log lik")
beta
sigma2
Referencia: https://www.youtube.com/watch?v=w3drLH-DFpE&t=77s&ab_channel=CalebLikesR
Links de utilidad:
https://www.analyticsvidhya.com/blog/2018/07/introductory-guide-maximum-likelihood-estimation-case-study-r/ https://stats.stackexchange.com/questions/88697/sample-from-a-custom-continuous-distribution-in-r