Paso 0: Parte teórica
Si tenemos la función de densidad de una distribución exponencial
\[ f(x;\theta)=\theta e^{-\theta x}
\]
Además de una muestra independiente e identicamente distrubuida como la siguiente:
\[x_1,x_2,...,x_n \]
Podemos construir la siguiente función de verosimilitud:
\[ L(\theta)=\prod_{i=1}^{n}\theta
e^{-\theta x_i} \]
Lo cual se puede simplificar a una función con una sola sumatoria de la siguiente forma:
\[ L(\theta)=(\theta )^{n}e^{-\sum_{i=1}^n
\theta * x_i} \]
Para simplificarlo más podemos aplicar logaritmo quedandonos:
\[ ln(L(\theta))=n*ln(\theta ) - \sum_{i=1}^n \theta * x_1 \]
Derivando nos queda:
\[
\frac{dln(\theta)}{d\theta}=\frac{n}{\theta}- \sum_{i=1}^n x_1 \]
Que igualado a 0 para maximizar nos queda:
\[ \theta = \frac{n}{\sum_{i=1}^n x_1}
\]
Reordenamos la fracción de manera conveniente quedando:
\[ \theta = \frac{1}{\frac{\sum_{i=1}^n
x_1}{n}} \]
Pero sabemos que la sumatoria de los elementos de una muestra, dividida en el número de elementos de la misma, es el promedio; debido a todo lo anterior el estimador de máxima verosimilitud será:
\[ \hat{\theta}_{MV} = \frac{1}{\bar{x}}
\]
Ya habiendo obtenido lo anterior, volvamos a lo que nos compete, la estimación del mismo en r.
Paso 1: Generación de datos
N = 1500 # Tamaño de la muestra
theta = 5
DT <- data.table (X = rexp(N,16000))Paso 2: Derivar función de verosimilitud
\[ ln(L(\theta))=n*ln(\theta ) - \sum_{i=1}^n \theta * x_1 \]
ll <- function(theta,X){
N <- length(X)
-1 * N * log(theta) + (theta * sum(X)) # Notar que la función de ln(L(theta)) se multiplico por -1 para el posterior uso de optim para buscar un máximo.
}
log_like_graph <- function(theta){
X <- as.matrix(DT$X)
N <- nrow(X)
N * log(theta) + theta * sum(X)
}
log_like_graph <- Vectorize(log_like_graph)
theta_vals <- seq(0,1,by=0.01)
log_vals <- log_like_graph(theta_vals)
plot(theta_vals, log_vals)Paso 3: Estimación por máxima verosimilitud
MLE_estimates <- optim(fn=ll, # Función a minimizar (con el -1 puesto previamente estariamos maximizando la real)
par = 0, # Valor inicial para theta
lower = 0.000000000001, # Valor mínimo para theta
upper = Inf, # Valor máximo para theta
method = "L-BFGS-B",
hessian = TRUE,
X = DT$X)
MLE_par <- MLE_estimates$par
MLE_SE <- sqrt(diag(solve(MLE_estimates$hessian)))
MLE <- data.table(theta = c("theta"),
estimates = MLE_par,
sd = MLE_SE)
kable(MLE)| theta | estimates | sd |
|---|---|---|
| theta | 15744.55 | 468.9374 |
Paso 4: Graficar estimaciones
log_like_graph_theta <- function(theta){
theta = MLE_par
X <- as.matrix(DT$X)
N <- nrow(X)
N * log(theta) + theta * sum(X)
}
# Vectorizar
log_like_graph_theta <- Vectorize(log_like_graph_theta)
# Gráficar
theta <- ggplot(data = data.frame(theta=0), mapping = aes(theta = theta)) +
stat_function(fun = log_like_graph_theta) + xlim(-1,1) + theme_bw() + xlab("theta") + ylab("log_like")
print(theta)