Comment créer un ensemble de données avec une probabilité conditionnelle?

8

Supposons qu'une certaine maladie ( ) ait une prévalence de . Supposons également qu'un certain symptôme ( ) ait une prévalence (dans la population générale = personnes atteintes de cette maladie D et personnes sans cette maladie [probablement avec une autre maladie, mais ce n'est pas important]) de . Dans une recherche précédente, il a été découvert que la probabilité conditionnelle (la probabilité d'avoir le symptôme , étant donné la maladie est de ).D31000S51000P(S|D)=30%SD30%

Première question : pourrait-il être interprété comme équivalent à la prévalence du symptôme dans le groupe de personnes atteintes de la maladie ?P(S|D)SD

Deuxième question : je veux créer dans R un jeu de données, qui montre que:

P(D|S)=P(S|D)P(D)P(S)
Avec mes données fictives, nous pouvons calculer , qui est interprété de cette façon : étant donné un patient présentant le symptôme , la probabilité qu'il ait la maladie est de .P(D|S)=0.18SD18%

Comment faire ça? Si j'utilise simplement la samplefonction, mon jeu de données manque d'informations que :P(S|D)=30%

symptom <- sample(c("yes","no"), 1000, prob=c(0.005, 0.995), rep=T)
disease <- sample(c("yes","no"), 1000, prob=c(0.002, 0.998), rep=T)

Ma question est donc: comment créer un bon ensemble de données, y compris la probabilité conditionnelle que je souhaite?

EDIT : J'ai également posté la même question sur stackoverflow.com ( /programming/7291935/how-to-create-a-dataset-with-conditional-probability ), car, à mon avis, ma question est hérité du programme de langue R, mais aussi de la théorie statistique.

Tommaso
la source
3
La courtoisie courante consiste à indiquer que vous avez effectué une publication croisée sur un autre site SE. stackoverflow.com/questions/7291935/…
Brandon Bertelsen
1
J'ai signalé votre question sur SO pour la migration. S'il vous plaît, ne faites pas de cross-post!
chl

Réponses:

11

Vous connaissez les probabilités marginales suivantes

                Symptom        Total
                Yes     No
Disease Yes      a       b     0.003
        No       c       d     0.997  
Total           0.005   0.995  1.000

et que a/(a+b) = 0.3cela devient

                Symptom        Total
                Yes     No
Disease Yes     0.0009  0.0021 0.003
        No      0.0041  0.9929 0.997  
Total           0.005   0.995  1.000

et en effet a/(a+c) = 0.18comme vous l'avez dit.

Donc, dans R, vous pouvez coder quelque chose comme

diseaserate <- 3/1000
symptomrate <- 5/1000
symptomgivendisease <- 0.3

status  <- sample(c("SYDY", "SNDY", "SYDN", "SNDN"), 1000, 
            prob=c(diseaserate * symptomgivendisease,
                   diseaserate * (1-symptomgivendisease),
                   symptomrate - diseaserate * symptomgivendisease,
                   1 - symptomrate - diseaserate * (1-symptomgivendisease)),
            rep=TRUE)
symptom <- status %in% c("SYDY","SYDN")
disease <- status %in% c("SYDY","SNDY")

Cependant, vous devez noter que 1000 est un petit échantillon lorsque l'un des événements a une probabilité de 0,0009 de se produire.

Henri
la source
Solution géniale, cela fonctionne très bien! Maintenant, je peux créer un ensemble de données montrant ce que la formule de Bayes peut calculer. Merci beaucoup!
Tommaso le
Je vous ai dit que quelqu'un viendrait avec quelque chose de plus élégant;)
Fomite
@henry Je serais vraiment heureux si vous pouvez jeter un œil à ma nouvelle question ici: stats.stackexchange.com/questions/15202/… . Il s'agit d'une généralisation de cette question, avec 2 symptômes.
Tommaso
3

La tablefonction renvoie un objet matriciel:

> symptom <- sample(c("yes","no"), 100, prob=c(0.2, 0.8), rep=TRUE)
> disease <- sample(c("yes","no"), 100, prob=c(0.2, 0.8), rep=TRUE)
> dataset <- data.frame(symptom, disease)
> dst_S_D <-with(dataset, table(symptom, disease))
> dst_S_D
       disease
symptom no yes
    no  65  13
    yes 17   5

Donc le Pr (D | S = "oui") =

> probD_Sy <- dst_S_D[2, 2]/sum(dst_S_D[2, ] )
> probD_Sy
[1] 0.2272727

J'ai changé le problème car la première fois que je l'ai exécuté avec vos paramètres, j'ai eu:

> dst_S_D <-with(dataset, table(symptom, disease)); dst_S_D
       disease
symptom   no  yes
    no  9954   22
    yes   24    0

Et je pensais qu'un Pr (D | S = "oui") de 0 était plutôt ennuyeux. Si vous allez exécuter cela plusieurs fois, vous devez construire une fonction et utiliser cette fonction avec la replicatefonction.

Voici une méthode de construction d'un ensemble de données qui applique une probabilité de maladie différente dans le groupe symptomatique qu'elle est 3 fois plus élevée que celle utilisée dans le groupe asymptomatique:

symptom <- sample(c("yes","no"), 10000, prob=c(0.02, 0.98), rep=TRUE)
dataset <- data.frame(symptom, disease=NA)
dataset$disease[dataset$symptom == "yes"] <- 
       sample(c("yes","no"), sum(dataset$symptom == "yes"), prob=c(0.15, 1-0.15), rep=TRUE)
dataset$disease[dataset$symptom == "no"] <- 
        sample(c("yes","no"), sum(dataset$symptom == "no"), prob=c(0.05, 1-0.05), rep=TRUE)
 dst_S_D <-with(dataset, table(symptom, disease)); dst_S_D
#       disease
symptom   no  yes
    no  9284  509
    yes  176   31
DWin
la source
Truc parfait, sympa et élégant! J'ai ajouté de nouvelles informations dans ma réponse, pour mieux formaliser ce que je recherche.
Tommaso
2

Je dirais que votre question n'est pas vraiment très dépendante du langage R, et plus appropriée ici, car - pour être franc - la génération de données comme celle-ci est principalement une tâche statistique, plutôt qu'une programmation.

Première question: p (S | D) est le risque d'avoir le symptôme S dans une population atteinte de la maladie D. Il peut être directement comparable à la prévalence avec certaines mises en garde, comme le symptôme n'ayant aucun impact sur la durée de la maladie. Prenons l'exemple suivant: L'un des symptômes de SuperEbola est la mort instantanée, avec p (Death | Super Ebola) = 0,99. Ici, votre prévalence du symptôme serait en fait extrêmement faible (en effet, 0,00) car personne que vous pouvez échantillonner avec la maladie n'a le symptôme.

Deuxième question: je reviendrais là-dessus de façon quelque peu progressive. Tout d'abord, calculez le risque de base du symptôme dont vous aurez besoin pour obtenir 0,15 dans l'ensemble de la population, en tenant compte du fait que 0,03% de votre population sera à un taux plus élevé. Génèrent ensuite essentiellement deux probabilités:

  • Risque de maladie = 0,003
  • Risque de symptôme = risque de base calculé + augmentation relative due à la maladie * indicateur binaire de l'état de la maladie

Générez ensuite deux nombres aléatoires uniformes. Si le premier est inférieur à 0,003, ils ont la maladie. Cela est ensuite introduit dans le calcul du risque pour le second, et si le nombre aléatoire pour chaque individu est inférieur à leur risque, ils ont le symptôme.

C'est une sorte de façon inélégante de faire les choses, et il est probable que quelqu'un viendra avec une approche beaucoup plus efficace. Mais je trouve dans les études de simulation l'orthographe de chaque étape du code, et le garder aussi proche de la façon dont je verrais un ensemble de données dans le monde réel est utile.

Fomite
la source
Merci d'avoir répondu; l'exemple de SuperEbola est vraiment instructif et utile! Le reste de votre réponse reste assez peu clair, pour moi, surtout quand vous dites "calculez le risque de base du symptôme dont vous aurez besoin pour obtenir 0,15 dans toute la population, en tenant compte du fait que 0,03% de votre population sera à un taux plus élevé ". Comment calculer ce risque de base?
Tommaso
Honnêtement, c'est une douleur à faire. Si j'étais vous, je changerais légèrement mon exemple - plutôt que d'affirmer que le risque global dans la population est de 0,15, je dirais que le risque de base chez les non-malades est, disons, 0,15 ou 0,10, puis déterminer l'augmentation en risque je veux chez les malades et laisse le risque global tomber où il peut, plutôt que d'essayer de le fixer. Il est beaucoup plus facile de coder, bien que vous n'ayez peut-être pas de chiffres aussi propres à la fin.
Fomite
0

Première question:

Oui, bien sûr, c'est presque la définition, bien que vous ayez une erreur associée à la taille de votre échantillon. c'est-à-dire que ce n'est exact que pour une taille d'échantillon infinie.

Deuxième question:

C'est ce qu'on appelle le théorème de Bayes , mais je suppose que vous le savez déjà. Maintenant, compte tenu des informations que vous avez fournies, j'obtiens une probabilité de P (D | S) de 0,18 ou 18%:

P(S|D)P(D)
----------
   P(S)

  0.3*(3/1000)
= ------------
    (5/1000)

= 0.18

Maintenant, malheureusement, je ne suis pas trop familier avec R, donc je ne peux pas vraiment vous aider avec un programme exact. Mais sûrement, les quantités de personnes qui appartiennent à chaque groupe sont assez faciles à calculer:

Pour votre jeu d'échantillons 10000, vous avez besoin de:

  1. 50 personnes présentant des symptômes (population * P (S))
  2. 9 personnes devraient avoir des symptômes et la maladie (50 * P (D | S))
  3. 21 personnes avec la maladie et aucun symptôme (population * P (D) = 30 et nous en avons déjà 9)

Ce qui devrait rendre la création d'une population convenable assez triviale.


la source
Oui, la vraie valeur est 0,18, désolé pour une mauvaise saisie. La deuxième partie de votre réponse est correcte, mais le problème est de créer un ensemble de données (en R) qui compte réellement 9 personnes atteintes de maladie et de symptôme. La fonction "échantillon" crée correctement 50 et 30 "oui" pour, respectivement, le symptôme et la maladie; mais cela ne garantit pas que 9 personnes (sur 30) sont également dans le groupe des «oui-maladie».
Tommaso le
Encore une fois, vous pourriez avoir besoin de quelqu'un de plus familier avec R que moi pour vous aider à utiliser cet exemple de fonction. Cependant, vous pouvez toujours générer une population beaucoup plus grande, puis sélectionner au hasard 10000 échantillons à partir de cela.