Làm thế nào để tạo một tập dữ liệu với xác suất có điều kiện?


8

Giả sử rằng một bệnh nào đó ( ) có tỷ lệ lưu hành là . Cũng giả sử rằng một triệu chứng nhất định ( ) có tỷ lệ lưu hành (trong dân số chung = người mắc bệnh D và những người không mắc bệnh này [có thể mắc bệnh khác, nhưng nó không quan trọng]) của . Trong một nghiên cứu trước đây, người ta đã phát hiện ra rằng xác suất có điều kiện (xác suất có triệu chứng , với bệnh là ).D31000S51000P(S|D)=30%SD30%

Câu hỏi đầu tiên : có thể được hiểu là tương đương với tỷ lệ mắc triệu chứng trong nhóm người mắc bệnh không?P(S|D)SD

Câu hỏi thứ hai : Tôi muốn tạo trong R một tập dữ liệu, cho thấy:

P(D|S)=P(S|D)P(D)P(S)
Với dữ liệu giả tưởng của tôi, chúng ta có thể tính , được hiểu theo cách này : đưa ra một bệnh nhân có triệu chứng , xác suất anh ta mắc bệnh là .P(D|S)=0.18SD18%

làm như thế nào? Nếu tôi chỉ sử dụng samplehàm, tập dữ liệu của tôi thiếu thông tin rằng :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)

Vì vậy, câu hỏi của tôi là: làm thế nào để tạo ra một bộ dữ liệu tốt, bao gồm xác suất có điều kiện mà tôi mong muốn?

EDIT : Tôi cũng đã đăng câu hỏi tương tự trên stackoverflow.com ( /programming/7291935/how-to-create-a-dataset-with-conditable-probability ), bởi vì, theo tôi, câu hỏi của tôi được kế thừa chương trình ngôn ngữ R, nhưng cũng theo lý thuyết thống kê.


3
Phép lịch sự phổ biến là biểu thị rằng bạn đã đăng chéo tại một trang SE khác. stackoverflow.com/questions/7291935/ từ
Brandon Bertelsen

1
Tôi đã gắn cờ câu hỏi của bạn trên SO để di chuyển. Xin vui lòng, không đăng chéo!
chl

Câu trả lời:


11

Bạn biết các xác suất cận biên sau

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

a/(a+b) = 0.3vì vậy điều này trở thành

                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

và thực sự a/(a+c) = 0.18như bạn đã nêu.

Vì vậy, trong R bạn có thể mã hóa một cái gì đó như

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

mặc dù bạn cần lưu ý rằng 1000 là một mẫu nhỏ khi một trong những sự kiện có xác suất xảy ra là 0,0009.


Giải pháp tuyệt vời, nó hoạt động tuyệt vời! Bây giờ tôi có thể tạo một bộ dữ liệu cho thấy công thức Bayes có thể tính toán. Cảm ơn rất nhiều!
Tommaso

Nói với bạn rằng ai đó sẽ đến cùng với một cái gì đó thanh lịch hơn;)
Fomite

@henry Tôi sẽ rất vui nếu bạn có thể xem qua câu hỏi mới của tôi ở đây: stats.stackexchange.com/questions/15202/ Lỗi . Đó là một khái quát của câu hỏi này, với 2 triệu chứng.
Tommaso

3

Các tablehàm trả về một ma trận giống như đối tượng:

> 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

Vậy Pr (D | S = "có") =

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

Tôi đã thay đổi vấn đề vì lần đầu tiên tôi chạy nó với các tham số của bạn, tôi đã nhận được:

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

Và tôi nghĩ rằng một Pr (D | S = "yes") là 0 khá nhàm chán. Nếu bạn định chạy cái này nhiều lần, bạn nên xây dựng một hàm và sử dụng hàm đó với replicatehàm đó.

Dưới đây là phương pháp xây dựng bộ dữ liệu áp dụng xác suất bệnh khác nhau trong nhóm triệu chứng cao gấp 3 lần so với sử dụng trong nhóm không có triệu chứng:

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

Thủ thuật hoàn hảo, tốt đẹp và thanh lịch! Tôi đã thêm một số thông tin mới trong câu trả lời của mình, để chính thức hóa tốt hơn những gì tôi đang tìm kiếm.
Tommaso

2

Tôi cho rằng câu hỏi của bạn không thực sự phụ thuộc nhiều vào ngôn ngữ R, và phù hợp hơn ở đây, bởi vì - nói thẳng ra - việc tạo ra dữ liệu như thế này chủ yếu là một nhiệm vụ thống kê, thay vì lập trình.

Câu hỏi đầu tiên: p (S | D) là nguy cơ có triệu chứng S trong dân số mắc bệnh D. Nó có thể so sánh trực tiếp với tỷ lệ lưu hành với một số trường hợp nhất định, như triệu chứng không ảnh hưởng đến thời gian mắc bệnh. Xem xét ví dụ sau: Một trong những triệu chứng của SuperEbola là Cái chết tức thì, với p (Death | Super Ebola) = 0,99. Ở đây, tỷ lệ hiện mắc của bạn về triệu chứng thực sự sẽ rất thấp (thực sự là 0,00) vì không ai có thể lấy mẫu với căn bệnh này có triệu chứng.

Câu hỏi thứ hai: Tôi sẽ quay lại vấn đề này theo cách hơi từng bước. Đầu tiên, hãy tính toán rủi ro cơ bản của triệu chứng bạn sẽ cần để có 0,15 trong toàn bộ dân số, có tính đến 0,03% dân số của bạn sẽ có tỷ lệ cao hơn. Sau đó, về cơ bản tạo ra hai xác suất:

  • Nguy cơ mắc bệnh = 0,003
  • Nguy cơ triệu chứng = rủi ro cơ bản được tính toán + tăng tương đối do bệnh * chỉ số nhị phân về tình trạng bệnh

Sau đó tạo hai số ngẫu nhiên thống nhất. Nếu người đầu tiên ít hơn 0,003, họ đã mắc bệnh. Điều đó sau đó được đưa vào tính toán rủi ro cho lần thứ hai và nếu số ngẫu nhiên cho mỗi cá nhân ít hơn rủi ro của họ, họ đã có triệu chứng.

Đây là một cách sắp xếp hợp lý, không phù hợp để làm mọi việc, và có khả năng ai đó sẽ đến với một cách tiếp cận hiệu quả hơn nhiều. Nhưng tôi thấy trong các nghiên cứu mô phỏng đánh vần từng bước trong mã và giữ nó gần với cách tôi sẽ thấy một tập dữ liệu trong thế giới thực là hữu ích.


Cảm ơn câu trả lời; ví dụ SuperEbola thực sự mang tính giáo dục và hữu ích! Phần còn lại của câu trả lời của bạn vẫn chưa rõ ràng, đối với tôi, đặc biệt là khi bạn nói "tính toán rủi ro cơ bản của triệu chứng bạn sẽ cần để có 0,15 trong toàn bộ dân số, có tính đến 0,03% dân số của bạn sẽ có tỷ lệ cao hơn ". Làm thế nào để tính toán rủi ro cơ bản này?
Tommaso

Thành thật mà nói, đó là một nỗi đau để làm. Nếu tôi là bạn, tôi sẽ thay đổi ví dụ của mình một chút - thay vì khẳng định rằng rủi ro chung trong dân số là 0,15, tôi sẽ nói rằng rủi ro cơ bản ở người không mắc bệnh là 0,15 hoặc 0,10, sau đó xác định mức tăng trong rủi ro tôi muốn ở người bệnh và để cho rủi ro tổng thể rơi vào nơi có thể, thay vì cố gắng đặt nó. Việc mã hóa dễ dàng hơn đáng kể, mặc dù bạn có thể sẽ không có các số khá rõ ràng ở cuối.
Fomite

0

Câu hỏi đầu tiên:

Tất nhiên đó gần như là định nghĩa, mặc dù bạn sẽ có một số lỗi liên quan đến kích thước mẫu của bạn. tức là Điều này chỉ chính xác ở một cỡ mẫu vô hạn.

Câu hỏi thứ hai:

Đây được gọi là Định lý Bayes , nhưng tôi cho rằng bạn đã biết điều đó. Bây giờ được cung cấp thông tin bạn đã cung cấp, tôi nhận được xác suất P (D | S) là 0,18 hoặc 18%:

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

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

= 0.18

Thật không may, tôi không quá quen thuộc với R nên thực sự không thể giúp bạn với một chương trình chính xác. Nhưng chắc chắn số lượng người rơi vào mỗi nhóm khá dễ tính:

Đối với bộ 10000 mẫu của bạn, bạn cần:

  1. 50 người có triệu chứng (dân số * P (S))
  2. 9 người nên có triệu chứng và bệnh (50 * P (D | S))
  3. 21 người mắc bệnh và không có triệu chứng (dân số * P (D) = 30 và chúng tôi đã có 9)

Điều này sẽ làm cho việc tạo ra một dân số phù hợp khá tầm thường.


Có, giá trị thực là 0,18, xin lỗi vì đã gõ sai. Phần thứ hai trong câu trả lời của bạn là chính xác, nhưng vấn đề là tạo ra một bộ dữ liệu (bằng R) thực sự có 9 người mắc bệnh và triệu chứng. Hàm "mẫu" chính xác tạo ra 50 và 30 "có" tương ứng cho triệu chứng và bệnh; nhưng nó không đảm bảo rằng 9 người (trong số 30 người) cũng thuộc nhóm "có bệnh".
Tommaso

Một lần nữa sợ bạn có thể cần một người quen thuộc với R hơn tôi để giúp bạn sử dụng chức năng mẫu này. Tuy nhiên, bạn luôn có thể tạo ra một dân số lớn hơn nhiều và sau đó chọn ngẫu nhiên 10000 mẫu từ đó.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.