A distribuição normal multivariada de é esfericamente simétrica. A distribuição que você procura trunca o raio ρ = | | X | | 2 abaixo em a . Como esse critério depende apenas do comprimento de X , a distribuição truncada permanece esférica simétrica. Como ρ é independente do ângulo esférico X / | | X | | e ρXρ=||X||2aXρX/||X|| possui umadistribuição χ ( n ) , portanto, você pode gerar valores a partir da distribuição truncada em apenas algumas etapas simples:ρσχ(n)
Gere .X∼N(0,In)
Gere como a raiz quadrada de uma distribuição χ 2 ( d ) truncada em ( a / σ ) 2 .Pχ2(d)(a/σ)2
Seja .Y=σPX/||X||
Na etapa 1, é obtido como uma sequência de d realizações independentes de uma variável normal padrão.Xd
Na etapa 2, é facilmente gerado pela inversão da função quantil F - 1 de uma distribuição χ 2 ( d ) : gere uma variável uniforme U suportada no intervalo (de quantis) entre F ( ( a / σ ) 2 ) e 1 e defina P = √PF−1χ2(d)UF((a/σ)2)1 .P=F(U)−−−−−√
Aqui está um histograma de tais realizações independentes de σ P para σ = 3 em n = 11 dimensões, truncadas abaixo em a = 7 . Demorou cerca de um segundo para gerar, atestando a eficiência do algoritmo.105σPσ=3n=11a=7
A curva vermelha é a densidade de uma distribuição truncada escalada por σ = 3 . Sua correspondência próxima ao histograma é evidência da validade dessa técnica.χ(11)σ=3
Para obter uma intuição para o truncamento, considere o caso , σ = 1 em n = 2 dimensões. Aqui está um gráfico de dispersão de Y 2 contra Y 1 (para 10 4 realizações independentes). Mostra claramente o furo no raio a :a=3σ=1n=2Y2Y1104a
Finalmente, nota que (1) os componentes deve ter distribuições idênticas (devido à simetria esférica) e (2), excepto quando um = 0 , que a distribuição não é comum normal. Na verdade, como uma cresce grande, a queda rápida da (univariada) distribuição normal faz com que a maior parte da probabilidade do multivariada esfericamente normal truncada para aglomerar perto da superfície do n - 1 -sphere (raio de um ). A distribuição marginal deve, portanto, aproximar-se de um Beta simétrico em escala ( ( n - 1 ) / 2 , ( n -Xia=0an−1a distribuição concentrada no intervalo ( - a , a ) . Isso é aparente no gráfico de dispersão anterior, onde a = 3 σ já é grande em duas dimensões: os pontos limitam um anel (umaesfera 2 - 1 ) do raio 3 σ .((n−1)/2,(n−1)/2)(−a,a)a=3σ2−13σ
Aqui estão os histogramas das distribuições marginais a partir de uma simulação de tamanho em 3 dimensões com a = 10 , σ = 1 (para a qual a distribuição Beta ( 1 , 1 ) aproximada é uniforme):1053a=10σ=1(1,1)
Como os primeiros marginais do procedimento descrito na pergunta são normais (por construção), esse procedimento não pode estar correto.n−1
O R
código a seguir gerou a primeira figura. Ele é construído para os passos 1-3 paralelas para gerar . Foi modificado para gerar a segunda figura de variáveis em mudança , , , e e, em seguida, emite o comando de trama depois foi gerado.Ya
d
n
sigma
plot(y[1,], y[2,], pch=16, cex=1/2, col="#00000010")
y
A geração de é modificado no código para uma maior resolução numérica: o código efectivamente gera um - L e usos que a computar P .U1−UP
A mesma técnica de simulação de dados de acordo com um suposto algoritmo, resumindo-os com um histograma e sobrepondo um histograma pode ser usada para testar o método descrito na pergunta. Ele confirmará que o método não funciona conforme o esperado.
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)