有病率を知らずに正と負の予測値を推定する

Aug 22 2020

現在、検査の陽性予測値については多くの議論があります。特異性、検査の感度、有病率を知っていれば、$p$ サンプルでは、​​正の予測値(ppv)と負の予測値(npv)を簡単に計算できます。

$ppv = \frac{p\cdot Sens}{p\cdot Sens + (1-p)\cdot(1-Spec)}$

そして

$npv = \frac{(1-p)\cdot Spec}{(1-p)\cdot Spec+p\cdot(1-Sens)}$

しかし、これは私が有病率を知っていることを必要とします、そしてもちろんこの数を知る唯一の方法は私がppvなどを知らないテストからです...

ただし、ベイジアンフレームワークでppvとnpvを推定する代わりに、正の比率とテスト数を使用することはできないのではないかと考えていました。考え方は次のとおりです。

十分に高い特異性と感度を考えると、100回のテストのうち90回が陽性である場合、これらすべてのテストが誤検出である可能性はほとんどありません。たとえば95%の特異度を仮定すると、80の偽陽性テストでさえ非常にありそうにないようです。

  • ネガティブなケースは最大90件あります
  • 5%で90のうち80が表示される確率:2.833227e-92

したがって、このような低いppvは、観察結果と一致していません。これにより、JAGSで次のモデルにたどり着きました。

rm(list = ls())

#### Model Parameters
N     <- 360139 # Number of Sars-CoV2 tests week 15 in Germany
N.pos <-  29302 # Number of positives tests in week 15
Spec  <- .956
Sens  <- .989

lim.min <- 0.00001
lim.max <- 0.99999

#### Sampler parameters
n.iter <- 100000
n.burn <-  10000
n.chains <- 8
n.thin   <- 4


library(R2jags)

modelstring <- "
model {
  # Probability of being infected
  p.inf ~ dbeta(1,1) T(lim.min, lim.max)
  # Number of infected among the tested
  N.inf ~ dbin(p.inf, N)
  # Not infected is the rest of the test
  N.ninf <- N - N.inf
  # number of true positives
  N.tpos ~ dbin(Sens, N.inf)
  # False positives based on uninfected in the sample
  N.fpos ~ dbin(1-Spec, N.ninf)
  
  ppv <- N.tpos / (N.pos)
  npv <- N.tneg / (N.tneg + N.fneg)

  # Just for outpout
  N.tneg <- N.ninf - N.fpos
  N.fneg <- N.inf  - N.tpos

  # True and false positives have to make up the
  # total number of positive tests (sum of binomials)
  N.pos ~ sum(N.tpos, N.fpos)
}
"

init <- function(){
  nn <- ( N.pos / 2 )
  list( 
    N.tpos = nn,
    N.fpos = N.pos - nn,
    N.inf  = nn
  )
}

jData <- list(
  lim.min = lim.min,
  lim.max = lim.max,
  
  N      = N,
  N.pos  = N.pos,
  Spec   = Spec,
  Sens   = Sens
)

params <- c("p.inf","N.inf","N.tpos","N.fpos","N.tneg","N.fneg","ppv","npv")

jres <- jags(data=jData, inits = init, model.file = textConnection(modelstring), parameters.to.save = params, 
             n.thin = n.thin, n.iter = n.iter, n.burnin = n.burn, n.chains = n.chains )
jres

私の考えは正しいですか、そしてそのようなモデルは実際の有病率についての仮定なしでppvとnpvを推定することができます(p.inf変数で前にフラット)。そのようなアプローチは実際にも使用されていますか、それとも実際のppvは異なって推定されていますか?

このモデルの最尤バージョンも定義できるはずですが、二項式の合計のため、おそらく非常に醜いでしょう。

回答

2 psboonstra Aug 22 2020 at 03:09

私はRJagsを使用していないので、コードを確認できませんが、「はい」と言いますが、3つの注意点があります。

まず、(直感的に)可能性には有病率パラメーターに関する情報がほとんどまたはまったく含まれていないため、後部はほぼ排他的に以前の仕様に依存します。有病率パラメーターの事前分布のさまざまな選択または有病率のさまざまな固定値に対して感度(ここではその単語のさまざまな意味!)分析を行うことをお勧めします。

次に、#### Model Parametersスクリプトのヘッダーの下に感度と特異性を配置しても、実際には、感度と特異性を固定された既知のデータとして扱っています。私はそれらが本物のパラメータとして扱われるべきであると言うでしょう、すなわち事前分布を備えています。有病率が低い場合、ppvは特異性の小さな変化に非常に敏感になります(さらに別の言葉の使い方です!)。逆に、有病率が大きい場合、npvは感度の小さな変化に非常に敏感になります。Andrew Gelmanは、物議を醸しているスタンフォード大学の研究についてブログに投稿しました。これは、とりわけ、covidテストの特異性の推定に関する実質的な不確実性を取り入れていないために分析に批判的でした。

第三に、私はあなたのサンプリングデザインについて疑問に思っています。あなたの文脈で単一の有病率について考えることは理にかなっていますか?ドイツ(スクリプトのコメントに基づいて、データの出所)では、米国(私が住んでいる場所)よりも少し体系的であると思います。しかし、症状があるか暴露されたために検査を行っている人もいるのではないかと心配しています(したがって、検査の決定は検査の結果と相関している可能性があります)が、他の人は外部の理由で検査される可能性があります。 e仕事に戻るか、年配の親戚を訪ねるためにそうする必要があります(したがって、テストするという決定は結果と相関していません)。