条件付き確率でデータセットを作成する方法は?


8

ある病気(D)の有病率 31000。また、ある症状(S)有病率(一般集団=その病気の人)Dおよびその疾患のない人(おそらく他の疾患にかかっているが、それは重要ではない))の 51000。以前の研究では、条件付き確率がP(S|D)=30% (症状が出る確率 S、病気を考えると D です 30%)。

最初の質問P(S|D) 症状の有病率と同等と解釈される S 病気にかかっている人々のグループで D

2番目の質問:Rでデータセットを作成します。

P(D|S)=P(S|D)P(D)P(S)
私の架空のデータを使って、 P(D|S)=0.18、それはこのように解釈されます:症状のある患者がいる場合 S、彼が病気にかかっている確率 D です 18%

これを行う方法?sample関数を単純に使用すると、データセットには次の情報が不足しています。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)

だから私の質問は:私が望む条件付き確率を含めて、良いデータセットを作成する方法は?

編集:私の意見では、私の質問のため、私は同じ質問をstackoverflow.com(/programming/7291935/how-to-create-a-dataset-with-conditional-probability)にも投稿しましたR言語プログラムに継承されますが、統計理論にも継承されます。


3
一般的な礼儀は、別のSEサイトにクロスポストしたことを示すことです。stackoverflow.com/questions/7291935/...
ブランドンBertelsen

1
移行のためのSOに関する質問にフラグを付けました。クロスポストしないでください!
chl

回答:


11

あなたは次の限界確率を知っています

                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.3これがなるように

                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

そして確かa/(a+c) = 0.18にあなたが述べたように。

したがって、Rでは次のようなコードを記述できます。

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

ただし、イベントの1つが0.0009の確率で発生する場合、1000は小さなサンプルであることに注意してください。


素晴らしいソリューション、それは素晴らしい働きをします!これで、ベイズの式で計算できるものを示すデータセットを作成できます。どうもありがとう!
Tommaso

誰かがよりエレガントなものと一緒に来るとあなたに言いました;)
Fomite

@henry私の新しい質問をここでご覧いただければ幸いです:stats.stackexchange.com/questions/15202/…。これはこの質問を一般化したもので、2つの症状があります。
Tommaso

3

table関数は、行列状オブジェクトを返します。

> 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

したがって、Pr(D | S = "yes")=

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

初めてパラメーターを使用して実行したので、問題を変更しました。

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

そして、Pr(D | S = "yes")の0はかなり退屈だと思いました。これを何度も実行する場合は、関数を作成し、その関数をその関数で使用する必要がありreplicateます。

これは、無症候性グループで使用されるよりも3倍高い、症候性グループでの疾患の異なる確率を適用するデータセットを構築する方法です。

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

完璧で素敵でエレガントなトリック!探しているものを形式化するために、回答に新しい情報を追加しました。
Tommaso

2

私はあなたの質問がR言語に大きく依存しているのではなく、ここではより適切であると主張します。

最初の質問:p(S | D)は、疾患Dの集団で症状S が発生するリスクです。これは、症状が疾患の期間に影響を与えないなど、特定の注意事項がある有病率と直接比較できます。次の例を考えてみます。SuperEbolaの症状の1つは、p(Death | Super Ebola)= 0.99のInstant Deathです。ここでは、病気のサンプルを採取できる人がいないため、症状の有病率は実際には非常に低くなります(実際には0.00)。

2番目の質問:少し段階的にこれに戻ります。まず、母集団の0.03%がより高い率になることを考慮して、母集団全体で0.15を取得する必要がある症状のベースラインリスクを計算します。次に、基本的に2つの確率を生成します。

  • 病気のリスク= 0.003
  • 症状のリスク=計算されたベースラインリスク+疾患による相対的な増加*疾患の状態のバイナリ指標

次に、2つの均一な乱数を生成します。最初の値が0.003未満の場合は、病気になっています。次に、2番目のリスク計算に入力され、各個人の乱数がリスクよりも小さい場合、症状が出ています。

これは一種の無作法で洗練されていない方法であり、誰かがはるかに効率的なアプローチでやって来るでしょう。しかし、シミュレーションの研究では、コードの各ステップのスペルを確認しており、現実世界でのデータセットの表示方法にできるだけ近づけておくと便利です。


答えてくれてありがとう SuperEbolaの例は本当に教育的で便利です!特に「症状のベースラインリスクを計算するには、母集団の0.03%がより高い率であることを考慮に入れて、母集団全体で0.15を取得する必要があります。 」このベースラインリスクの計算方法は?
Tommaso

正直なところ、それは苦痛です。もし私があなただったら、私の例を少し変更します- 母集団の全体的なリスクが0.15であると主張するのではなく、非罹患者のベースラインリスクは、例えば0.15または0.10であると言ってから、増加を決定します私は病気になりたいと思って、全体的なリスクを、それを設定しようとするのではなく、可能性のあるところに落とします。コードを書くのはかなり簡単ですが、最後に非常にきれいな数値が得られない可能性があります。
Fomite、2009

0

最初の質問:

はい、もちろんそれはほぼ定義ですが、サンプルサイズに関連するいくつかのエラーがあります。つまり、これは無限のサンプルサイズでのみ正確です。

2番目の質問:

これはベイズの定理と呼ばれますが、すでにご存知だと思います。今あなたが提供した情報を与えられて私は0.18または18%としてP(D | S)の確率を得ます:

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

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

= 0.18

残念ながら、私はRにあまり詳しくないので、正確なプログラムを手助けすることはできません。しかし、確かに、各グループに分類される人々の量は非常に簡単に計算できます。

10000サンプルセットの場合、次のものが必要です。

  1. 症状のある50人(人口* P(S))
  2. 9人は症状と病気を持っているべきです(50 * P(D | S))
  3. 病気で症状のない21人(人口* P(D)= 30、すでに9人)

これにより、適切な母集団を生成することはかなり簡単になります。


はい、本当の値は0.18です。タイプミスをすみません。答えの2番目の部分は正しいですが、問題は、実際に病気と症状のある9人のデータセット(R)を作成することです。「サンプル」機能は、症状と疾患に対してそれぞれ50と30の「はい」を正しく作成します。ただし、9人(30人中)が「yes-disease」グループに属していることは保証されません。
Tommaso

このサンプル関数の使用を手助けするために、私よりもRに詳しい人が必要かもしれません。ただし、常にはるかに大きな母集団を生成し、その中からランダムに10000個のサンプルを選択することができます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.