Obliczanie wielkości próby dla jednoczynnikowej regresji logistycznej

11

Jak obliczyć wielkość próby potrzebną do badania, w którym grupa badanych będzie miała jedną ciągłą zmienną zmierzoną w czasie operacji, a następnie dwa lata później zostaną one zaklasyfikowane jako wynik funkcjonalny lub wynik pogorszony.

Chcielibyśmy sprawdzić, czy pomiar ten mógł przewidzieć zły wynik. W pewnym momencie możemy chcieć uzyskać punkt odcięcia w zmiennej ciągłej, powyżej którego próbujemy interweniować, aby zmniejszyć prawdopodobieństwo pogorszenia wyniku.

Jakieś pomysły? Dowolna implementacja R.

Farrel
źródło
Czy spodziewasz się przerw w pracy w trakcie obserwacji? Czy w twoim modelu są inne zmienne towarzyszące?
chl
Pozwól mi wyssać z kciuka wskaźnik rezygnacji - 20%. Rzeczywiście zbierzemy wiele zmiennych, na przykład wiek, wynik urazu, ale chciałem, aby obliczenia mocy były jak najprostsze. Często uznaję za użyteczne omówienie modelu podstawowego, a następnie modeli wtórnych, które są obciążone większą finezją i niuansami.
Farrel,
Ok, ale zwykle oczekiwany% porzucenia, liczba zmiennych towarzyszących i to, czy zmienne towarzyszące są mierzone z błędami (patrz np. J.mp/9fJkhb ), wprowadź formułę (we wszystkich przypadkach zwiększy to wielkość próby).
chl

Odpowiedzi:

7

Obliczenia wielkości próby regresji logistycznej są złożone. Nie będę tutaj próbował tego streszczać. Racjonalnie dostępne rozwiązania tego problemu można znaleźć w:

Hsieh FY. Przykładowe tabele rozmiarów dla regresji logistycznej. Statystyka w medycynie. 1989 lipiec; 8 (7): 795-802.

Hsieh FY i in. Prosta metoda obliczania wielkości próby dla regresji liniowej i logistycznej. Statystyka w medycynie. 30 lipca 1998; 17 (14): 1623–34.

Dostępną dyskusję na temat zagadnień z przykładowymi obliczeniami można znaleźć w ostatnim rozdziale (Rozdział 8.5 str. 339-347) Stosowanej regresji logistycznej Hosmer & Lemeshow .

Thylacoleo
źródło
7

Zwykle prowadzenie symulacji jest dla mnie łatwiejsze i szybsze. Artykuły długo czytają, rozumieją i ostatecznie dochodzą do wniosku, że nie mają zastosowania w szczególnym przypadku, który jest zainteresowany.

Dlatego wybrałbym tylko kilka tematów, symulowałem zmienną towarzyszącą, którą jesteś zainteresowany (rozłożony tak, jak ci się wydaje,), symulował dobre / złe wyniki w oparciu o postawioną funkcjonalną formę (efekty progowe współzmiennej? Nieliniowość?) z minimalnym (klinicznie) znaczącym rozmiarem efektu, który chcesz wykryć, przeprowadź wynik przez analizę i sprawdź, czy efekt zostanie znaleziony na poziomie alfa. Uruchom to ponownie 10 000 razy i sprawdź, czy uzyskałeś efekt w 80% symulacji (lub jakiejkolwiek innej mocy, której potrzebujesz). Dostosuj liczbę tematów, powtarzaj, aż uzyskasz moc, z której jesteś zadowolony.

Ma to tę zaletę, że jest bardzo ogólny, więc nie jesteś ograniczony do określonej formy funkcjonalnej lub określonej liczby lub rozkładu zmiennych towarzyszących. Możesz dołączyć przerywniki, patrz komentarz chl powyżej, losowo lub pod wpływem zmiennej towarzyszącej lub wyniku. Zasadniczo kodujesz analizę, którą zamierzasz wykonać na końcowej próbce, co czasem pomaga skupić moje myślenie na projekcie badania. I łatwo to zrobić w R (wektoryzacja!).

Stephan Kolassa
źródło
Czy masz sprawą sprawioną w R?
Farrel,
1
@Farrel - oto bardzo krótki skrypt, który zakłada równomiernie rozmieszczone zmienne towarzyszące [0,1], OR 2 między pierwszym i trzecim kwartylem współzmiennej i standardowego szumu normalnego, prowadząc do mocy 0,34 dla n = 100. Bawiłbym się tym, aby zobaczyć, jak wrażliwe jest wszystko na moje założenia: działa <- 1000; nn <- 100; set.seed (2010); wykrycia <- replikacja (n = biegi, wyrażenie = {zmienna współrzędna <- runif (nn); wynik <- runif (nn) <1 / (1 + exp (-2 * log (2) * zmienna towarzysząca + rnorm (nn)) ); podsumowanie (glm (wynik ~ zmienna zmienna, rodzina = „dwumianowy”)) $ współczynniki [„współzmienna”, „Pr (> | z |)”] <.05}) cat („Moc:”, suma (wykrycia) / działa, "\ n")
Stephan Kolassa
1
Możesz załączyć kod jako pastie ( pastebin.com ) lub Gist ( gist.github.com ), jeśli uważasz, że jest to wygodniejsze, i link do niego w komentarzu.
chl
@chl: +1, wielkie dzięki! Oto sedno: gist.github.com/607968
Stephan Kolassa
Świetny kod, ale jest problem. Nie jestem tak mądry jak ty. Potrzebuję go rozbić krok po kroku. Rozumiem, czy działa liczba symulacji? Co to jest nn? Czy to liczba osób biorących udział w badaniu? Potem widzę, że stworzyłeś rozkład zmiennych towarzyszących i kazałeś im określić tak lub nie w zależności od progu.
Farrel,
4

Kontynuując post Stephana Kolassy (nie mogę tego dodać jako komentarza), mam alternatywny kod do symulacji. Wykorzystuje tę samą podstawową strukturę, ale eksploduje nieco bardziej, więc być może jest trochę łatwiejszy do odczytania. Opiera się również na kodzie Kleinmana i Hortona do symulacji regresji logistycznej.

nn jest liczbą w próbce. Zmienna towarzysząca powinna być stale rozkładana normalnie i znormalizowana do wartości 0 i sd 1. Do wygenerowania tego używamy rnorm (nn). Wybieramy iloraz szans i przechowujemy go w nieparzystych. Ratio. Wybieramy również numer do przechwytywania. Wybór tej liczby decyduje o tym, jaka część próby doświadcza „zdarzenia” (np. 0,1, 0,4, 0,5). Musisz grać z tym numerem, aż uzyskasz odpowiednią proporcję. Poniższy kod podaje proporcję 0,1 przy wielkości próbki 950 i OR 1,5:

nn <- 950
runs <- 10000
intercept <- log(9)
odds.ratio <- 1.5
beta <- log(odds.ratio)
proportion  <-  replicate(
              n = runs,
              expr = {
                  xtest <- rnorm(nn)
                  linpred <- intercept + (xtest * beta)
                  prob <- exp(linpred)/(1 + exp(linpred))
                  runis <- runif(length(xtest),0,1)
                  ytest <- ifelse(runis < prob,1,0)
                  prop <- length(which(ytest <= 0.5))/length(ytest)
                  }
            )
summary(proportion)

podsumowanie (proporcja) potwierdza, że ​​proporcja wynosi ~ 0,1

Następnie przy użyciu tych samych zmiennych moc oblicza się na 10000 przebiegów:

result <-  replicate(
              n = runs,
              expr = {
                  xtest <- rnorm(nn)
                  linpred <- intercept + (xtest * beta)
                  prob <- exp(linpred)/(1 + exp(linpred))
                  runis <- runif(length(xtest),0,1)
                  ytest <- ifelse(runis < prob,1,0)
                  summary(model <- glm(ytest ~ xtest,  family = "binomial"))$coefficients[2,4] < .05
                  }
            )
print(sum(result)/runs)

Myślę, że ten kod jest poprawny - porównałem go z przykładami podanymi w Hsieh, 1998 (tabela 2) i wydaje się zgadzać z trzema podanymi tam przykładami. Przetestowałem go również na przykładzie na str. 342 - 343 Hosmer i Lemeshow, gdzie znaleziono moc 0,75 (w porównaniu do 0,8 w Hosmer i Lemeshow). Być może w niektórych okolicznościach takie podejście nie docenia władzy. Jednak kiedy uruchomiłem ten sam przykład w tym kalkulatorze internetowym , okazało się, że zgadza się on ze mną, a nie z wynikami w Hosmer i Lemeshow.

Jeśli ktoś mógłby nam powiedzieć, dlaczego tak jest, byłbym zainteresowany.

Andrzej
źródło
Mam 2 pytania, jeśli nie masz nic przeciwko temu. 1) Czy funkcja proporcji jest po prostu poprawna? 2) Jaka jest logika używania YTEST (porównywanie probu z losowym losowaniem uni)?
B_Miner
@B_Miner 1) Odwrotnie - aby uzyskać prawidłową proporcję, musisz poprawnie ustawić punkt przecięcia - dostosowuj punkt przecięcia do momentu uzyskania oczekiwanej proporcji. 2) Logika ytest polega na tym, że musimy uzyskać dychotomiczny wynik 0 lub 1. Porównujemy więc każdą próbkę z rozkładu jednolitego do prawdopodobieństwa (prob), aby uzyskać nasz dychotomiczny wynik. „Runis” nie musi być pobierany z losowego rozkładu jednorodnego - dwumianowy lub inny rozkład może mieć większy sens dla twoich danych. Mam nadzieję, że to pomoże (przepraszam za opóźnienie w odpowiedzi).
Andrew
3

θ=10:θ=0 . wydaje się, że nie określasz żadnego kryterium wyboru wielkości próby.

w rzeczywistości brzmi to tak, jakby twoje badania były prowadzone sekwencyjnie. w takim przypadku opłaca się uczynić z tego wyraźną część eksperymentu. sekwencyjne próbkowanie może często być bardziej wydajne niż eksperyment o ustalonej wielkości próby [średnio potrzeba mniej obserwacji].

farrel: dodaję to w odpowiedzi na twój komentarz.

aby uzyskać wielkość próby, zwykle określa się jakieś kryterium precyzji dla oszacowania [takiego jak długość CI] LUB mocy przy określonej alternatywie testu, który należy przeprowadzić na danych. zdaje się, że wymieniłeś oba te kryteria. w zasadzie nie ma w tym nic złego: wystarczy wykonać dwa obliczenia wielkości próbki - jedno dla uzyskania pożądanej dokładności oszacowania - i drugie dla uzyskania pożądanej mocy przy podanej alternatywie. wymagany jest większy z dwóch rozmiarów próbek. [btw - inaczej niż mówiąc o 80% mocy - wydaje się, że nie wspomniałeś o tym, jaki test planujesz wykonać - ani o alternatywie, przy której chcesz 80% mocy.]

jeśli chodzi o stosowanie analizy sekwencyjnej: jeśli badani są zapisani do badania jednocześnie, wówczas ustalony rozmiar próby ma sens. ale jeśli przedmiotów jest niewielu i to daleko od siebie, uzyskanie wymaganej liczby może zająć rok lub dwa [lub więcej]. w ten sposób proces może trwać trzy lub cztery lata [lub więcej]. w takim przypadku schemat sekwencyjny oferuje możliwość zatrzymania się wcześniej - jeśli efekt, którego szukasz, stanie się statystycznie znaczący na wcześniejszym etapie badania.

ronaf
źródło
Kryteriami będzie 10% różnica w prawdopodobieństwie dobrego lub złego wyniku. Albo powiedzmy, że będzie to regresja logistyczna, iloraz szans = 2. alfa = 0,05, moc = 80%, nie wiem jeszcze, co to jest łączna wariancja zmiennej ciągłej, ale załóżmy, że odchylenie standardowe wynosi 7 mmHg. Analiza sekwencyjna byłaby dobra, ale końcowy wynik to dwa lata po wykonaniu pomiaru.
Farrel,