Calculs de puissance / taille d'échantillon pour l'étude des biomarqueurs

13

Nous avons un biomarqueur potentiel pour prédire si un patient a un cancer ou non. Le résultat du test du biomarqueur est binaire positif ou négatif. Nous voulons avoir une idée de la quantité de patients qui doivent être testés pour déterminer si ce biomarqueur est un bon prédicteur ou non.

De la lecture sur Internet, il semble que le chemin à parcourir est de regarder la sensibilité (pour le nombre de cas) et la spécificité (pour le nombre de contrôles). Il est suggéré de traiter cette situation comme un test de proportion à un échantillon, mais il reste difficile de savoir comment procéder pour estimer la sensibilité et la plage à laquelle vous êtes prêt à l'exception. Si je considère que tout biomarqueur avec une sensibilité supérieure à 0,8 est "bon", comment définiriez-vous les deux variables? J'aimerais que mon hypothèse nulle soit que le biomarqueur n'est pas mieux qu'une assignation aléatoire c'est-à-dire une sensibilité de 0,5. Quelqu'un pourrait-il donner un exemple de la meilleure façon de le faire (surtout si c'est en R).

danielsbrewer
la source
Voulez-vous dire que vous allez commencer par un ensemble de cas connus, effectuer ensuite votre test de biomarqueur (collecter des données) et estimer la sensibilité? Et vous commencerez par un ensemble de contrôles connus, collecterez des données et estimerez la spécificité?
Pour ce calcul en effet oui. En réalité, nous ne le saurons pas avant le recrutement des patients, mais nous continuerons à recruter jusqu'à ce que nous ayons suffisamment de cas et de contrôles. Nous avons également un taux estimé qu'un patient sera un cas afin que nous puissions l'utiliser pour estimer le nombre total que nous devrons recruter,
danielsbrewer
Si le biomarqueur ne donne qu'une réponse oui / non, vous pouvez choisir la sensibilité / spécificité et planifier dans un contexte de tests de proportions. Si une valeur pour l'un d'eux est "bonne" ou "mauvaise", cela dépend des conséquences réelles d'une fausse décision. Si le biomarqueur donne à l'origine une mesure continue, les courbes ROC et les statistiques AUC et les méthodes de planification de la taille d'échantillon correspondantes peuvent être plus appropriées. Mais tout cela ne fait qu'effleurer la surface des méthodes liées aux tests de diagnostic ...
psj

Réponses:

11

Parlons de sensibilité (que nous noterons ), la spécificité est similaire. Ce qui suit est une approche fréquentiste; ce serait formidable si l'un des Bayésiens ici pouvait ajouter une autre réponse pour discuter d'une autre façon de procéder.p

nxxppp^=X/np^p

np=0,5np=0,57α=0,05

Il existe au moins deux approches - analytique et simulation. Le pwrpaquetage Rexiste déjà pour aider à cette conception - vous devez d'abord l'installer. Ensuite, vous aurez besoin d'une taille d'effet, puis la fonction que vous souhaitez est pwr.p.test.

library(pwr)
h1 <- ES.h(0.57, 0.5)
pwr.p.test(h = h1, n = NULL, sig.level = 0.05, power = 0.9, alt = "greater")

     proportion power calculation for binomial distribution (arc... 

              h = 0.1404614
              n = 434.0651
      sig.level = 0.05
          power = 0.9
    alternative = greater

4350,570,900,050,57

Une fois que vous avez vos données, la façon d'exécuter le test est (je vais simuler les données à des fins d'argument).

n <- 435
sens <- 0.57
x <- rbinom(n, size = 1, prob = sens)
binom.test(sum(x), n, p = 0.5, alt = "greater")

    Exact binomial test

data:  sum(x) and n 
number of successes = 247, number of trials = 435,
p-value = 0.002681
alternative hypothesis: true probability of success is greater than 0.5 
95 percent confidence interval:
 0.527342 1.000000 
sample estimates:
probability of success 
             0.5678161 

0,568p[0,527,1]

EDIT: Si vous aimez mieux l'approche de simulation, vous pouvez le faire de cette façon: définissez

n <- 435
sens <- 0.57
nSim <- 1000

et laisse runTestêtre

runTest <- function(){
  x <- rbinom(1, size = n, prob = sens)
  tmp <- binom.test(x, n, p = 0.5, alt = "greater")
  tmp$p.value < 0.05
}

donc l'estimation de la puissance est

mean(replicate(nSim, runTest()))
[1] 0.887

la source