La distribución normal multivariada de es esféricamente simétrica. La distribución que busca trunca el radio continuación en . Debido a que este criterio depende solo de la longitud de , la distribución truncada permanece esféricamente simétrica. Como es independiente del ángulo esféricoy tiene un de distribución , por lo tanto, se puede generar valores de la distribución truncada en tan sólo unos sencillos pasos:Xρ=||X||2aXρX/||X||ρσχ(n)
Genere .X∼N(0,In)
Genere como la raíz cuadrada de una truncada en .Pχ2(d)(a/σ)2
Deje.Y=σPX/||X||
En el paso 1, se obtiene como una secuencia de realizaciones independientes de una variable normal estándar.Xd
En el paso 2, se genera fácilmente invirtiendo la función cuantil de una : genera una variable uniforme soportada en el rango (de cuantiles) entre y y establezca .PF−1χ2(d)UF((a/σ)2)1P=F(U)−−−−−√
Aquí hay un histograma de tales realizaciones independientes de para en dimensiones, truncadas a continuación en . Se tardó aproximadamente un segundo en generar, lo que demuestra la eficacia del algoritmo.105σPσ=3n=11a=7
La curva roja es la densidad de una truncada de escalada por . Su estrecha coincidencia con el histograma es evidencia de la validez de esta técnica.χ(11)σ=3
Para obtener una intuición para el truncamiento, considere el caso , en dimensiones. Aquí hay un diagrama de dispersión de contra (para realizaciones independientes). Muestra claramente el agujero en el radio :a=3σ=1n=2Y2Y1104a
Finalmente, tenga en cuenta que (1) los componentes deben tener distribuciones idénticas (debido a la simetría esférica) y (2) excepto cuando , esa distribución común no es Normal. De hecho, como crece grande, la rápida disminución de la (univariado) distribución Normal causa la mayoría de la probabilidad de que la multivariable esférica truncada normal a agruparse cerca de la superficie de la -sphere (de radio de ). Por lo tanto, la distribución marginal debe aproximarse a una distribución Beta simétrica a escala concentrada en el intervalo . Esto es evidente en el diagrama de dispersión anterior, dondeXia=0an−1a((n−1)/2,(n−1)/2)(−a,a)a=3σya es grande en dos dimensiones: los puntos forman un anillo (una esfera ) de radio .2−13σ
Aquí hay histogramas de las distribuciones marginales de una simulación de tamaño en dimensiones con , (para el cual la distribución aproximada de Beta es uniforme):1053a=10σ=1(1,1)
Como los primeros marginales del procedimiento descrito en la pregunta son normales (por construcción), ese procedimiento no puede ser correcto.n−1
El siguiente R
código generó la primera figura. Se construye a pasos paralelos 1-3 para la generación de . Fue modificada para generar la segunda cifra por variables cambiantes , , , y a continuación, emite el comando parcela después fue generado.Ya
d
n
sigma
plot(y[1,], y[2,], pch=16, cex=1/2, col="#00000010")
y
La generación de se modifica en el código para una mayor resolución numérica: el código genera en realidad y usos que para calcular .U1−UP
La misma técnica de simular datos de acuerdo con un supuesto algoritmo, resumirlos con un histograma y superponer un histograma puede usarse para probar el método descrito en la pregunta. Confirmará que el método no funciona como se esperaba.
a <- 7 # Lower threshold
d <- 11 # Dimensions
n <- 1e5 # Sample size
sigma <- 3 # Original SD
#
# The algorithm.
#
set.seed(17)
u.max <- pchisq((a/sigma)^2, d, lower.tail=FALSE)
if (u.max == 0) stop("The threshold is too large.")
u <- runif(n, 0, u.max)
rho <- sigma * sqrt(qchisq(u, d, lower.tail=FALSE))
x <- matrix(rnorm(n*d, 0, 1), ncol=d)
y <- t(x * rho / apply(x, 1, function(y) sqrt(sum(y*y))))
#
# Draw histograms of the marginal distributions.
#
h <- function(z) {
s <- sd(z)
hist(z, freq=FALSE, ylim=c(0, 1/sqrt(2*pi*s^2)),
main="Marginal Histogram",
sub="Best Normal Fit Superimposed")
curve(dnorm(x, mean(z), s), add=TRUE, lwd=2, col="Red")
}
par(mfrow=c(1, min(d, 4)))
invisible(apply(y, 1, h))
#
# Draw a nice histogram of the distances.
#
#plot(y[1,], y[2,], pch=16, cex=1/2, col="#00000010") # For figure 2
rho.max <- min(qchisq(1 - 0.001*pchisq(a/sigma, d, lower.tail=FALSE), d)*sigma,
max(rho), na.rm=TRUE)
k <- ceiling(rho.max/a)
hist(rho, freq=FALSE, xlim=c(0, rho.max),
breaks=seq(0, max(rho)+a, by=a/ceiling(50/k)))
#
# Superimpose the theoretical distribution.
#
dchi <- function(x, d) {
exp((d-1)*log(x) + (1-d/2)*log(2) - x^2/2 - lgamma(d/2))
}
curve((x >= a)*dchi(x/sigma, d) / (1-pchisq((a/sigma)^2, d))/sigma, add=TRUE,
lwd=2, col="Red", n=257)