После публикации Стефана Коласса (я не могу добавить это в качестве комментария), у меня есть альтернативный код для симуляции. Здесь используется та же базовая структура, но она разбита немного больше, так что, возможно, ее немного легче читать. Он также основан на коде Кляйнмана и Хортона для моделирования логистической регрессии.
nn - число в образце. Ковариата должна быть непрерывно нормально распределена и стандартизирована, чтобы означать 0 и sd 1. Мы используем rnorm (nn), чтобы сгенерировать это. Мы выбираем соотношение шансов и сохраняем его в odds.ratio. Мы также выбираем номер для перехвата. Выбор этого числа определяет, какая доля образца испытывает «событие» (например, 0,1, 0,4, 0,5). Вы должны играть с этим числом, пока не получите правильную пропорцию. Следующий код дает пропорцию 0,1 с размером выборки 950 и ИЛИ 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)
Резюме (пропорция) подтверждает, что пропорция составляет ~ 0,1
Затем, используя те же переменные, мощность рассчитывается за 10000 прогонов:
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)
Я думаю, что этот код верен - я проверил его по примерам, приведенным в Hsieh, 1998 (таблица 2), и, похоже, он согласен с тремя приведенными там примерами. Я также проверил это на примере 342 - 343 Хосмера и Лемешоу, где он нашел мощность 0,75 (по сравнению с 0,8 в Хосмере и Лемешоу). Так что может случиться так, что в некоторых обстоятельствах этот подход недооценивает власть. Однако, когда я запустил тот же пример в этом онлайн-калькуляторе , я обнаружил, что он согласен со мной, а не с результатами в Hosmer и Lemeshow.
Если кто-нибудь может сказать нам, почему это так, мне было бы интересно узнать.