Muestra de una distribución Normal, pero no tienen en cuenta todos los valores aleatorios
caen fuera del rango especificado antes de simulaciones.
Este método es correcto, pero, como es mencionado por @Xi'an en su respuesta, tomaría mucho tiempo cuando el rango es pequeño (más precisamente, cuando su medida es pequeño debajo de la distribución normal).
Como cualquier otro tipo de distribución, se podría utilizar el método de inversión de $F^{-1}(U)$ (también se llama inversa de la transformación de muestreo), donde $F$ es la función acumulativa de la distribución de los intereses y $U\sim\text{Unif}(0,1)$. Al $F$ es la distribución obtenida mediante el truncamiento de algunos de distribución de $G$ en algunos intervalo de $(a,b)$, esto es equivalente a la de la muestra $G^{-1}(U)$$U\sim\text{Unif}\bigl(G(a),G(b)\bigr)$.
Sin embargo, y esto ya es mencionado por @Xi an en un comentario, para algunas situaciones de la inversión método requiere una precisa evaluación de la función cuantil $G^{-1}$, y yo añadiría también se requiere un rápido cálculo de $G^{-1}$. Al $G$ es una distribución normal, la evaluación de las $G^{-1}$ es bastante lento, y no es muy preciso, para que los valores de $a$ $b$ fuera de la "gama" de $G$.
Simular un truncado de distribución utilizando la importancia de muestreo
Una posibilidad es utilizar importancia de muestreo. Considere el caso en el estándar de la distribución Gaussiana ${\cal N}(0,1)$. Olvidar la anterior anotación, ahora vamos a $G$ ser la distribución de Cauchy. Las dos mencionadas cumplimiento de los requisitos para $G$ : simplemente se ha $\boxed{G(q)=\frac{\arctan(q)}{\pi}+\frac12}$$\boxed{G^{-1}(q)=\tan\bigl(\pi(q-\frac12)\bigr)}$. Por lo tanto, la truncada distribución de Cauchy es fácil de probar por la inversión de método y es una buena elección de la variable instrumental de la importancia de muestreo de la distribución normal truncada.
Después de un poco de simplificaciones, muestreo $U\sim\text{Unif}\bigl(G(a),G(b)\bigr)$ y teniendo en $G^{-1}(U)$ es equivalente a tomar $\tan(U')$$U'\sim\text{Unif}\bigl(\arctan(a),\arctan(b)\bigr)$:
a <- 1
b <- 5
nsims <- 10^5
sims <- tan(runif(nsims, atan(a), atan(b)))
Ahora uno tiene que calcular el peso de cada valor muestreado $x_i$, definido como el cociente $\phi(x)/g(x)$ de los dos densidades de hasta normalización, por lo tanto podemos tomar
$$
w(x) = \exp(-x^2/2)(1+x^2),
$$
pero podría ser más seguro para tener el registro de los pesos:
log_w <- -sims^2/2 + log1p(sims^2)
w <- exp(log_w) # unnormalized weights
w <- w/sum(w)
La muestra ponderada $(x_i,w(x_i))$ permite estimar la medida de cada intervalo de $[u,v]$ por debajo del objetivo de la distribución, sumando los pesos de cada valor muestreado de caer dentro del intervalo:
u <- 2; v<- 4
sum(w[sims>u & sims<v])
## [1] 0.1418
Esto proporciona una estimación de la meta acumulada de la función.
Podemos obtener rápidamente y la trama con la spatsat
paquete de:
F <- spatstat::ewcdf(sims,w)
# estimated F:
curve(F(x), from=a-0.1, to=b+0.1)
# true F:
curve((pnorm(x)-pnorm(a))/(pnorm(b)-pnorm(a)), add=TRUE, col="red")
# approximate probability of u<x<v:
F(v)-F(u)
## [1] 0.1418
Por supuesto, la muestra $(x_i)$ definitivamente no es una muestra de la distribución de destino, sino de la instrumental de Cauchy de distribución, y se obtiene una muestra de la distribución de destino mediante la realización ponderado de remuestreo, por ejemplo utilizando el muestreo multinomial:
msample <- rmultinom(1, nsims, w)[,1]
resims <- rep(sims, times=msample)
hist(resims)
mean(resims>u & resims<v)
## [1] 0.1446
Otro método: rápido inversa de la transformación de muestreo
Olver y Townsend desarrollado un método de muestreo para una amplia clase de una distribución continua. Se implementa en el chebfun2 biblioteca para Matlab así como la ApproxFun biblioteca para Julia. Recientemente he descubierto esta biblioteca y suena muy prometedor (no sólo para el muestreo aleatorio). Básicamente esta es la inversión de método, pero el uso de potentes aproximaciones de la cdf y la inversa de la cdf. La entrada es el destino de la función de densidad hasta la normalización.
La muestra es simplemente generados por el siguiente código:
using ApproxFun
f = Fun(x -> exp(-x.^2./2), [1,5]);
nsims = 10^5;
x = sample(f,nsims);
Como se comprueba a continuación, se obtiene un estimado de la medida del intervalo de $[2,4]$ cerca el uno obtenidos anteriormente por la importancia de muestreo:
sum((x.>2) & (x.<4))/nsims
## 0.14191