Obliczenia mocy / wielkość próbki do badania biomarkerów

13

Mamy potencjalny biomarker do przewidywania, czy pacjent ma raka, czy nie. Wynik testu biomarkera jest dodatni lub ujemny. Chcemy dowiedzieć się, jaką liczbę pacjentów należy zbadać, aby ustalić, czy ten biomarker jest dobrym predyktorem, czy nie.

Z lektury w Internecie wydaje się, że najlepiej jest przyjrzeć się czułości (liczby przypadków) i specyficzności (liczbie kontroli). Sugeruje się, aby potraktować tę sytuację jako test proporcji jednej próby, ale nie jest jasne, w jaki sposób należy szacować czułość i zakres, do którego jesteś przygotowany. Jeśli powiesz, że uważam jakikolwiek biomarker o czułości większej niż 0,8 za „dobry”, jak ustawiłbyś te dwie zmienne? Chciałbym, aby moja hipoteza zerowa była biomarkerem, nie jest lepsza niż losowe przypisanie, tj. Czułość 0,5. Czy ktoś mógłby podać przykład najlepszego sposobu na zrobienie tego (szczególnie jeśli jest to w R).

danielsbrewer
źródło
Czy mówisz, że zaczniesz od zestawu znanych przypadków, następnie wykonaj test biomarkera (zbierz dane) i oszacuj czułość? A zaczniesz od zestawu znanych kontroli, zbierzesz dane i oszacujesz specyfikę?
Dla tego obliczenia obowiązuje tak. W rzeczywistości nie będziemy wiedzieć przed rekrutacją pacjentów, ale będziemy rekrutować do czasu, aż będziemy mieli wystarczającą liczbę przypadków i kontroli. Mamy również szacunkową częstość występowania przypadków u pacjenta, dzięki czemu możemy ją wykorzystać do oszacowania całkowitej liczby osób, które będziemy musieli zatrudnić,
danielsbrewer
Jeśli biomarker daje tylko odpowiedź tak / nie, możesz przejść z czułością / swoistością i planować w kontekście testów proporcji. Jeśli wartość jednego z nich jest „dobra” lub „zła”, zależy od rzeczywistych konsekwencji fałszywej decyzji. Jeśli biomarker początkowo daje ciągły pomiar, wówczas bardziej odpowiednie mogą być krzywe ROC i statystyki AUC oraz odpowiednie metody planowania wielkości próby. Ale wszystko to tylko rysuje powierzchnię metod związanych z testami diagnostycznymi ...
psj

Odpowiedzi:

11

Porozmawiajmy o wrażliwości (którą oznaczymy przez ), specyficzność jest podobna. Oto podejście częste; Byłoby wspaniale, gdyby jeden z Bayesian mógł dodać kolejną odpowiedź, aby omówić alternatywny sposób rozwiązania tego problemu.p

Załóżmy, że zwerbowałeś osób chorych na raka. Do każdego z nich zastosujesz test biomarkera, aby uzyskać ciąg zer i jedynek, które nazwiemy . Wpisy będą miały rozkład Bernoulliego z prawdopodobieństwem sukcesu p . Oszacowanie p wynosi P = Σ x / n . Mam nadzieję, że p jest „duży”, a można ocenić precyzję swojej oszacowania poprzez przedziału ufności dla p . nxxppp^=x/np^p

np=0.5np=0.57α=0.05

Istnieją co najmniej dwa podejścia - analityczne i symulacyjne. pwrPakiet w Rjuż istnieje, aby pomóc w tym projekcie - trzeba go najpierw zainstalować. Następnie potrzebujesz rozmiaru efektu, a następnie pożądaną funkcją jest 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

Gdy zdobędziesz swoje dane, sposobem na uruchomienie testu jest (symuluję dane ze względu na 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]

EDYCJA: Jeśli bardziej podoba ci się podejście do symulacji, możesz to zrobić w następujący sposób: ustaw

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

i niech runTestbędzie

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

więc oszacowanie mocy jest

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

źródło