Cette question est motivée par ma question sur la méta-analyse . Mais j'imagine que cela serait également utile dans les contextes pédagogiques dans lesquels vous souhaitez créer un jeu de données qui reflète exactement un jeu de données publié existant.
Je sais comment générer des données aléatoires à partir d'une distribution donnée. Ainsi, par exemple, si je lisais les résultats d’une étude portant sur:
- une moyenne de 102,
- un écart type de 5,2, et
- une taille d'échantillon de 72.
Je pourrais générer des données similaires en utilisant rnorm
dans R. Par exemple,
set.seed(1234)
x <- rnorm(n=72, mean=102, sd=5.2)
Bien sûr, la moyenne et l'écart-type ne seraient pas exactement égaux à 102 et 5,2 respectivement:
round(c(n=length(x), mean=mean(x), sd=sd(x)), 2)
## n mean sd
## 72.00 100.58 5.25
En général, je suis intéressé par la façon de simuler des données qui satisfont à un ensemble de contraintes. Dans le cas ci-dessus, les constantes sont la taille de l'échantillon, la moyenne et l'écart type. Dans d'autres cas, il peut y avoir des contraintes supplémentaires. Par exemple,
- un minimum et un maximum dans les données ou dans la variable sous-jacente peuvent être connus.
- la variable peut être connue pour ne prendre que des valeurs entières ou uniquement des valeurs non négatives.
- les données peuvent inclure plusieurs variables avec des corrélations connues.
Des questions
- En général, comment puis-je simuler des données qui répondent exactement à un ensemble de contraintes?
- Y a-t-il des articles écrits à ce sujet? Y at-il des programmes dans R qui font cela?
- Par exemple, comment puis-je et devrais-je simuler une variable de sorte qu'elle ait une moyenne et une dd spécifiques?
la source
x<-rnorm(72);x<-5.2*(x-mean(x))/sd(x)+102
fait le tour.Réponses:
En général, pour que la moyenne et la variance de votre échantillon soient exactement égales à une valeur prédéfinie, vous pouvez déplacer et mettre à l'échelle la variable de manière appropriée. Plus précisément, si est un échantillon, alors les nouvelles variablesX1,X2,...,Xn
oùX¯¯¯¯=1n∑ni=1Xi s2X=1n−1∑ni=1(Xi−X¯¯¯¯)2 Zi c2 c1
produira un ensemble de données limité à l'intervalle .B1,...,Bn (a,b)
Remarque: ces types de décalage / mise à l'échelle modifieront généralement la famille de distribution des données, même si les données d'origine proviennent d'une famille d'échelle de localisation.
Dans le contexte de la distribution normale, la
mvrnorm
fonctionR
vous permet de simuler des données normales (ou normales à plusieurs variables) avec une moyenne / covariance d' échantillon prédéfinie par réglageempirical=TRUE
. Spécifiquement, cette fonction simule les données de la distribution conditionnelle d'une variable normalement distribuée, étant donné que la moyenne de l'échantillon et la (co) variance sont égales à une valeur prédéfinie . Notez que les distributions marginales résultantes ne sont pas normales, comme l'a souligné @whuber dans un commentaire à la question principale.Voici un exemple univarié simple où la moyenne de l'échantillon (d'un échantillon de ) est contrainte à 0 et l'écart type de l'échantillon est 1. Nous pouvons voir que le premier élément est beaucoup plus similaire à une distribution uniforme qu'à une normale Distribution:n=4
la source
En ce qui concerne votre demande de papiers, il y a:
Ce n’est pas tout à fait ce que vous cherchez, mais pourrait servir à abreuver le moulin.
Il y a une autre stratégie que personne ne semble avoir mentionnée. Il est possible de générer (pseudo) données aléatoires à partir d'un ensemble de taille sorte qu'un ensemble complet respecte contraintes, pour autant que les données restantes soient fixées à des valeurs appropriées. Les valeurs requises doivent pouvoir être résolues avec un système d' équations , d'algèbre et de graisse pour coudes.N−k N k k k
Par exemple, pour générer un ensemble de données à partir d'une distribution normale qui aura une moyenne d'échantillon donnée, , et une variance, , vous devrez fixer les valeurs de deux points: et . Étant donné que la moyenne de l'échantillon est: doit être: L'écart exemple est: ainsi (après avoir remplacé ce qui précède par , déjouant / distribuant, et réarrangeant ... ) on a:N x¯ s2 y z
R
Il y a certaines choses à comprendre à propos de cette approche. Tout d'abord, il n'est pas garanti de fonctionner. Par exemple, il est possible que vos données initiales soient telles qu'il n'existe pas de valeurs et rendant la variance de l'ensemble résultant égale à . Considérer: y z s 2N−2 y z s2
Deuxièmement, alors que la standardisation uniformise les distributions marginales de toutes vos variables, cette approche n’affecte que les deux dernières valeurs, mais rend leurs distributions marginales faussées:
Troisièmement, l'échantillon résultant peut ne pas sembler très normal; il peut sembler qu'il a des «valeurs aberrantes» (c'est-à-dire des points qui proviennent d'un processus de génération de données différent du reste), car c'est essentiellement le cas. Ceci est moins susceptible de poser problème avec des tailles d'échantillon plus grandes, car les statistiques d'échantillon à partir des données générées doivent converger vers les valeurs requises et nécessitent par conséquent moins d'ajustement. Avec des échantillons plus petits, vous pouvez toujours combiner cette approche avec un algorithme d'acceptation / rejet qui tente à nouveau si l'échantillon généré a des statistiques de forme (par exemple, asymétrie et kurtosis) qui sont en dehors des limites acceptables (cf., commentaire de @ cardinal ), ou étendent cette approche pour générer un échantillon avec une moyenne, une variance, une asymétrie etkurtosis (je laisserai cependant l'algèbre à vous). Alternativement, vous pouvez générer un petit nombre d’échantillons et utiliser celui qui contient la statistique la plus petite (disons) de Kolmogorov-Smirnov.
la source
La technique générale est la «méthode de rejet», dans laquelle vous rejetez simplement des résultats qui ne respectent pas vos contraintes. À moins que vous n'ayez une sorte de guide (comme MCMC), vous pourriez générer beaucoup de cas (selon votre scénario) qui sont rejetés!
Lorsque vous recherchez quelque chose comme un écart moyen et standard et que vous pouvez créer une métrique de distance pour indiquer votre distance par rapport à votre objectif, vous pouvez utiliser l'optimisation pour rechercher les variables d'entrée qui vous donnent le résultat souhaité. valeurs.
Comme un vilain exemple où nous allons chercher un vecteur aléatoire uniforme de longueur 100 qui a une moyenne = 0 et l' écart type = 1.
la source
Le paquet Runuran R contient de nombreuses méthodes pour générer des variables aléatoires. Il utilise les bibliothèques C du projet UNU.RAN ( générateur universel de nombres non uniformes de RAndom). Ma connaissance du domaine de la génération de variables aléatoires est limitée, mais la vignette Runuran fournit un bon aperçu. Voici les méthodes disponibles dans le package Runuran, tiré de la vignette:
Distributions continues:
Distributions discrètes:
Distributions multivariées:
Exemple:
Pour un exemple rapide, supposons que vous vouliez générer une distribution normale limitée entre 0 et 100:
La
urnorm()
fonction est une fonction d'encapsulation pratique. Je crois que dans les coulisses, il utilise la méthode d’interpolation polynomiale de CDF inverse, mais je ne suis pas sûr. Pour quelque chose de plus complexe, disons une distribution normale discrète limitée entre 0 et 100:la source
Il semble qu’un package R répondant à vos besoins a été publié hier! simstudy Par Keith Goldfeld
la source
C’est une réponse qui arrive si tard qu’elle n’a apparemment aucun sens, mais il existe toujours une solution MCMC à la question. À savoir, pour projeter la densité de joint de l'échantillon sur la variété définie par les contraintes, par exemple Le seul problème est alors de simuler des valeurs sur cette variété, c'est-à-dire de trouver un paramétrage de la dimension correcte. Un article publié en 2015 par Bornn, Shephard et Solgi étudie ce problème même (avec une réponse intéressante, voire ultime ).
la source
Cette réponse considère une autre approche du cas où vous voulez forcer les variables à se situer dans une plage spécifiée et dicter en plus la moyenne et / ou la variance.
Limitez notre attention à l'intervalle unitaire . Utilisons une moyenne pondérée pour la généralité, donc certaines pondérations avec ou définissez si vous souhaitez une pondération standard. Supposons que les quantités et représentent respectivement la variance souhaitée (pondérée) et la variance (pondérée). La limite supérieure de est nécessaire car c'est la variance maximale possible sur un intervalle d'unité. Nous sommes intéressés par dessiner des variables de avec ces restrictions de moment.[0,1] wk∈[0,1] ∑Nk=1wk=1 wk=1/N μ∈(0,1) 0<σ2<μ(1−μ) σ2 x1,...,xN [0,1]
Commençons par dessiner des variables de toute distribution, comme . Cette distribution affectera la forme de la distribution finale. Ensuite, nous les contraignons à l'intervalle unitaire aide d'une fonction logistique:y1,...,yN N(0,1) [0,1]
Avant de faire cela, cependant, comme le montre l'équation ci-dessus, nous transformons les avec la traduction et l'échelle . Ceci est analogue à la première équation de la réponse de @ Macro. L'astuce consiste maintenant à choisir et pour que les variables transformées aient le ou les moments souhaités. C’est-à-dire qu’il faut l’un ou l’autre des éléments suivants:yk h v h v x1,...,xN
L'inversion analytique de ces équations pour et n'est pas réalisable, mais le faire numériquement est simple, d'autant plus que les dérivées par rapport à et sont faciles à calculer; il ne faut que quelques itérations de la méthode de Newton.v h v h
Comme premier exemple, disons que nous ne nous soucions que de limiter la moyenne pondérée et non la variance. Fixer , , , . Ensuite, pour les distributions sous-jacentes , et nous obtenons respectivement les histogrammes suivants, de sorte que la moyenne des variables est exactement égale à (même pour petit ):v = 1 w k = 1 / N N = 200 000 N ( 0 , 1 ) N ( 0 , 0,1 ) Unif ( 0 , 1 ) 0,8 Nμ=0.8 v=1 wk=1/N N=200000 N(0,1) N(0,0.1) Unif(0,1) 0.8 N
Ensuite, limitons la moyenne et la variance. Prenez , , et considérez les trois écarts types souhaités . En utilisant la même distribution sous-jacente , voici les histogrammes pour chacun:w k = 1 / N N = 2000 σ = 0,1 , 0,05 , 0,01 N ( 0 , 1 )μ=0.2 wk=1/N N=2000 σ=0.1,0.05,0.01 N(0,1)
Notez que ceux-ci peuvent sembler un peu bêta-distribués, mais ils ne le sont pas.
la source
Dans ma réponse ici , j'ai énuméré trois paquets R pour faire ceci:
la source