Dans le prolongement du post de Stephan Kolassa (je ne peux pas ajouter ceci en tant que commentaire), j'ai un code alternatif pour une simulation. Cela utilise la même structure de base, mais est un peu plus explosé, donc c'est peut-être un peu plus facile à lire. Il est également basé sur le code de Kleinman et Horton pour simuler la régression logistique.
nn est le nombre dans l'échantillon. La covariable doit être distribuée normalement en continu et normalisée pour signifier 0 et sd 1. Nous utilisons rnorm (nn) pour générer cela. Nous sélectionnons un rapport de cotes et le stockons dans odds.ratio. Nous choisissons également un numéro pour l'interception. Le choix de ce nombre détermine quelle proportion de l'échantillon a vécu "l'événement" (par exemple 0,1, 0,4, 0,5). Vous devez jouer avec ce nombre jusqu'à ce que vous obteniez la bonne proportion. Le code suivant vous donne une proportion de 0,1 avec une taille d'échantillon de 950 et un OR de 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)
le résumé (proportion) confirme que la proportion est ~ 0,1
Puis en utilisant les mêmes variables, la puissance est calculée sur 10000 runs:
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)
Je pense que ce code est correct - je l'ai vérifié par rapport aux exemples donnés dans Hsieh, 1998 (tableau 2), et il semble être d'accord avec les trois exemples qui y sont donnés. Je l'ai également testé contre l'exemple des pages 342 à 343 de Hosmer et Lemeshow, où il a trouvé une puissance de 0,75 (contre 0,8 à Hosmer et Lemeshow). Il se peut donc que dans certaines circonstances, cette approche sous-estime le pouvoir. Cependant, lorsque j'ai exécuté le même exemple dans cette calculatrice en ligne , j'ai constaté qu'il était d'accord avec moi et non le résultat dans Hosmer et Lemeshow.
Si quelqu'un peut nous dire pourquoi c'est le cas, je serais intéressé de savoir.