A raíz del post de Stephan Kolassa (no puedo añadirlo como comentario), tengo un código alternativo para una simulación. Éste utiliza la misma estructura básica, pero está un poco más desglosado, por lo que quizás sea un poco más fácil de leer. También se basa en el código de Kleinman y Horton para simular la regresión logística.
nn es el número de la muestra. La covariable debe tener una distribución normal continua y estar estandarizada con una media de 0 y una sd de 1. Utilizamos rnorm(nn) para generarla. Seleccionamos un odds ratio y lo almacenamos en odds.ratio. También elegimos un número para el intercepto. La elección de este número rige la proporción de la muestra que experimenta el "evento" (por ejemplo, 0,1, 0,4, 0,5). Tiene que jugar con este número hasta que consiga la proporción correcta. El siguiente código le da una proporción de 0,1 con un tamaño de muestra de 950 y una 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)
summary(proportion) confirma que la proporción es ~ 0,1
A continuación, utilizando las mismas variables, se calcula la potencia a lo largo de 10.000 carreras:
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)
Creo que este código es correcto - lo he cotejado con los ejemplos dados en Hsieh, 1998 (tabla 2), y parece coincidir con los tres ejemplos dados allí. También lo he comprobado con el ejemplo de las páginas 342 y 343 de Hosmer y Lemeshow, en el que se encontró una potencia de 0,75 (en comparación con el 0,8 de Hosmer y Lemeshow). Así que puede ser que en algunas circunstancias este enfoque subestime la potencia. Sin embargo, cuando he ejecutado el mismo ejemplo en este calculadora en línea He comprobado que está de acuerdo conmigo y no con el resultado de Hosmer y Lemeshow.
Si alguien puede decirnos por qué es así, me interesaría saberlo.