11
votes

Générer des nombres aléatoires corrélés à partir de distributions binomiales

J'essaie de trouver un moyen de générer des nombres aléatoires corrélés à partir de plusieurs distributions binomiales.

Je sais comment le faire avec des distributions normales (en utilisant Mass :: mvrnorm ), mais je n'ai pas trouvé de fonction applicable aux réponses binomiales.


8 commentaires

Vous pouvez utiliser le package BINATA , aussi bien démo ici: STAT.ETHZ.CH/PIPERMAIR/R-HELP/2007-JULE/135575.HTML . (Ce lien était sur la première page renvoyée par une recherche Google pour "R simuler la variable binomiale corrélée" ...)


Merci Josh, mais j'ai besoin de binomiales pas de données binaires!


@Arnaud - accordé que je n'ai eu aucune sorte de caféine ou de stimulant ce matin, mais une distribution binomiale n'est-elle pas une distribution discrète dans laquelle les seules valeurs acceptables sont "oui / non" "," Pass / échec "," vrai / faux " ", autrement dit binaire? C'est ce que Wikipedia semble également réfléchir aussi.


@chase - Je conviens que le binaire et le binôme sont basés sur des valeurs "1/0" ... etc., mais des données binaires ne peuvent prendre que deux valeurs codées 0 et 1, les données binomiales sont un nombre de N. Des essais hors x (c'est-à-dire une proportion de succès) .Mais à la suite de cette idée ... Les variables binomiales sont-elles calculées comme la proportion de succès dans des échantillons de variables de Bernoulli corrélées sont corrélées?


@Arnaud - Je pense que vous pouvez être rattrapé dans la sémantique ou les différences de libellé. Dans votre exemple binomial, "N succès sur x" essai "signifie que vous pouvez compter le nombre de marbres rouges à partir d'un sac. Donc, chaque marbre rouge obtient une valeur de 1, toutes les autres couleurs ont une valeur de 0. Plus généralement, vous pouvez convertir votre "succès" en une valeur de 1, et une défaillance en tant que valeur de 0 ... ou inversement si ça fait plus de sens pour tout ce que vous comptez.


Je ne suis pas sûr de suivre les dernières questions là-bas. Les essais Bernoulli sont simplement une seule expérience avec un résultat binaire, «succès ou échec». Lorsque vous prenez une série de Essais indépendants Bernoulli avec la même probabilité de succès, qui est généralement appelé «répartition binomiale».


Je cherche un moyen de le faire en utilisant r ... alors je me demande comment je peux utiliser la fonction RMVBIN pour obtenir ce que je veux. J'ai besoin de 20 nombres aléatoires échantillonnés de 20 distributions binomiales différentes mais avec une corrélation définie entre ces chiffres.


Point pris. Apparemment, je toujours entendre "binaire" quand quelqu'un dit "binomial" - une habitude difficile de se casser;). La solution que je viens maintenant de poster ci-dessous pourrait probablement être considérablement accélérée, mais cela devrait vous donner un bon départ.


3 Réponses :


9
votes

une variable binomiable avec n essais et probabilités p de succès dans chaque Les essais peuvent être considérés comme la somme des essais N Bernoulli ayant chacun des probabilité p de succès.

De même, vous pouvez construire des paires de variations binomiales corrélées par résumer des paires de variables de Bernoulli ayant la corrélation souhaitée r. xxx

Il est important de noter qu'il y a de nombreuses distributions conjointes différentes qui partagent la corrélation souhaitée coefficient. La méthode de simulation dans rmvbinomial () produit l'un d'entre eux, mais que ce soit ou non, il est approprié dépendra du processus qui générera vos données.

Comme indiqué dans Cette réponse R-Aide à une question similaire (qui puisse alors continue à Expliquez l'idée plus en détail):

tandis qu'une normale bivariée (moyens et variances donnés) est définie de manière unique par le coefficient de corrélation, ce n'est pas le cas pour un binôme bivariatif


2 commentaires

Merci beaucoup Josh. J'ai modifié votre script pour permettre un plus grand nombre de distributions binomiales. Cependant, comme indiqué dans STAT.thz.ch/pipetermail/r -Help / 2007-juillet / 135575.html , RHO est délimité ci-dessous et ci-dessus par une fonction des probabilités marginales (la fonction échoue pour RHO = 0,8). L'utilisation de ratio impair semble être la solution, mais ... Savez-vous de généraliser la fonction proposée qui permet de convertir le ratio de cotes à une corrélation binaire valide pendant plus de 2 distributions?


@JOSH J'ai posé une question connexe, peut-être que vous voudrez peut-être y jeter un coup d'œil? Stackoverflow.com/Questtions/47006881/...



11
votes

Vous pouvez générer des uniformes corrélés à l'aide du package copula , puis utilisez la fonction qbinom pour convertir les variables binomiales. Voici un exemple rapide: xxx

maintenant x2 est une matrice avec les 2 colonnes représentant 2 variables binomiales corrélées.


7 commentaires

Merci encore Greg ... après votre aide avec optim sur l'aide de R, vous sauve-vous à nouveau!


C'est une idée intéressante, mais cela ne renvoie pas de variables avec la corrélation souhaitée. (Par exemple, j'ai calculé des coefficients de corrélation d'échantillons calculés pour 100 réplicats du code ci-dessus: la corrélation moyenne était de 0,724, avec seulement 5 des coefficients de corrélation supérieurs à 0,75).


@ Josho'Brien, trouver une solution de formulaire fermée générale pour générer des données (autres que la normale) avec une corrélation spécifiée n'est pas simple. Même travailler une méthode exacte pour le problème indiqué constituerait éventuellement une thèse de maîtrise. Mais une simple approximation consiste à simuler comme si vous l'avez fait, puis ajustez la valeur donnée à la copule, simulez à nouveau, etc. Jusqu'à ce que vous trouviez une valeur suffisamment proche (la question initiale a dit qu'ils devaient être corrélés, pas ce que la corrélation le coeff devrait être).


@Gregsnow - Merci pour votre réponse (+1). C'est génial d'obtenir une confirmation professionnelle que ce n'est pas un problème trivial, car il ne ressentait certainement pas comme un, plus j'en ai réfléchi. (J'aime aussi votre solution suggérée de régler la copule pour obtenir le RHO souhaité.)


@Josh O'Brien et Greg Snow - Merci à la fois pour votre aide et la précision. J'ai fait des simulations et il semble que plus le nombre d'essais défini dans QBinom, plus la corrélation finale est de la corrélation définie dans la normaleCopula


@Gregsnow Je viens d'essayer votre exemple ci-dessus et rcopula () ne semble plus travailler. Que devrions-nous utiliser à la place?


@jaysf, on dirait que le paquet Copula a changé. Utilisez rcopula (1000, TMP) à la place.



0
votes

une matrice avec des données binaires corrélées peut également être itérale par un algorithme génétique, par ex. Mise en œuvre dans le forfait R-package 'répétéhighdim' ( https://github.com/jkruppa/repeatedhighdim ) . L'algorithme est décrit ici ici https://www.sciencepeirect.com/science/article / ABS / PII / S0010482517303499

X2 = rmvbinary_EP(n = 1000, R = R, p = c(0.5, 0.3))
X3 = rmvbinary_QA(n = 1000, R = R, p = c(0.5, 0.3))
cor(X2)
cor(X3)


0 commentaires