3
votes

comment échantillonner à partir d'une courbe en cloche à l'envers

Je peux générer des nombres avec une distribution uniforme en utilisant le code ci-dessous:

runif(1,min=10,max=20)

Comment puis-je échantillonner des nombres générés de manière aléatoire qui se rapprochent plus fréquemment des limites minimum et maximum? (Aka une "courbe en cloche à l'envers")


4 commentaires

la distribution nornale n'a pas de valeurs minimales et / ou maximales


@ Gregor-reinstateMonica Ha-ha-ha-ha-ha, vient de proposer cette solution


@SeverinPappadeux n'hésitez pas à prendre un peu de mon explication des paramètres et je peux supprimer le commentaire.


@ Gregor-reinstateMonica Terminé!


4 Réponses :


6
votes

Eh bien, la courbe en cloche est généralement gaussienne, ce qui signifie qu'elle n'a ni min ni max. Vous pouvez essayer la distribution bêta et la mapper à l'intervalle souhaité. Le long des lignes

min <- 1
max <- 20
q <- min + (max-min)*rbeta(10000, 0.5, 0.5)

Comme l'a noté @ Gregor-reinstateMonica, la distribution bêta est bornée aux deux extrémités, [0 ... 1], donc elle pourrait être facilement mappée dans n'importe quel intervalle borné juste par échelle et décalage. Il a deux paramètres, et symétrique si ces paramètres sont égaux. Au-dessus de 1 paramètres en font une sorte de distribution en cloche, mais en dessous de 1 paramètres en font une cloche inversée, ce que vous recherchez. Vous pouvez jouer avec eux, mettre des valeurs différentes au lieu de 0,5 et voir comment ça se passe. Des paramètres égaux à 1 le rendent uniforme.


1 commentaires

Merci @Severin, Après avoir ajusté entre 0,5 et 0,6, j'ai réalisé mon intention pratique.



1
votes

L'échantillonnage à partir d'une distribution bêta est une bonne idée. Une autre façon consiste à échantillonner un certain nombre de nombres uniformes, puis à en prendre le minimum ou le maximum.

Selon la théorie des statistiques d'ordre, la fonction de distribution cumulative pour le maximum est F(x)^nF est le cdf à partir duquel l'échantillon est prélevé et n est le nombre d'échantillons, et le cdf pour le minimum est 1 - (1 - F(x))^n . Pour une distribution uniforme, le cdf est une ligne droite de 0 à 1, c'est-à-dire F(x) = x , et donc le cdf du maximum est x^n et le cdf du minimum est 1 - (1 - x)^n . Au fur et à mesure que n augmente, ceux-ci deviennent de plus en plus courbes, la majeure partie de la masse étant proche des extrémités.

Une recherche sur le Web pour les "statistiques de commande" permettra de trouver des ressources.


0 commentaires

0
votes

Si vous ne vous souciez pas des décimales, une manière pirate serait de générer un grand échantillon de points de données normalement distribués en utilisant rnorm() , puis de compter le nombre de fois où chaque valeur arrondie donnée apparaît ( n ), puis de soustraire n de la valeur maximale de n ( max(n) ) pour obtenir des comptages inverses.

Vous pouvez ensuite utiliser le décompte inverse pour créer un nouveau vecteur (à partir duquel vous pouvez échantillonner), c'est-à-dire:

library(tidyverse)

x <- rnorm(100000, 100, 15)

x_tib <- round(x) %>%
  tibble(x = .) %>%
  count(x) %>%
  mutate(new_n = max(n) - n)

new_x <- rep(x_tib$x, x_tib$new_n)

qplot(new_x, binwidth = 1)



0 commentaires

0
votes

Une "courbe en cloche à l'envers" par rapport à la distribution normale peut être échantillonnée en utilisant l'algorithme suivant. Je l'écris en pseudocode car je ne suis pas familier avec R. Notez que cet échantillonneur échantillonne dans un intervalle tronqué (ici, l'intervalle [ x0 , x1 ]) car il n'est pas possible pour une courbe en cloche inversée étendue à l'infini de s'intégrer à 1 (qui est l'une des exigences pour une densité de probabilité).

Dans le pseudocode, RNDU01() est un nombre aléatoire uniforme (0, 1).

x0pdf = 1-exp(-(x0*x0))
x1pdf = 1-exp(-(x1*x1))
ymax = max(x0pdf, x1pdf)
while true
  # Choose a random x-coordinate
  x=RNDU01()*(x1-x0)+x0
  # Choose a random y-coordinate
  y=RNDU01()*ymax
  # Return x if y falls within PDF
  if y < 1-exp(-(x*x)): return x
end


0 commentaires