Wie erstelle ich einen Datensatz mit bedingter Wahrscheinlichkeit?

8

Angenommen, eine bestimmte Krankheit ( ) hat eine Prävalenz von . Nehmen wir auch an, dass ein bestimmtes Symptom ( ) eine Prävalenz (in der Allgemeinbevölkerung = Menschen mit dieser Krankheit D und Menschen ohne diese Krankheit [wahrscheinlich mit einer anderen Krankheit, aber nicht wichtig]) von . In einer früheren Untersuchung wurde entdeckt, dass die bedingte Wahrscheinlichkeit (die Wahrscheinlichkeit, das Symptom zu haben , wenn die Krankheit beträgt ).3D S.31000S51000S D 30 %P(S|D)=30%SD30%

Erste Frage : Könnte als äquivalent zur Prävalenz des Symptoms in der Gruppe der Menschen mit der Krankheit interpretiert werden ?S DP(S|D)SD

Zweite Frage : Ich möchte in R einen Datensatz erstellen, der Folgendes zeigt:

P(D|S)=0.18SD18%

P(D|S)=P(S|D)P(D)P(S)
Mit meinen fiktiven Daten können wir berechnen , was auf diese Weise interpretiert wird : Bei einem Patienten mit dem Symptom beträgt die Wahrscheinlichkeit, dass er an der Krankheit leidet, .P(D|S)=0.18SD18%

Wie macht man das? Wenn ich einfach die sampleFunktion verwende, fehlen in meinem Datensatz die Informationen, dass :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)

Meine Frage lautet also: Wie erstelle ich einen guten Datensatz, einschließlich der von mir gewünschten bedingten Wahrscheinlichkeit?

BEARBEITEN : Ich habe die gleiche Frage auch auf stackoverflow.com ( /programming/7291935/how-to-create-a-dataset-with-conditional-probability ) gepostet , weil meiner Meinung nach meine Frage wird an das R-Sprachprogramm, aber auch an die statistische Theorie vererbt.

Tommaso
quelle
3
Mit freundlicher Genehmigung wird angegeben, dass Sie auf einer anderen SE-Site einen Cross-Posting durchgeführt haben. stackoverflow.com/questions/7291935/…
Brandon Bertelsen
1
Ich habe Ihre Frage zu SO für die Migration markiert. Bitte nicht überkreuzen!
Chl

Antworten:

11

Sie kennen die folgenden Grenzwahrscheinlichkeiten

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

und das a/(a+b) = 0.3so wird das

                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

und in der Tat, a/(a+c) = 0.18wie Sie sagten.

In R könnte man also so etwas codieren

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")

Sie sollten jedoch beachten, dass 1000 eine kleine Stichprobe ist, wenn eines der Ereignisse eine Wahrscheinlichkeit von 0,0009 hat.

Henry
quelle
Super Lösung, es funktioniert super! Jetzt kann ich einen Datensatz erstellen, der zeigt, was die Bayes-Formel berechnen kann. Vielen Dank!
Tommaso
Ich habe dir gesagt, jemand würde etwas eleganteres
mitbringen
@henry Ich würde mich sehr freuen, wenn Sie sich meine neue Frage hier ansehen können : stats.stackexchange.com/questions/15202/… . Es ist eine Verallgemeinerung dieser Frage mit 2 Symptomen.
Tommaso
3

Die tableFunktion gibt ein matrixartiges Objekt zurück:

> 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

Also ist Pr (D | S = "Ja") =

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

Ich habe das Problem geändert, weil ich beim ersten Ausführen mit Ihren Parametern Folgendes erhalten habe:

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

Und ich fand ein Pr (D | S = "yes") von 0 ziemlich langweilig. Wenn Sie dies viele Male ausführen möchten, sollten Sie eine Funktion erstellen und diese Funktion mit der replicateFunktion verwenden.

Hier ist eine Methode zum Erstellen eines Datensatzes, bei der eine andere Krankheitswahrscheinlichkeit in der symptomatischen Gruppe angewendet wird, die dreimal höher ist als in der asymptomatischen Gruppe:

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
quelle
Perfekter, schöner und eleganter Trick! Ich habe meiner Antwort einige neue Informationen hinzugefügt, um besser zu formalisieren, wonach ich suche.
Tommaso
2

Ich würde behaupten, dass Ihre Frage nicht wirklich stark von der R-Sprache abhängt und hier angemessener ist, da - um ehrlich zu sein - die Generierung solcher Daten meistens eher eine statistische als eine Programmieraufgabe ist.

Erste Frage: p (S | D) ist das Risiko , Symptom S in einer Population mit Krankheit D zu haben. Es kann direkt mit der Prävalenz mit bestimmten Einschränkungen vergleichbar sein, beispielsweise wenn das Symptom keinen Einfluss auf die Krankheitsdauer hat. Betrachten Sie das folgende Beispiel: Eines der Symptome von SuperEbola ist der sofortige Tod mit p (Tod | Super-Ebola) = 0,99. Hier wäre Ihre Prävalenz des Symptoms tatsächlich extrem niedrig (in der Tat 0,00), da niemand, den Sie mit der Krankheit untersuchen können, das Symptom hat.

Zweite Frage: Ich würde etwas schrittweise darauf zurückkommen. Berechnen Sie zunächst das Grundrisiko des Symptoms, das Sie benötigen, um 0,15 in der gesamten Bevölkerung zu erhalten, und berücksichtigen Sie dabei, dass 0,03% Ihrer Bevölkerung eine höhere Rate aufweisen. Dann erzeugen Sie im Wesentlichen zwei Wahrscheinlichkeiten:

  • Krankheitsrisiko = 0,003
  • Symptomrisiko = berechnetes Grundrisiko + relativer Anstieg aufgrund der Krankheit * binärer Indikator für den Krankheitsstatus

Generieren Sie dann zwei einheitliche Zufallszahlen. Wenn der erste Wert weniger als 0,003 beträgt, haben sie die Krankheit. Das wird dann für die Sekunde in die Risikoberechnung eingespeist, und wenn die Zufallszahl für jede Person geringer ist als ihr Risiko, haben sie das Symptom.

Dies ist eine Art trampelnde, unelegante Art, Dinge zu tun, und es ist wahrscheinlich, dass jemand mit einem weitaus effizienteren Ansatz vorbeikommt. Aber ich finde es in Simulationsstudien nützlich, jeden Schritt im Code zu buchstabieren, und es ist nützlich, ihn so nah wie möglich an einem Datensatz in der realen Welt zu halten.

Fomite
quelle
Danke für die Antwort; Das SuperEbola-Beispiel ist wirklich lehrreich und nützlich! Der Rest Ihrer Antwort bleibt für mich ziemlich unklar, insbesondere wenn Sie sagen: "Berechnen Sie das Grundrisiko des Symptoms, das Sie benötigen, um 0,15 in der gesamten Bevölkerung zu erhalten, wobei zu berücksichtigen ist, dass 0,03% Ihrer Bevölkerung eine höhere Rate aufweisen." ". Wie berechnet man dieses Basisrisiko?
Tommaso
Ehrlich gesagt ist es ein Schmerz zu tun. Wenn ich Sie wäre, würde ich mein Beispiel etwas ändern - und nicht behaupten , dass das Gesamtrisiko in der Bevölkerung 0,15 ist, würde ich das Grundrisiko in den nicht erkrankten sagen, sagen wir, 0,15 oder 0,10, dann bestimmen die Zunahme Ich möchte in der Krankheit das Gesamtrisiko fallen lassen, wo es mag, anstatt zu versuchen, es festzulegen. Das Codieren ist erheblich einfacher, obwohl Sie möglicherweise keine Zahlen haben, die am Ende ganz so sauber sind.
Fomite
0

Erste Frage:

Ja, das ist natürlich fast die Definition, obwohl mit Ihrer Stichprobengröße ein Fehler verbunden ist. Dies ist nur bei einer unendlichen Stichprobengröße genau richtig.

Zweite Frage:

Dies nennt man Bayes-Theorem , aber ich nehme an, dass Sie das bereits wissen. Angesichts der von Ihnen angegebenen Informationen erhalte ich die Wahrscheinlichkeit von P (D | S) als 0,18 oder 18%:

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

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

= 0.18

Leider bin ich mit R nicht allzu vertraut und kann Ihnen daher mit einem genauen Programm nicht wirklich weiterhelfen. Aber sicherlich ist die Anzahl der Personen, die in jede Gruppe fallen, recht einfach zu berechnen:

Für Ihr 10000-Probenset benötigen Sie:

  1. 50 Personen mit Symptomen (Bevölkerung * P (S))
  2. 9 Personen sollten Symptome und die Krankheit haben (50 * P (D | S))
  3. 21 Menschen mit der Krankheit und ohne Symptome (Bevölkerung * P (D) = 30 und wir haben bereits 9)

Das sollte die Generierung einer geeigneten Bevölkerung ziemlich trivial machen.


quelle
Ja, der wahre Wert ist 0,18. Entschuldigen Sie die falsche Eingabe. Der zweite Teil Ihrer Antwort ist richtig, aber das Problem besteht darin, einen Datensatz (in R) zu erstellen, der wirklich 9 Personen mit Krankheit und Symptomen enthält. Die "Probe" -Funktion erzeugt korrekt 50 und 30 "Ja" für Symptom bzw. Krankheit; Es wird jedoch nicht sichergestellt, dass 9 Personen (von 30) ebenfalls zur Gruppe der "Ja-Krankheiten" gehören.
Tommaso
Wieder befürchten Sie, dass Sie jemanden brauchen, der mit R besser vertraut ist als ich, der Ihnen bei der Verwendung dieser Beispielfunktion hilft. Sie könnten jedoch immer eine viel größere Population generieren und dann zufällig 10000 Stichproben daraus auswählen.