knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)
En cada caso, genere las variables aleatorias y compárelas con la función de densidad. (a) Variables aleatorias normales utilizando un candidato de Cauchy en Aceptar-Rechazar; (b) Variables aleatorias Gamma Ga(4.3, 6.2) utilizando un Gamma Ga(4, 7); (c) Normal truncada: Normal estándar truncada a (2,\(\infty\)).
# Método de Aceptación y Rechazo en R
# Definir la densidad objetivo (Normal estándar)
fxNormal <- function(x) {
return(dnorm(x))
}
# Definir la densidad auxiliar (Cauchy estándar)
fxCauchy <- function(x) {
return(dcauchy(x))
}
# Encontrar la constante M
opt_res <- optimize(f = function(x) dnorm(x) / dcauchy(x), maximum = TRUE, interval = c(-5, 5))
M <- opt_res$objective
# Generación por Aceptación y Rechazo
n <- 1000
X <- numeric(n)
for (i in 1:n) {
repeat {
y <- rcauchy(1)
u <- runif(1)
if (M * u * dcauchy(y) <= dnorm(y)) {
X[i] <- y
break
}
}
}
hist(X, breaks = "FD", freq = FALSE, main = "Normal, AUX_Cauchy", col = "lightgray")
curve(dnorm(x), col = "cyan", lwd = 2, add = TRUE)
fxGamma <- function(x) {
return(dgamma(x, shape = 4.3, rate = 6.2))
}
fxGammaAux <- function(x) {
return(dgamma(x, shape = 4, rate = 7))
}
opt_res <- optimize(f = function(x) dgamma(x, shape = 4.3, rate = 6.2) / dgamma(x, shape = 4, rate = 7),
maximum = TRUE, interval = c(0, 2))
M <- opt_res$objective
X <- numeric(n)
for (i in 1:n) {
repeat {
y <- rgamma(1, shape = 4, rate = 7)
u <- runif(1)
if (M * u * fxGammaAux(y) <= fxGamma(y)) {
X[i] <- y
break
}
}
}
hist(X, breaks = "FD", freq = FALSE, main = "Gamma(4.3,6.2) AUX_Gamma(4,7)", col = "lightgray")
curve(dgamma(x, shape = 4.3, rate = 6.2), col = "cyan", lwd = 2, add = TRUE)
fxTruncNorm <- function(x) {
return(dnorm(x) / (1 - pnorm(2)))
}
fxAux <- function(x) {
return(dnorm(x, mean = 2, sd = 1))
}
opt_res <- optimize(f = function(x) fxTruncNorm(x) / fxAux(x), maximum = TRUE, interval = c(2, 5))
M <- opt_res$objective
# Generación por Aceptación y Rechazo
X <- numeric(n)
for (i in 1:n) {
repeat {
y <- rnorm(1, mean = 2, sd = 1)
if (y >= 2) {
u <- runif(1)
if (M * u * fxAux(y) <= fxTruncNorm(y)) {
X[i] <- y
break
}
}
}
}
# Graficar la comparación
hist(X, breaks = "FD", freq = FALSE, main = "Truncated Normal (2,∞)", col = "lightgray")
curve(fxTruncNorm(x), col = "cyan", lwd = 2, add = TRUE)
2.5 Para cada una de las siguientes distribuciones, calcule la forma explícita de la función de distribución y muestre cómo implementar su generación a partir de una variable aleatoria uniforme: (a) exponencial; (b) doble exponencial; (c) Weibull; (d) Pareto; (e) Cauchy; (f) valor extremo; (g) arcoseno.
La CDF de una variable \(X \sim Exp(\lambda)\) es: \[ F(x) = 1 - e^{-\lambda x}, \quad x \geq 0 \] La inversa se obtiene despejando \(x\): \[ F^{-1}(u) = -\frac{\log(1 - u)}{\lambda} \]
generate_exp <- function(n, lambda) {
u <- runif(n)
x <- -log(1 - u) / lambda
return(x)
}
set.seed(123)
data_exp <- generate_exp(1000, lambda = 2)
hist(data_exp, probability = TRUE, main = "Distribucion Exponencial", breaks = "FD" ,
xlab = "x", col = "brown", border = "black")
curve(dexp(x, rate = 2), add = TRUE, col = "cyan", lwd = 2)
La CDF de la distribución Laplace con media 0 y escala \(b\) es: \[ F(x) = \begin{cases} \frac{1}{2} e^{x/b}, & x < 0 \\ 1 - \frac{1}{2} e^{-x/b}, & x \geq 0 \end{cases} \] La inversa se obtiene resolviendo \(u = F(x)\): \[ F^{-1}(u) = \begin{cases} b \log(2u), & u < 0.5 \\ -b \log(2(1-u)), & u \geq 0.5 \end{cases} \]
generate_laplace <- function(n, b) {
u <- runif(n)
x <- ifelse(u < 0.5, b * log(2 * u), -b * log(2 * (1 - u)))
return(x)
}
set.seed(101)
data_laplace <- generate_laplace(1000, b = 1)
hist(data_laplace, probability = TRUE, main = "Distribucion Laplace",
xlab = "x", col = "brown", border = "black", breaks = "FD")
curve((1/2) * exp(-abs(x)), add = TRUE, col = "cyan", lwd = 2)
La CDF es: \[ F(x) = 1 - e^{-(x/\lambda)^k}, \quad x \geq 0 \] La inversa es: \[ F^{-1}(u) = \lambda (-\log(1 - u))^{1/k} \]
generate_weibull <- function(n, lambda, k) {
u <- runif(n)
x <- lambda * (-log(1 - u))^(1/k)
return(x)
}
set.seed(123)
data_weibull <- generate_weibull(1000, lambda = 1, k = 2)
hist(data_weibull, probability = TRUE, main = "Distribucion Weibull",
xlab = "x", col = "brown", border = "black", breaks = "FD")
curve(dweibull(x, shape = 2, scale = 1), add = TRUE, col = "cyan", lwd = 2)
La CDF es: \[ F(x) = 1 - \left( \frac{x_m}{x} \right)^\alpha, \quad x \geq x_m \] La inversa es: \[ F^{-1}(u) = x_m (1 - u)^{-1/\alpha} \]
generate_pareto <- function(n, xm, alpha) {
u <- runif(n)
x <- xm * (1 - u)^(-1/alpha)
return(x)
}
set.seed(123)
data_pareto <- generate_pareto(1000, xm = 1, alpha = 2)
hist(data_pareto, probability = TRUE, main = "Distribucion Pareto", breaks = "FD" ,
xlab = "x", col = "brown", border = "black", xlim = c(1, 10))
#curve(dpareto(x, 1, 2), add = TRUE, col = "cyan", lwd = 2)
curve(2 * 1^2 / x^(2 + 1), add = TRUE, col = "cyan", lwd = 2)
La CDF es: \[ F(x) = \frac{1}{\pi} \tan^{-1}(x) \] La inversa es: \[ F^{-1}(u) = \tan(\pi (u - 0.5)) \]## 2. Solucione los ejercicios 3.1, 3.11 del Capítulo 3 pág. 110-112 del libro [1]. Implemente si el ejercicio lo amerita.
generate_cauchy <- function(n) {
u <- runif(n)
x <- tan(pi * (u - 0.5))
return(x)
}
set.seed(101)
data_cauchy <- generate_cauchy(1000)
hist(data_cauchy, probability = TRUE, main = "Distribucion Cauchy",
xlab = "x", col = "brown", border = "black", xlim = c(-10, 10), breaks = "FD")
curve(dcauchy(x), add = TRUE, col = "cyan", lwd = 2)
La CDF es: \[ F(x) = e^{-e^{-(x - \mu)/\sigma}} \] La inversa es: \[ F^{-1}(u) = \mu - \sigma \log(-\log u) \]
generate_extreme_value <- function(n) {
u <- runif(n)
x <- -log(-log(u))
return(x)
}
set.seed(123)
data_extreme <- generate_extreme_value(1000)
hist(data_extreme, probability = TRUE, main = "Distribucion de Valor Extremo",
xlab = "x", col = "brown", border = "black", breaks = "FD")
La CDF es:
\[ F(x) = \frac{2}{\pi} \arcsin(\sqrt{x}) \]
La inversa es:
\[ F^{-1}(u) = \sin^2(\frac{\pi}{2} u) \]
generate_arcsine <- function(n) {
u <- runif(n)
x <- sin(pi * u / 2)^2
return(x)
}
set.seed(123)
data_arcsine <- generate_arcsine(1000)
hist(data_arcsine, probability = TRUE, main = "DistribuciOn Arcsine",
xlab = "x", col = "brown", border = "black", breaks = "FD")
curve(1 / (pi * sqrt(x * (1 - x))), add = TRUE, col = "cyan", lwd = 2)
Para el estimador Bayesiano Normal-Cauchy:
\[ \delta(x) = \frac{\int_{-\infty}^{\infty} \frac{\theta}{1+\theta^2} e^{-\frac{(x-\theta)^2}{2}} d\theta}{\int_{-\infty}^{\infty} \frac{1}{1+\theta^2} e^{-\frac{(x-\theta)^2}{2}} d\theta} \]
(a) Graficar el integrando y utilizar integración de Monte Carlo para calcular la integral.
# Definir la función integrando
integrand_num <- function(theta, x=0) {
(theta / (1 + theta^2)) * exp(- (x - theta)^2 / 2)
}
integrand_den <- function(theta, x=0) {
(1 / (1 + theta^2)) * exp(- (x - theta)^2 / 2)
}
# Parámetro x
x_val <- 0
# Graficar la función integrando
theta_seq <- seq(-5, 5, length.out = 1000)
num_values <- sapply(theta_seq, integrand_num, x = x_val)
den_values <- sapply(theta_seq, integrand_den, x = x_val)
plot(theta_seq, num_values, type = "l", col = "blue", lwd = 2,
ylab = "Integrand", xlab = "Theta", main = "Integrand Functions", ylim = c(-0.5, 1))
lines(theta_seq, den_values, col = "red", lwd = 2)
legend("topright", legend = c("Numerador", "Denominador"),
col = c("blue", "red"), lwd = 2)
Para realizar la aproximacion del cocientes de integrales, se realizará el calculo por separado de cada integral, observando las dos funciones que hay en cada integral podemos definir f(x) y h(x), donde logramos identificar que el termino \(\frac{1}{1+\theta^2}\), \(-\infty<\theta<\infty\) corresponde a una cuasi-densidad. ya que al integrar sobre todos los valores de \(\theta\), obtenemos la constante de normalización que es igual a \(\pi\). De lo anterior logramos ver que f(x) con su correspondiente constante de normalización es la funcion de densidad de la distribución Cauchy-estandardonde \(x_0 = 0, \gamma = 1\).
Por lo tanto usando el metodo de la tranformada inversa simularemos realizaciones de la distribucion Cauchy-estandar, para usarla en el calculo de la media empirica.
n_muestras <-100
#Implementacion de la tranformada inversa.
inverCauchy <- function (u){
return(tan(pi*(u-(1/2))))
}
#Para generar la misma información.
set.seed(101)
u <- runif(n_muestras)
Fiu <- inverCauchy(u)
# Función de densidad de la Cauchy.
fdCauchy <- function (x){
return(1/(pi*(1+x^2)))
}
hist(Fiu, breaks = "FD" , freq = FALSE, main = "")
curve(fdCauchy(x),add = TRUE)
La aproximacion para la intregral del denominador es: \({\int_{-\infty}^{\infty} \frac{1}{1+\theta^2} e^{-\frac{(x-\theta)^2}{2}} d\theta}\), donde \(f(\theta)= \frac{1}{\pi(1+\theta^2)}\) y \(h(\theta)= e^{-\frac{(x-\theta)^2}{2}}\)
n_muestras <- 1000
u <- runif(n_muestras)
Fiu <- inverCauchy(u)
h_theta <- function(theta, x){exp(- (x - theta)^2 / 2)}
estimacion_den <- mean(h_theta(Fiu, x=0)) ; estimacion_den
## [1] 0.5236165
La aproximacion para la intregral del nuemerador es: \(\int_{-\infty}^{\infty} \frac{\theta}{1+\theta^2} e^{-\frac{(x-\theta)^2}{2}} d\theta\), donde \(f(\theta)= \frac{1}{\pi(1+\theta^2)}\) y \(h(\theta)= \theta e^{-\frac{(x-\theta)^2}{2}}\)
h_theta <- function(theta, x){theta * exp(- (x - theta)^2 / 2)}
estimacion_num <- mean(h_theta(Fiu, x=0)) ; estimacion_num
## [1] -0.01405673
La aproximación para el Estimador Bayesiano Normal-Cauchy, que corresponde al cociente de las integrales calculadas anteriormente es:
Delta <- estimacion_num/estimacion_den ; Delta
## [1] -0.02684547
theta_samples <- Fiu
x_val <- 0
n_samples <- 1000
se_num <- sd(integrand_num(theta_samples, x_val)) / sqrt(n_samples)
se_den <- sd(integrand_den(theta_samples, x_val)) / sqrt(n_samples)
se_estimator <- sqrt((se_num / estimacion_den)^2 + (estimacion_num * se_den / estimacion_den^2)^2)
# Tolerancia para tres dígitos de precisión con 95% de confianza
z_value <- qnorm(0.975) # Valor crítico para 95% de confianza
precision_required <- 0.001 # Tres dígitos de precisión
n_required <- (z_value * se_estimator / precision_required)^2
n_required
## [1] 688.0323
# Monitoreo de la convergencia
cum_estimates <- cumsum(integrand_num(Fiu, x_val)) / (1:n_samples)
plot(1:n_samples, cum_estimates, type="l", col="blue", lwd=2,
ylab="Estimador acumulado", xlab="Número de muestras",
main="Convergencia del Estimador (Cauchy)")
# Monitoreo de la convergencia
cum_estimates <- cumsum(integrand_den(Fiu, x_val)) / (1:n_samples)
plot(1:n_samples, cum_estimates, type="l", col="green", lwd=2,
ylab="Estimador acumulado", xlab="Número de muestras",
main="Convergencia del Estimador (Cauchy)")
(b) Monitorear la convergencia con el error estándar de la estimación. Obtener tres cifras decimales de precisión con una probabilidad de 0.95.
set.seed(101)
#n_muestras <- 1000
#Cauchy sample
x <- 0
fbar=cumsum(Fiu*exp(-(x-Fiu)^2/2))/(1:n_muestras)
sigf=(cumsum(Fiu^2*exp(-(x-Fiu)^2))/(1:n_muestras))-fbar^2
gbar=cumsum(exp(-(x-Fiu)^2/2))/(1:n_muestras)
sigg=(cumsum(exp(-(x-Fiu)^2))/(1:n_muestras))-gbar^2
glob=sqrt(((sigf/gbar^2)+(sigg*fbar^2/gbar^4))/(1:n_muestras))
plot(fbar/gbar,type="l",xlab="n",ylab=expression(delta[n](x)),
col="cyan3",lwd=2 , ylim = c(-0.3,1))
lines(fbar/gbar-2*glob,col="cyan",lty=2, ylim = c(-0.3,1))
lines(fbar/gbar+2*glob,col="cyan",lty=2, ylim = c(-0.3,1))
La distribución log-normal $ X LN(, ^2)$ se define como aquella donde el logaritmo natural de la variable sigue una distribución normal:
\[ Y = \log(X) \sim N(\mu, \sigma^2) \]
Queremos calcular su primer momento, es decir, la esperanza matemática:
\[ E[X] = \int_0^{\infty} x f(x) dx \]
donde la función de densidad de probabilidad (PDF) de \(X\) es:
\[ f(x) = \frac{1}{x \sqrt{2 \pi \sigma^2}} \exp\left( -\frac{(\log x - \mu)^2}{2\sigma^2} \right), \quad x > 0. \]
La esperanza matemática está dada por:
\[ E[X] = \int_0^{\infty} x \frac{1}{x \sqrt{2 \pi \sigma^2}} \exp\left( -\frac{(\log x - \mu)^2}{2 \sigma^2} \right) dx. \]
Simplificando:
\[ E[X] = \int_0^{\infty} \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left( -\frac{(\log x - \mu)^2}{2 \sigma^2} \right) dx. \]
Ahora hacemos el cambio de variable o sustitucion:
\[ u = \log x \Rightarrow du = \frac{dx}{x}, \quad \text{por lo que } dx = e^u du. \]
La integral puede reescribirse en términos de la variable $ u $, lo que implica un cambio en los límites de integración.
Cuando $ x $, entonces $ u -$.
Cuando $ x $, entonces $ u $.
Esto nos permite reescribir la integral con los nuevos límites de $ u $, transformando la integral original en una forma más manejable para su resolución.
Reescribimos la integral en términos de \(u\):
\[ E[X] = \int_{-\infty}^{\infty} \frac{e^u}{\sqrt{2\pi\sigma^2}} \exp\left( -\frac{(u - \mu)^2}{2\sigma^2} \right) du. \]
En el exponente de la exponencial vamos a Completar el Cuadrado:
\[ -\frac{(u - \mu)^2}{2 \sigma^2} + u. \]
Reescribimos $ u $:
\[ -\frac{(u - \mu)^2}{2 \sigma^2} + \frac{2\sigma^2}{2\sigma^2} u. \]
Factorizamos $ $:
\[ -\frac{1}{2\sigma^2} \left[(u - \mu)^2 - 2\sigma^2 u\right]. \]
Expandimos el término cuadrático $(u - )^2 $:
\[ -\frac{(u - \mu)^2}{2\sigma^2} = -\frac{u^2 - 2\mu u + \mu^2}{2\sigma^2} = -\frac{u^2}{2\sigma^2} + \frac{\mu u}{\sigma^2} - \frac{\mu^2}{2\sigma^2}. \]
Ahora tenemos:
\[ -\frac{u^2}{2\sigma^2} + \frac{\mu u}{\sigma^2} - \frac{\mu^2}{2\sigma^2} + \frac{2\sigma^2}{2\sigma^2} u. \]
Agrupamos los términos de \(u\):
\[ -\frac{u^2}{2\sigma^2} + 2\left(\mu + \sigma^2\right) \frac{u}{2\sigma^2} - \frac{\mu^2}{2\sigma^2}. \]
Ahora completamos el cuadrado dentro del exponente:
\[ -\frac{(u - (\mu + \sigma^2))^2}{2\sigma^2} + \frac{\left(\mu + \sigma^2\right)^2}{2\sigma^2} - \frac{\mu^2}{2\sigma^2}. \]
Esto se simplifica a:
\[ -\frac{(u - (\mu + \sigma^2))^2}{2\sigma^2} + \mu + \frac{\sigma^2}{2}. \]
Reescribiendo la integral:
\[ E[X] = \int_{-\infty}^{\infty} \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left( -\frac{(u - (\mu + \sigma^2))^2}{2\sigma^2} \right) \exp\left( \mu + \frac{\sigma^2}{2} \right) du. \]
La primera parte de la integral es la densidad de una normal estándar, que integra a 1. Por lo tanto:
\[ E[X] = \exp\left(\mu + \frac{\sigma^2}{2}\right). \]
El primer momento de la distribución log-normal es:
\[ E[X] = e^{\mu + \sigma^2/2}. \]
Este resultado muestra que la media de una variable log-normal no es simplemente $ e^$, sino que está influenciada por la varianza $^2 $.
Para calcular el segundo momento de una variable $ X $, utilizamos la definición:
\[ E[X^2] = \int_0^{\infty} x^2 f(x) \, dx \]
La integral para el segundo momento es:
\[ E[X^2] = \int_0^{\infty} x^2 \frac{1}{x \sqrt{2 \pi \sigma^2}} \exp\left( -\frac{(\log x - \mu)^2}{2 \sigma^2} \right) dx \]
Simplificando:
\[ E[X^2] = \int_0^{\infty} \frac{x}{\sqrt{2 \pi \sigma^2}} \exp\left( -\frac{(\log x - \mu)^2}{2 \sigma^2} \right) dx \]
Ahora hacemos el cambio de variable o sustitución:
\[ u = \log x \Rightarrow du = \frac{dx}{x}, \quad \text{por lo que } dx = e^u du \]
La integral puede reescribirse en términos de la variable $ u$, lo que implica un cambio en los límites de integración.
Cuando $ x $, entonces $ u -$.
Cuando $ x $, entonces $ u $.
Esto nos permite reescribir la integral con los nuevos límites de $ u $, transformando la integral original en una forma más manejable para su resolución.
Reescribimos la integral en términos de \(u\):
\[ E[X^2] = \int_{-\infty}^{\infty} \frac{e^{2u}}{\sqrt{2 \pi \sigma^2}} \exp\left( -\frac{(u - \mu)^2}{2 \sigma^2} \right) du \]
Ahora, completamos el cuadrado en el exponente de la exponencial:
\[ -\frac{(u - \mu)^2}{2 \sigma^2} + 2u \]
Reescribimos $ 2u $:
\[ -\frac{(u - \mu)^2}{2 \sigma^2} + \frac{4 \sigma^2}{2 \sigma^2} u \]
Factorizamos $ $:
\[ -\frac{1}{2 \sigma^2} \left[ (u - \mu)^2 - 4 \sigma^2 u \right] \]
Expandimos el término cuadrático $ (u - )^2 $:
\[ -\frac{(u - \mu)^2}{2 \sigma^2} = -\frac{u^2 - 2 \mu u + \mu^2}{2 \sigma^2} = -\frac{u^2}{2 \sigma^2} + \frac{\mu u}{\sigma^2} - \frac{\mu^2}{2 \sigma^2} \]
Ahora tenemos:
\[ -\frac{u^2}{2 \sigma^2} + \frac{2 \mu u}{2\sigma^2} - \frac{\mu^2}{2 \sigma^2} + \frac{4 \sigma^2}{2 \sigma^2} u \]
Agrupamos los términos de \(u\):
\[ -\frac{u^2}{2 \sigma^2} + 2 \left( \mu + 2 \sigma^2 \right) \frac{u}{2 \sigma^2} - \frac{\mu^2}{2 \sigma^2} \]
Completamos el cuadrado dentro del exponente:
\[ -\frac{(u - (\mu + 2 \sigma^2))^2}{2 \sigma^2} + \frac{(\mu + 2 \sigma^2)^2}{2 \sigma^2} - \frac{\mu^2}{2 \sigma^2} \]
Esto se simplifica a:
\[ -\frac{(u - (\mu + 2 \sigma^2))^2}{2 \sigma^2} + \frac{4\mu \sigma^2}{2\sigma^2} + \frac{4(\sigma^2)^2}{2\sigma^2} \]
Reescribimos la integral de la siguiente manera:
\[ E[X^2] = \int_{-\infty}^{\infty} \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left( -\frac{(u - (\mu + 2 \sigma^2))^2}{2 \sigma^2} \right) \exp\left( 2\mu + 2\sigma^2 \right) du \]
La primera parte de la integral es la densidad de una normal, que integra a 1. Por lo tanto:
\[ E[X^2] = \exp\left(2\mu + 2 \sigma^2\right) \]
Finalmente, el segundo momento de la distribución log-normal es:
\[ E[X^2] = e^{2 \mu + 2 \sigma^2} \]
Este resultado muestra que el segundo momento de una variable log-normal depende de $ $ y $ ^2 $.
La varianza de una variable \(X\) es dada por la fórmula:
\[ \text{Var}(X) = E[X^2] - (E[X])^2 \]
Sabemos que el primer momento \(E[X]\) y el segundo momento \(E[X^2]\) de una variable log-normal son:
Sustituyendo en la fórmula de la varianza:
\[ \text{Var}(X) = e^{2\mu + 2\sigma^2} - \left(e^{\mu + \sigma^2 / 2}\right)^2 \]
\[ \text{Var}(X) = e^{2\mu + 2\sigma^2} - e^{2\mu + \sigma^2} \]
Factorizando:
\[ \text{Var}(X) = e^{2\mu + \sigma^2} \left( e^{\sigma^2} - 1 \right) \]
La varianza para una distribución log-normal \(\text{Var}(X)\) se puede expresar como:
\[ \text{Var}(X) = e^{2\mu + \sigma^2} \left( e^{\sigma^2} - 1 \right) \]
# Definir la función de densidad f1(x) proporcional a exp(- (x + 3)^2 / 2)
f1 <- function(x) {
if (x >= 0 & x <= 1) {
return( (1/sqrt(2*pi))*exp(- (x + 3)^2 / 2))
} else {
return(0)
}
}
slice_sampler <- function(n_iter = 1000, x0 = 0.25) {
x <- numeric(n_iter)
x[1] <- x0
for (t in 1:(n_iter - 1)) {
u <- runif(1, min = 0, max = f1(x[t]))
gamma_t <- sqrt(-2 * log(u)) - 3
gamma_t <- min(max(gamma_t, 0), 1)
x[t + 1] <- runif(1, min = 0, max = gamma_t)
}
return(x)
}
muestras <- slice_sampler(n_iter = 1000)
curve( (1/sqrt(2*pi))*exp(- (x + 3)^2 / 2), col = "red", lwd = 2)
plot(muestras, type = "o", col = "blue", pch = 16,
xlab = "Iteraciones", ylab = "Valores muestreados",
main = "Slice Sampling para Normal Truncada N(3,1) en [0,1]", add = TRUE)
hist(muestras, probability = T)
# Crear el gráfico de puntos primero
plot(muestras, type = "o", col = "blue", pch = 16, ylim = c(0, 1),
xlab = "Iteraciones", ylab = "Valores muestreados",
main = "Slice Sampling para Normal Truncada N(3,1) en [0,1]")
# Define la función de densidad objetivo f(x)
f <- function(x) {
if (x >= 0 & x <= 1) {
return(exp(- (x + 3)^2 / 2))
} else {
return(0)
}
}
# Implementación del muestreador por cortes
slice_sampler <- function(n_samples, x_init) {
samples <- numeric(n_samples)
x <- x_init
for (i in 1:n_samples) {
u <- runif(1, min = 0, max = f(x))
upper_bound <- min(1, max(0, sqrt(-2 * log(u)) - 3))
x <- runif(1, min = 0, max = upper_bound)
samples[i] <- x
}
return(samples)
}
set.seed(101)
n_samples <- 50000
x_init <- 0.25
samples <- slice_sampler(n_samples, x_init)
hist(samples, breaks = "FD", probability = T, col = "lightblue",
main = "Muestras generadas por el muestreador por cortes", xlab = "x")