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.