Bagaimana cara membuat dataset dengan probabilitas bersyarat?

8

Misalkan penyakit tertentu (D) memiliki prevalensi 31000. Juga anggaplah suatu gejala tertentu (S) memiliki prevalensi (pada populasi umum = orang dengan penyakit ituD dan orang-orang tanpa penyakit itu [mungkin dengan penyakit lain, tetapi itu tidak penting]) dari 51000. Dalam penelitian sebelumnya, ditemukan bahwa probabilitas bersyaratP(S|D)=30% (probabilitas untuk memiliki gejala S, mengingat penyakitnya D adalah 30%).

Pertanyaan pertama : Bisa jadiP(S|D) diartikan setara dengan prevalensi gejala S pada kelompok orang yang menderita penyakit tersebut D?

Pertanyaan kedua : Saya ingin membuat dalam R dataset, yang menunjukkan bahwa:

P(D|S)=P(S|D)P(D)P(S)
Dengan data fiksi saya, kami dapat menghitung P(D|S)=0.18, yang diinterpretasikan dengan cara ini: diberikan pasien dengan gejala S, probabilitas bahwa ia menderita penyakit tersebut D adalah 18%.

Bagaimana cara melakukannya? Jika saya menggunakan samplefungsi saja, dataset saya kurang informasi ituP(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)

Jadi pertanyaan saya adalah: bagaimana cara membuat dataset yang baik, termasuk probabilitas bersyarat yang saya inginkan?

EDIT : Saya memposting pertanyaan yang sama juga di stackoverflow.com ( /programming/7291935/how-to-create-a-dataset-with-conditional-probability ), karena, menurut pendapat saya, pertanyaan saya diwarisi untuk program bahasa R, tetapi juga untuk teori statistik.

Tommaso
sumber
3
Sopan santun umum adalah untuk menunjukkan bahwa Anda telah mengirim silang di situs SE lain. stackoverflow.com/questions/7291935/…
Brandon Bertelsen
1
Saya menandai pertanyaan Anda pada SO untuk migrasi. Tolong, jangan posting silang!
chl

Jawaban:

11

Anda tahu probabilitas marginal berikut

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

dan a/(a+b) = 0.3begitulah jadinya

                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

dan memang a/(a+c) = 0.18seperti yang Anda nyatakan.

Jadi di R Anda bisa mengkodekan sesuatu seperti

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

meskipun Anda harus mencatat bahwa 1000 adalah sampel kecil ketika salah satu peristiwa memiliki probabilitas 0,0009 terjadi.

Henry
sumber
Solusi yang luar biasa, ini bekerja dengan sangat baik! Sekarang saya bisa membuat dataset yang menunjukkan apa yang bisa dihitung rumus Bayes. Terima kasih banyak!
Tommaso
Memberitahu Anda seseorang akan datang dengan sesuatu yang lebih elegan;)
Fomite
@lalu saya akan sangat senang jika Anda dapat melihat pertanyaan baru saya di sini: stats.stackexchange.com/questions/15202/… . Ini adalah generalisasi dari pertanyaan ini, dengan 2 gejala.
Tommaso
3

The tablemengembalikan fungsi matriks-seperti objek:

> 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

Jadi Pr (D | S = "yes") =

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

Saya mengubah masalah karena pertama kali saya menjalankannya dengan parameter Anda, saya mendapat:

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

Dan saya pikir Pr (D | S = "yes") dari 0 agak membosankan. Jika Anda akan menjalankan ini berkali-kali Anda harus membangun suatu fungsi dan menggunakan fungsi itu dengan replicatefungsi tersebut.

Berikut adalah metode membangun dataset yang menerapkan probabilitas penyakit yang berbeda pada kelompok simtomatik yang 3 kali lebih tinggi daripada yang digunakan pada kelompok asimptomatik:

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
sumber
Trik yang sempurna, bagus dan elegan! Saya menambahkan beberapa informasi baru dalam jawaban saya, untuk memformalkan lebih baik apa yang saya cari.
Tommaso
2

Saya berpendapat bahwa pertanyaan Anda tidak terlalu tergantung pada bahasa R, dan lebih tepat di sini, karena - jujur ​​- generasi data seperti ini sebagian besar adalah tugas statistik, bukan pemrograman.

Pertanyaan pertama: p (S | D) adalah risiko memiliki gejala S dalam suatu populasi dengan penyakit D. Hal ini dapat secara langsung sebanding dengan prevalensi dengan peringatan tertentu, seperti gejala yang tidak berdampak pada durasi penyakit. Pertimbangkan contoh berikut: Salah satu gejala SuperEbola adalah Kematian Instan, dengan p (Kematian | Super Ebola) = 0,99. Di sini, prevalensi gejala Anda sebenarnya akan sangat rendah (memang, 0,00) karena tidak ada orang yang dapat Anda sampel dengan penyakit tersebut yang memiliki gejalanya.

Pertanyaan Kedua: Saya akan kembali ke ini dengan cara yang agak bertahap. Pertama, hitung risiko dasar gejala yang Anda perlukan untuk mendapatkan 0,15 pada seluruh populasi, dengan mempertimbangkan bahwa 0,03% dari populasi Anda akan berada pada tingkat yang lebih tinggi. Maka pada dasarnya menghasilkan dua probabilitas:

  • Risiko penyakit = 0,003
  • Risiko gejala = risiko awal yang dihitung + peningkatan relatif karena penyakit * indikator biner status penyakit

Kemudian menghasilkan dua angka acak yang seragam. Jika yang pertama kurang dari 0,003, mereka menderita penyakit ini. Itu kemudian dimasukkan ke dalam perhitungan risiko untuk yang kedua, dan jika angka acak untuk masing-masing individu kurang dari risiko mereka, mereka punya gejalanya.

Ini adalah semacam cara lamban, tidak sopan untuk melakukan sesuatu, dan kemungkinan seseorang akan datang dengan pendekatan yang jauh lebih efisien. Tapi saya menemukan dalam studi simulasi mengeja setiap langkah dalam kode, dan menjaganya agar tetap dekat dengan bagaimana saya akan melihat kumpulan data di dunia nyata berguna.

Fomite
sumber
Terima kasih atas jawabannya; contoh SuperEbola sangat mendidik dan bermanfaat! Sisa jawaban Anda tetap tidak jelas, bagi saya, terutama ketika Anda mengatakan "hitung risiko dasar gejala yang Anda perlukan untuk mendapatkan 0,15 pada seluruh populasi, dengan mempertimbangkan bahwa 0,03% dari populasi Anda akan berada pada tingkat yang lebih tinggi ". Bagaimana cara menghitung risiko dasar ini?
Tommaso
Jujur saja, ini menyebalkan. Jika saya jadi Anda, saya akan sedikit mengubah contoh saya - daripada menyatakan bahwa risiko keseluruhan dalam populasi adalah 0,15, saya akan mengatakan risiko dasar pada orang yang tidak berpenyakit adalah, katakanlah, 0,15 atau 0,10, kemudian tentukan kenaikannya. Saya ingin risiko dalam penyakit dan membiarkan risiko keseluruhan jatuh di mana mungkin, daripada mencoba untuk mengaturnya. Ini lebih mudah untuk dikodekan, meskipun Anda mungkin tidak akan memiliki angka yang cukup bersih pada akhirnya.
Fomite
0

Pertanyaan pertama:

Ya tentu saja itu hampir definisi, meskipun Anda akan memiliki beberapa kesalahan yang terkait dengan ukuran sampel Anda. yaitu ini hanya tepat pada ukuran sampel yang tak terbatas.

Pertanyaan kedua:

Ini disebut Bayes Theorem , tapi saya kira Anda sudah tahu itu. Sekarang mengingat informasi yang Anda berikan, saya mendapatkan probabilitas P (D | S) sebagai 0,18 atau 18%:

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

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

= 0.18

Sekarang sayangnya, saya tidak terlalu terbiasa dengan R jadi tidak bisa membantu Anda dengan program yang tepat. Tetapi tentunya jumlah orang yang termasuk dalam setiap kelompok cukup mudah untuk dihitung:

Untuk 10.000 set sampel Anda, Anda perlu:

  1. 50 orang dengan gejala (populasi * P (S))
  2. 9 orang harus memiliki gejala dan penyakit (50 * P (D | S))
  3. 21 orang dengan penyakit dan tanpa gejala (populasi * P (D) = 30 dan kami sudah memiliki 9)

Yang seharusnya membuat menghasilkan populasi yang cocok cukup sepele.


sumber
Ya, nilai sebenarnya adalah 0,18, maaf karena salah mengetik. Bagian kedua dari jawaban Anda benar, tetapi masalahnya adalah membuat dataset (dalam R) yang benar-benar memiliki 9 orang dengan penyakit dan gejala. Fungsi "sampel" dengan benar menciptakan 50 dan 30 "ya" untuk, masing-masing, gejala dan penyakit; tetapi tidak memastikan bahwa 9 orang (dari 30) juga termasuk dalam kelompok "penyakit ya".
Tommaso
Sekali lagi takut Anda mungkin membutuhkan seseorang yang lebih terbiasa dengan R daripada saya untuk membantu Anda dalam penggunaan fungsi sampel ini. Namun, Anda selalu dapat menghasilkan populasi yang jauh lebih besar dan kemudian secara acak memilih 10.000 sampel dari sana.