La densidad es f(x; theta) = (theta+1) * x^theta para 0<x<1 y theta>-1.
## Datos
x <- c(0.92,0.79,0.90,0.65,0.86,0.47,0.73,0.97,0.94,0.77)
n <- length(x)
xbar <- mean(x)
## a) Método de los Momentos
theta_MM <- (2*xbar - 1)/(1 - xbar)
## b) Máxima Verosimilitud (fórmula cerrada)
theta_MLE <- -n/sum(log(x)) - 1
## Log-verosimilitud escalar (θ > -1)
logLik_scalar <- function(theta, x){
if (theta <= -1) return(-Inf)
n <- length(x)
n*log(theta + 1) + theta*sum(log(x))
}
## Vectorizar para evaluar en rejilla
logLik_vec <- Vectorize(function(t) logLik_scalar(t, x))
## Gráfico: verosimilitud relativa a su máximo (para que escale lindo)
theta_grid <- seq(-0.99, max(10, theta_MLE*2 + 2), length.out = 500)
L_rel <- exp(logLik_vec(theta_grid) - logLik_scalar(theta_MLE, x))
plot(theta_grid, L_rel, type = "l", lwd = 2,
xlab = expression(theta), ylab = "L(theta) relativa",
main = "Verosimilitud para f(x;theta) = (theta+1)*x^theta")
abline(v = theta_MLE, lty = 2)
legend("topright",
legend = bquote(hat(theta)[MLE] == .(round(theta_MLE,4))),
lty = 2, bty = "n")
## Resultados mínimos
cat("Media muestral:", round(xbar,4), "\n")
## Media muestral: 0.8
cat("theta^ (MM):", round(theta_MM,4), "\n")
## theta^ (MM): 3
cat("theta^ (MLE):", round(theta_MLE,4), "\n")
## theta^ (MLE): 3.1161
set.seed(123) # reproducible
x <- runif(12, 0, 8) # reemplazá por tus datos si querés
n <- length(x)
xbar <- mean(x)
xmax <- max(x)
## a) Método de Momentos
a_MM <- 2 * xbar
## b) Máxima Verosimilitud (a_MLE = max(x))
a_MLE <- xmax
## Verosimilitud relativa (vectorizada)
logLik_scalar <- function(a, x){
if (a < max(x)) return(-Inf)
-length(x) * log(a)
}
logLik_vec <- Vectorize(function(a) logLik_scalar(a, x))
L_rel <- function(a) exp(logLik_vec(a) - logLik_scalar(a_MLE, x))
## Grilla y gráfico
agrid <- seq(max(1e-6, xmax*0.8), max(xmax*6, 10), length.out = 500)
plot(agrid, L_rel(agrid), type = "l", lwd = 2,
xlab = "a", ylab = "L(a) relativa",
main = "Verosimilitud para X ~ Uniforme(0, a)")
abline(v = a_MLE, lty = 2)
legend("topright",
legend = bquote(hat(a)[MLE] == .(round(a_MLE,4)) ~ "; " ~ hat(a)[MM] == .(round(a_MM,4))),
bty = "n")
## Resultados en consola
cat("Media muestral =", round(xbar,4), "\n")
## Media muestral = 4.7951
cat("a_MM =", round(a_MM,4), "\n")
## a_MM = 9.5902
cat("a_MLE =", round(a_MLE,4), "\n")
## a_MLE = 7.6547
Cómo usar: guardá este archivo con extensión
.Rmd
(link directo abajo), abrilo en RStudio y hacé
Knit.