Simulation de tirages à partir d'une distribution uniforme à l'aide de tirages à partir d'une distribution normale

15

J'ai récemment acheté une ressource d'entrevue en science des données dans laquelle l'une des questions de probabilité était la suivante:

Étant donné les tirages d'une distribution normale avec des paramètres connus, comment pouvez-vous simuler les tirages d'une distribution uniforme?

Mon processus de pensée original était que, pour une variable aléatoire discrète, nous pouvions diviser la distribution normale en K sous-sections uniques où chaque sous-section a une aire égale sous la courbe normale. Ensuite, nous pourrions déterminer laquelle des valeurs K la variable prend en reconnaissant dans quelle zone de la courbe normale la variable finit par tomber.

Mais cela ne fonctionnerait que pour des variables aléatoires discrètes. J'ai fait des recherches sur la façon dont nous pourrions faire de même pour les variables aléatoires continues, mais malheureusement, je n'ai pu trouver que des techniques comme l'échantillonnage par transformée inverse qui utiliserait en entrée une variable aléatoire uniforme et pourraient produire des variables aléatoires à partir d'une autre distribution. Je pensais que nous pourrions peut-être faire ce processus à l'envers pour obtenir des variables aléatoires uniformes?

J'ai également pensé à utiliser éventuellement les variables aléatoires normales comme entrées dans un générateur congruentiel linéaire, mais je ne sais pas si cela fonctionnerait.

Avez-vous des réflexions sur la façon dont je pourrais aborder cette question?

Wellington
la source

Réponses:

30

Dans l'esprit d'utiliser des calculs algébriques simples qui ne sont pas liés au calcul de la distribution normale , je pencherais vers ce qui suit. Ils sont commandés comme je pensais à eux (et donc devaient devenir de plus en plus créatifs), mais j'ai gardé le meilleur - et le plus surprenant - pour durer.

  1. Inverser la technique de Box-Mueller : à partir de chaque paire de normales , deux uniformes indépendants peuvent être construits comme(X,Y) (sur l'intervalle [ - π , π ] ) et exp ( - ( X 2 + Y 2 ) / 2 ) (sur l'intervalle [ 0 , 1 ] ).atan2(Y,X)[π,π]exp((X2+Y2)/2)[0,1]

  2. Prenez les normales par groupes de deux et additionnez leurs carrés pour obtenir une séquence de variées Y 1 , Y 2 , , Y i , . Les expressions obtenues à partir des pairesχ22Y1,Y2,,Yi,

    Xi=Y2iY2i1+Y2i

    aura une distribution , qui est uniforme.Beta(1,1)

    Que cela ne nécessite qu'une arithmétique simple et de base devrait être clair.

  3. Étant donné que la distribution exacte du coefficient de corrélation de Pearson d'un échantillon à quatre paires à partir d'une distribution normale bivariée standard est uniformément répartie sur , nous pouvons simplement prendre les normales en groupes de quatre paires (c'est-à-dire, huit valeurs dans chaque ensemble) et renvoyer le coefficient de corrélation de ces paires. (Cela implique une arithmétique simple plus deux opérations de racine carrée.)[1,1]

  4. Il est connu depuis l'Antiquité qu'une projection cylindrique de la sphère (une surface dans trois espaces) est à aire égale . Cela implique que dans la projection d'une distribution uniforme sur la sphère, la coordonnée horizontale (correspondant à la longitude) et la coordonnée verticale (correspondant à la latitude) auront des distributions uniformes. Comme la distribution normale standard trivariée est sphérique symétrique, sa projection sur la sphère est uniforme. L'obtention de la longitude est essentiellement le même calcul que l'angle dans la méthode Box-Mueller ( qv ), mais la latitude projetée est nouvelle. La projection sur la sphère normalise simplement un triple de coordonnées et à ce point z est la latitude projetée. Ainsi, prenez les variables normales en groupes de trois, X 3 i - 2 , X 3 i - 1 , X 3 i , et calculez(x,y,z)zX3i2,X3i1,X3i

    X3iX3i22+X3i12+X3i2

    pour .i=1,2,3,

  5. Étant donné que la plupart des systèmes informatiques représentent des nombres en binaire , la génération de nombres uniformes commence généralement par la production d' entiers uniformément répartis entre et 2 32 - 1 (ou une puissance élevée de 2 liée à la longueur des mots de l'ordinateur) et leur redimensionnement selon les besoins. Ces entiers sont représentés en interne sous forme de chaînes de 32 chiffres binaires. Nous pouvons obtenir des bits aléatoires indépendants en comparant une variable normale à sa médiane. Ainsi, il suffit de diviser les variables normales en groupes de taille égale au nombre de bits souhaité, de comparer chacune à sa moyenne et d'assembler les séquences résultantes de résultats vrais / faux en un nombre binaire. Écriture k02321232kpour le nombre de bits et pour le signe (c'est-à-dire lorsque et sinon), nous pouvons exprimer la valeur uniforme normalisée résultante dans avec le formuleHx > 0 H ( x ) = 0 [ 0 , 1 )H(x)=1x>0H(x)=0[0,1)

    j=0k1H(Xkij)2j1.

    Les variables peuvent être tirées de n'importe quelle distribution continue dont la médiane est (comme une normale standard); ils sont traités en groupes de chaque groupe produisant une telle valeur pseudo-uniforme. 0 kXn0k

  6. L'échantillonnage par rejet est un moyen standard, flexible et puissant de tirer des variations aléatoires à partir de distributions arbitraires. Supposons que la distribution cible ait PDF . Une valeur est dessinée selon une autre distribution avec PDF . Dans l'étape de rejet, une valeur uniforme comprise entre et est dessinée indépendamment de et comparée à : si elle est plus petite, est conservée mais sinon le processus est répété. Cette approche semble cependant circulaire: comment générer une variable uniforme avec un processus qui a besoin d'une variable uniforme pour commencer?Y g U 0 g ( Y ) Y f ( Y ) YfYgU0g(Y)Yf(Y)Y

    La réponse est que nous n'avons pas réellement besoin d'une variable uniforme pour effectuer l'étape de rejet. Au lieu de cela (en supposant ), nous pouvons lancer une pièce juste pour obtenir un ou au hasard. Cela sera interprété comme le premier bit de la représentation binaire d'une variable uniforme dans l'intervalle . Lorsque le résultat est , cela signifie ; sinon, . La moitié du temps, cela suffit pour décider de l'étape de rejet: si mais la pièce est , doit être accepté; si0 1 U [ 0 , 1 ) 0 0 U < 1 / 2 1 / 2 U < 1 f ( Y ) / g ( Y ) 1 / 2 0 Y f ( Y ) / g ( Y ) < 1 / 2 1 Y U fg(Y)001U[0,1)00U<1/21/2U<1f(Y)/g(Y)1/20Yf(Y)/g(Y)<1/2 mais la pièce est , doit être rejeté; sinon, nous avons besoin de retourner la pièce à nouveau afin d'obtenir le bit de . Parce que - quelle que soit la valeur de - il y a chance de s'arrêter après chaque flip, le nombre de flips attendu n'est que de .1YU1 / 2 1 / 2 ( 1 ) + 1 / 4 ( 2 ) + 1 / 8 ( 3 ) + + 2 - n ( n ) + = 2f(Y)/g(Y)1/21/2(1)+1/4(2)+1/8(3)++2n(n)+=2

    L'échantillonnage des rejets peut être utile (et efficace) à condition que le nombre attendu de rejets soit faible. Nous pouvons y parvenir en ajustant le plus grand rectangle possible (représentant une distribution uniforme) sous un PDF normal.

    PDF normaux et uniformes

    En utilisant le calcul pour optimiser la zone du rectangle, vous constaterez que ses extrémités doivent se situer à , où sa hauteur est égale à , ce qui rend sa zone un peu supérieur à . En utilisant cette densité normale standard comme et en rejetant automatiquement toutes les valeurs en dehors de l'intervalle , et en appliquant autrement la procédure de rejet, nous obtiendrons des variations uniformes dans efficacement:exp ( - 1 / 2 ) / ±10,48g[-1,1][-1,1]exp(1/2)/2π0.2419710.48g[1,1][1,1]

    • Dans une fraction fois, la variable normale se situe au-delà de et est immédiatement rejetée. ( est le CDF Normal standard.)[ - 1 , 1 ] Φ2Φ(1)0.317[1,1]Φ

    • Dans la fraction restante du temps, la procédure de rejet binaire doit être suivie, nécessitant en moyenne deux autres variations normales.

    • La procédure globale nécessite en moyenne étapes.1/(2exp(1/2)/2π)2.07

    Le nombre attendu de variables normales nécessaires pour produire chaque résultat uniforme correspond à

    2eπ(12Φ(1))2.82137.

    Bien que cela soit assez efficace, notez que (1) le calcul du PDF normal nécessite le calcul d'une exponentielle et (2) la valeur doit être précalculée une fois pour toutes. C'est encore un peu moins de calcul que la méthode Box-Mueller ( qv ).Φ(1)

  7. Les statistiques d'ordre d'une distribution uniforme ont des lacunes exponentielles. Puisque la somme des carrés de deux normales (de moyenne nulle) est exponentielle, nous pouvons générer une réalisation de uniformes indépendants en sommant les carrés des paires de ces normales, en calculant la somme cumulée de celles-ci, en redimensionnant les résultats pour qu'ils tombent dans l'intervalle , et en supprimant le dernier (qui sera toujours égal à ). C'est une approche agréable car elle ne nécessite que la quadrature, la sommation et (à la fin) une seule division.[ 0 , 1 ] 1n[0,1]1

    Les valeurs seront automatiquement dans l'ordre croissant. Si un tel tri est souhaité, cette méthode est supérieure en calcul à toutes les autres dans la mesure où elle évite le coût d'un tri. Si une séquence d'uniformes indépendants est nécessaire, cependant, le tri aléatoire de ces valeurs fera l'affaire. Puisque (comme on le voit dans la méthode de Box-Mueller, qv ) les ratios de chaque paire de normales sont indépendants de la somme des carrés de chaque paire, nous avons déjà les moyens d'obtenir cette permutation aléatoire: ordonner les sommes cumulées par les ratios correspondants . (Si est très grand, ce processus pourrait être effectué en plus petits groupes deO ( n log ( n ) ) n n k 2 ( k + 1 ) k k O ( n log ( k ) ) O ( n ) 2 n ( 1 + 1 / k ) nnO(nlog(n))nnkavec peu de perte d'efficacité, car chaque groupe n'a besoin que de normales pour créer valeurs uniformes. Pour fixe , le coût de calcul asymptotique est donc = , nécessitant variables normales pour générer valeurs uniformes.)2(k+1)kkO(nlog(k))O(n)2n(1+1/k)n

  8. Pour une superbe approximation, toute variable normale avec un grand écart-type semble uniforme sur des plages de valeurs beaucoup plus petites. En roulant cette distribution dans la plage (en ne prenant que les parties fractionnaires des valeurs), nous obtenons ainsi une distribution qui est uniforme à toutes fins pratiques. Ceci est extrêmement efficace, nécessitant l'une des opérations arithmétiques les plus simples de toutes: arrondissez simplement chaque variable normale à l'entier le plus proche et conservez l'excédent. La simplicité de cette approche devient convaincante lorsque nous examinons une mise en œuvre pratique :[0,1]R

    rnorm(n, sd=10) %% 1
    

    produit de manière fiable des nvaleurs uniformes dans l'intervalle au prix de simples variations normales et presque pas de calcul.[0,1]n

    (Même lorsque l'écart-type est de , le PDF de cette approximation varie d'un PDF uniforme, comme le montre la figure suivante, de moins d'une partie sur ! Pour le détecter de manière fiable, il faudrait un échantillon de valeurs - c'est déjà au-delà de la capacité de tout test standard d'aléatoire. Avec un écart-type plus grand, la non-uniformité est si petite qu'elle ne peut même pas être calculée. Par exemple, avec un écart-type de comme indiqué dans le code, le maximum l'écart par rapport à un PDF uniforme n'est que de .)10 8 10 16 10 10 - 857110810161010857

    PDF approximatif


Dans tous les cas, les variables normales "avec des paramètres connus" peuvent facilement être recentrées et redimensionnées dans les normales standard supposées ci-dessus. Ensuite, les valeurs uniformément réparties résultantes peuvent être recentrées et rééchelonnées pour couvrir tout intervalle souhaité. Celles-ci ne nécessitent que des opérations arithmétiques de base.

La facilité de ces constructions est mise en évidence par le Rcode suivant , qui n'utilise qu'une ou deux lignes pour la plupart d'entre elles. Leur exactitude est attestée par les histogrammes quasi uniformes résultants basés sur valeurs indépendantes dans chaque cas (nécessitant environ 12 secondes pour les sept simulations). Pour référence - au cas où vous seriez inquiet de la quantité de variation apparaissant dans l'un de ces graphiques - un histogramme de valeurs uniformes simulées avec le générateur de nombres aléatoires uniformes est inclus à la fin.100,000R

Histogrammes

Toutes ces simulations ont été testées pour l'uniformité en utilisant un basé sur bacs; aucune ne pouvait être considérée comme significativement non uniforme (la valeur de p la plus faible était de - pour les résultats générés par le générateur de nombre uniforme réel de!).χ210003%R

set.seed(17)
n <- 1e5
y <- matrix(rnorm(floor(n/2)*2), nrow=2)
x <- c(atan2(y[2,], y[1,])/(2*pi) + 1/2, exp(-(y[1,]^2+y[2,]^2)/2))
hist(x, main="Box-Mueller")

y <- apply(array(rnorm(4*n), c(2,2,n)), c(3,2), function(z) sum(z^2))
x <- y[,2] / (y[,1]+y[,2])
hist(x, main="Beta")

x <- apply(array(rnorm(8*n), c(4,2,n)), 3, function(y) cor(y[,1], y[,2]))
hist(x, main="Correlation")

n.bits <- 32; x <-  (2^-(1:n.bits)) %*% matrix(rnorm(n*n.bits) > 0, n.bits)
hist(x, main="Binary")

y <- matrix(rnorm(n*3), 3)
x <- y[1, ] / sqrt(apply(y, 2, function(x) sum(x^2)))
hist(x, main="Equal area")

accept <- function(p) { # Using random normals, return TRUE with chance `p`
  p.bit <- x <- 0
  while(p.bit == x) {
    p.bit <- p >= 1/2
    x <- rnorm(1) >= 0
    p <- (2*p) %% 1
  }
  return(x == 0)
}
y <- rnorm(ceiling(n * sqrt(exp(1)*pi/2))) # This aims to produce `n` uniforms
y <- y[abs(y) < 1]
x <- y[sapply(y, function(x) accept(exp((x^2-1)/2)))]
hist(x, main="Rejection")

y <- matrix(rnorm(2*(n+1))^2, 2)
x <- cumsum(y)[seq(2, 2*(n+1), 2)]
x <- x[-(n+1)] / x[n+1]
x <- x[order(y[2,-(n+1)]/y[1,-(n+1)])] 
hist(x, main="Ordered")

x <- rnorm(n) %% 1 # (Use SD of 5 or greater in practice)
hist(x, main="Modular")

x <- runif(n)      # Reference distribution
hist(x, main="Uniform")
whuber
la source
2
(+1) Si je posais cette question dans une interview, je la modifierais pour demander le cas où les paramètres sont fixes, mais inconnus , ce qui me semble plus intéressant. L'approche de corrélation de Pearson (# 3) passe par inchangée, mais est peut-être légèrement ésotérique. L'approche bêta (# 2) ne nécessite que de légères modifications en considérant les carrés des différences de paires disjointes. De même, est un Cauchy standard (quelles que soient la moyenne et la variance de ), qui a un joli cdf. Z=(X1X2)/(X3X4)X
cardinal
1
Plus généralement, le principe est de trouver une quantité pivot à partir de l'échantillon avec un cdf calculable. Cela cadre bien avec la construction d'intervalles de confiance et de tests d'hypothèses, avec la torsion que nous pourrions chercher à optimiser le nombre d'éléments utilisés plutôt que les derniers cas qui se concentrent davantage sur la maximisation des informations à partir d'une taille d'échantillon fixe.
cardinal
@Cardinal Merci pour les commentaires intéressants, ainsi que la neuvième méthode (Cauchy). Même la recherche d'une quantité pivot est inutile lorsque seule une bonne approximation est recherchée. Par exemple, (8) fonctionne parfaitement bien si vous réservez un petit nombre de résultats initiaux pour établir une échelle approximative.
whuber
8

XN(μ,σ2)Φμ,σ2Φμ,σ2(X)(0,1)d(0,1)

P(Φμ,σ2(X)d)=P(XΦμ,σ21(d))=d

11Φμ,σ2(X)(0,1)σR

swmo
la source
4
C'est l'inverse de l'échantillonnage par transformée inverse!
Roger Fan
Pourriez-vous développer la deuxième phrase de votre deuxième paragraphe? J'ai du mal à comprendre ce qui suit: "Cela suffit pour montrer que Φμ, σ2 (X) a une distribution uniforme sur (0,1) car nous avons montré que les mesures correspondantes sont égales pour un générateur de l'algèbre Borel σ le ℝ. "
wellington
XX(P)σ