Die multivariate Normalverteilung von ist sphärisch symmetrisch. Die gesuchte Verteilung schneidet den Radius unten bei . Da dieses Kriterium nur von der Länge von abhängt , bleibt die abgeschnittene Verteilung sphärisch symmetrisch. Da unabhängig vom Kugelwinkelund hat eine -Verteilung . Sie können daher in nur wenigen einfachen Schritten Werte aus der abgeschnittenen Verteilung generieren:Xρ=||X||2aXρX/||X||ρσχ(n)
Generiere .X∼N(0,In)
Erzeugen Sie als Quadratwurzel einer bei abgeschnittenen -Verteilung .Pχ2(d)(a/σ)2
Sei.Y=σPX/||X||
In Schritt 1 wird als eine Folge von unabhängigen Realisierungen einer normalen Standardvariablen erhalten.Xd
In Schritt 2 wird leicht durch Invertieren der Quantilfunktion einer -Verteilung erzeugt: Erzeugen einer einheitlichen Variablen die im Bereich (von Quantilen) zwischen und und setze .PF−1χ2(d)UF((a/σ)2)1P=F(U)−−−−−√
Hier ist ein Histogramm von solcher unabhängigen Realisierungen von für in Dimensionen, unten abgeschnitten bei . Die Generierung dauerte ungefähr eine Sekunde, was die Effizienz des Algorithmus bestätigt.105σPσ=3n=11a=7
Die rote Kurve ist die Dichte einer abgeschnittenen -Verteilung, skaliert mit . Die enge Übereinstimmung mit dem Histogramm ist ein Beweis für die Gültigkeit dieser Technik.χ(11)σ=3
Um eine Intuition für die Kürzung zu erhalten, betrachten Sie den Fall , in Dimensionen. Hier ist ein von gegen (für unabhängige Realisierungen). Es zeigt deutlich das Loch im Radius :a=3σ=1n=2Y2Y1104a
Schließlich ist zu beachten, dass (1) die Komponenten identische Verteilungen haben müssen (aufgrund der sphärischen Symmetrie) und (2) außer wenn , dass diese gemeinsame Verteilung nicht normal ist. Tatsächlich bewirkt die schnelle Abnahme der (univariaten) Normalverteilung , wenn groß wird, dass sich der größte Teil der Wahrscheinlichkeit, dass sich die sphärisch abgeschnittene multivariate Normalverteilung nahe der Oberfläche der Kugel (mit dem Radius ) zusammenballt. Die Randverteilung muss sich daher einer skalierten symmetrischen Beta -Verteilung annähern, die im Intervall . Dies ist im vorherigen Streudiagramm ersichtlich, in demXia=0an−1a((n−1)/2,(n−1)/2)(−a,a)a=3σist bereits in zwei Dimensionen groß: Die Punkte begrenzen einen Ring (eine Kugel) mit dem Radius .2−13σ
Hier sind Histogramme der Randverteilungen aus einer Simulation der Größe in Dimensionen mit , (für die die ungefähre Beta -Verteilung gleichmäßig ist):1053a=10σ=1(1,1)
Da die ersten Ränder des in der Frage beschriebenen Verfahrens (konstruktionsbedingt) normal sind, kann dieses Verfahren nicht korrekt sein.n−1
Der folgende R
Code erzeugte die erste Abbildung. Es ist zu parallelen Schritten 1-3 zum Erzeugen von . Es wurde modifiziert , die zweite Zahl durch Ändern Variablen zu erzeugen , , und und dann den Plot Befehl ausgibt , nachdem generiert wurde.Ya
d
n
sigma
plot(y[1,], y[2,], pch=16, cex=1/2, col="#00000010")
y
Die Erzeugung von wird in dem Code für höhere numerische Auflösung geändert: der Code erzeugt tatsächlich und verwenden diese zur Rechen .U1−UP
Dieselbe Technik, Daten nach einem vermeintlichen Algorithmus zu simulieren, sie mit einem Histogramm zusammenzufassen und ein Histogramm zu überlagern, kann verwendet werden, um die in der Frage beschriebene Methode zu testen. Es wird bestätigt, dass die Methode nicht wie erwartet funktioniert.
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)