La distribuzione normale multivariata di è sfericamente simmetrica. La distribuzione che cerchi tronca il raggio basso a . Poiché questo criterio dipende solo dalla lunghezza di , la distribuzione troncata rimane sfericamente simmetrica. Poiché è indipendente dall'angolo sfericoe ha un la distribuzione , è quindi in grado di generare valori dalla distribuzione troncato in pochi semplici passi:ρ = | | X | | 2 a X ρ X / | | X | | ρXρ = | | X| |2aXρX/||X||χ ( n )ρσχ(n)
Genera .X∼N(0,In)
Genera come radice quadrata di una distribuzione troncata in .χ 2 ( d ) ( a / σ ) 2Pχ2(d)(a/σ)2
Sia.Y=σPX/||X||
Nel passaggio 1, si ottiene come una sequenza di realizzazioni indipendenti di una variabile normale standard.dXd
Nel passaggio 2, viene prontamente generato capovolgendo la funzione quantile di una distribuzione : genera una variabile uniforme supportata nell'intervallo (di quantili) tra e e impostare .F - 1 χ 2 ( d ) U F ( ( a / σ ) 2 ) 1 P = √PF−1χ2(d)UF((a/σ)2)1P=F(U)−−−−−√
Ecco un istogramma di tali realizzazioni indipendenti di per in dimensioni, troncato di seguito in . La generazione ha richiesto circa un secondo, a dimostrazione dell'efficienza dell'algoritmo. σ P σ = 3 n = 11 a = 7105σPσ=3n=11a=7
La curva rossa è la densità di una distribuzione troncata di ridimensionata da . La sua stretta corrispondenza con l'istogramma è la prova della validità di questa tecnica.σ = 3χ(11)σ=3
Per ottenere un'intuizione per il troncamento, considera il caso , in dimensioni. Ecco un a dispersione di contro (per realizzazioni indipendenti). Mostra chiaramente il buco nel raggio :σ = 1 n = 2 Y 2 Y 1 10 4 aa=3σ=1n=2Y2Y1104a
Infine, si noti che (1) i componenti devono avere distribuzioni identiche (a causa della simmetria sferica) e (2) tranne quando , quella distribuzione comune non è normale. Infatti, come cresce grande, la rapida diminuzione della (univariata) Distribuzione normale provoca la maggior parte della probabilità del multivariata sferica troncata normale a raggrupparsi vicino alla superficie del -sphere (di raggio ). La distribuzione marginale deve quindi approssimare una distribuzione beta simmetrica in scala concentrata nell'intervallo . Ciò è evidente nel grafico a dispersione precedente, dove a = 0 a n - 1 a ( ( n - 1 ) / 2 , ( n - 1 ) / 2 ) ( - a , a ) a = 3 σ 2 - 1 3 σXia=0an−1a((n−1)/2,(n−1)/2)(−a,a)a=3σè già grande in due dimensioni: i punti limnano un anello (una sfera ) di raggio .2−13σ
Ecco gli istogrammi delle distribuzioni marginali da una simulazione di dimensione in dimensioni con , (per cui la distribuzione approssimativa di Beta è uniforme): 3 a = 10 σ = 1 ( 1 , 1 )1053a=10σ=1(1,1)
Poiché i primi marginali della procedura descritta nella domanda sono normali (per costruzione), tale procedura non può essere corretta.n−1
Il R
codice seguente ha generato la prima cifra. È costruito ai passi paralleli 1-3 per la generazione . È stato modificato per generare la seconda cifra da variabili mutevoli , , , e quindi emette il comando plot dopo è stato generato.Ya
d
n
sigma
plot(y[1,], y[2,], pch=16, cex=1/2, col="#00000010")
y
La generazione di viene modificato nel codice per una maggiore risoluzione numerica: il codice genera effettivamente e l'utilizza per calcolare .1 - U PU1−UP
La stessa tecnica di simulazione dei dati secondo un presunto algoritmo, riassumendoli con un istogramma e sovrapponendo un istogramma può essere utilizzata per testare il metodo descritto nella domanda. Confermerà che il metodo non funziona come previsto.
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)