🐥

感度100%、PPV●%のアウトカム定義を用いて発現割合を補正する

2024/01/13に公開

確認したいこと

  • 感度100%の定義があれば、その定義を用いて算出された発現割合に対してPPVをかけてあげれば正しい発現割合に補正できるか。
  • 信頼区間はブートストラップで推定できるのではないか。

Rコード

# toy data prep
N <- 100
Y <- rbinom(N, size = 1, prob = 0.3) # 真のアウトカム
A <- Y + (1-Y)*sample(c(0,1), size = N, replace = T) # アウトカム定義
d <- data.frame(A,Y) 

# 2by2 table
(twobytwo <- table(def = A,true = Y)[c(2,1),c(2,1)])

# Estimates
## ここら辺は過去記事書く時のものを流用
sens_ppv_spec <-
  function(mat) {
    
    sens <- mat[1,1]/sum(mat[,1])
    ppv <- mat[1,1]/sum(mat[1,])
    spec <- mat[2,2]/sum(mat[,2])
    
    return(c(sens = sens, ppv = ppv, spec = spec))
    
  }
> sens_ppv_spec(twobytwo)
     sens       ppv      spec 
1.0000000 0.5151515 0.5151515 
# bootstrap CI for calibrated incidence proportion
resampling <-
function(.data){
  
  # resampling
  indices <- sample(1:nrow(.data), replace = T)
  bootsample <- .data[indices,]
  
  # calculate ppv and others
  twobytwo <- table(def = bootsample$A,true = bootsample$Y)[c(2,1),c(2,1)]
  bootest <- sens_ppv_spec(twobytwo)
  
  # get crude proportion and calibrated one using ppv
  crude_prop <- sum(bootsample$A==1)/nrow(bootsample)
  calibrated_prop <- crude_prop*unname(bootest['ppv'])
  
  return(c(crude=crude_prop, 
           calibrated=calibrated_prop))
}

結果

n=100のブートストラップサンプルでのアウトカムの割合とそのパーセンタイルベースの95%信頼区間を出す。

> iter <- 100
> 
> apply(
+   replicate(iter, resampling(d)),
+       1,
+       function(x) c(mean = mean(x), 
+                     quantile(x,probs = 0.025), 
+                     quantile(x,probs = 0.975)
+                     )
+ )
        crude calibrated
mean  0.66220    0.33980
2.5%  0.55475    0.23475
97.5% 0.76000    0.44525

点推定値・信頼区間ともに、真のアウトカム定義を利用した場合と同等であった。

> binom.test(x=sum(d$Y==1),n=sum(twobytwo))$est
probability of success 
                  0.34 
> binom.test(x=sum(d$Y==1),n=sum(twobytwo))$conf.int[c(1,2)]
[1] 0.2482235 0.4415333

Discussion