La distribution normale multivariée de est sphériquement symétrique. La distribution que vous recherchez tronque le rayon ci-dessous en . Étant donné que ce critère ne dépend que de la longueur de , la distribution tronquée reste sphérique symétrique. Puisque est indépendant de l'angle sphériqueet a la distribution , vous pouvez donc générer des valeurs de la distribution tronquée en quelques étapes simples de:ρ = | | X | | 2 a X ρ X / | | X | | ρXρ=||X||2aXρX/||X||χ ( n )ρσχ(n)
Générez .X∼N(0,In)
Générez comme racine carrée d'une tronquée en .χ 2 ( d ) ( a / σ ) 2Pχ2(d)(a/σ)2
Soit.Y=σPX/||X||
À l'étape 1, est obtenu comme une séquence de réalisations indépendantes d'une variable normale standard.dXd
À l'étape 2, est facilement généré en inversant la fonction quantile d'une : générer une variable uniforme supportée dans la plage (de quantiles) entre et et définissez .F - 1 χ 2 ( d ) U F ( ( a / σ ) 2 ) 1 P = √PF−1χ2(d)UF((a/σ)2)1P=F(U)−−−−−√
Voici un histogramme de telles réalisations indépendantes de pour en dimensions, tronquées ci-dessous à . Il a fallu environ une seconde pour générer, attestant de l'efficacité de l'algorithme. σ P σ = 3 n = 11 a = 7105σPσ=3n=11a=7
La courbe rouge est la densité d'une tronquée mise à l'échelle par . Sa correspondance étroite avec l'histogramme prouve la validité de cette technique.σ = 3χ(11)σ=3
Pour obtenir une intuition pour la troncature, considérons le cas , dans dimensions. Voici un nuage de points de contre (pour réalisations indépendantes). Il montre clairement le trou au rayon :σ = 1 n = 2 Y 2 Y 1 10 4 aa=3σ=1n=2Y2Y1104a
Enfin, notez que (1) les composants doivent avoir des distributions identiques (en raison de la symétrie sphérique) et (2) sauf lorsque , cette distribution commune n'est pas normale. En fait, à mesure grandit, la diminution rapide de la distribution normale (univariée) fait que la plupart des probabilités que la normale multivariée tronquée sphérique se regroupent près de la surface de la sphère (de rayon ). La distribution marginale doit donc se rapprocher d'une distribution symétrique Beta concentrée dans l'intervalle . Ceci est apparent dans le diagramme de dispersion précédent, oùXia=0an−1a((n−1)/2,(n−1)/2)(−a,a)a=3σest déjà grand en deux dimensions: les points limn un anneau (une sphère ) de rayon .2−13σ
Voici des histogrammes des distributions marginales d'une simulation de taille en dimensions avec , (pour laquelle la distribution approximative Beta est uniforme):1053a=10σ=1(1,1)
Étant donné que les premiers marginaux de la procédure décrite dans la question sont normaux (par construction), cette procédure ne peut pas être correcte.n−1
Le R
code suivant a généré la première figure. Il est conçu pour des mesures parallèles 1-3 pour générer . Il a été modifié pour générer le deuxième chiffre par des variables changeantes , , et puis de lancer la commande plot après a été généré.Ya
d
n
sigma
plot(y[1,], y[2,], pch=16, cex=1/2, col="#00000010")
y
La génération de est modifié dans le code de résolution numérique plus élevé: le code génère effectivement et l' utilise pour calculer .U1−UP
La même technique de simulation des données selon un algorithme supposé, de les résumer avec un histogramme et de superposer un histogramme peut être utilisée pour tester la méthode décrite dans la question. Il confirmera que la méthode ne fonctionne pas comme prévu.
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)