Cálculo del tamaño de muestra para regresión logística univariante

11

¿Cómo se calcula el tamaño de la muestra necesaria para un estudio en el que una cohorte de sujetos tendrá una única variable continua medida en el momento de la cirugía y luego, dos años después, se clasificarán como resultado funcional o resultado deteriorado?

Nos gustaría ver si esa medición podría haber predicho el mal resultado. En algún momento, es posible que queramos derivar un punto de corte en la variable continua por encima del cual trataríamos de intervenir para disminuir la probabilidad del resultado perjudicado.

¿Algunas ideas? Cualquier implementación de R.

Farrel
fuente
¿Espera algunos abandonos durante el seguimiento? ¿Hay otras covariables que se incluirán en su modelo?
chl
Déjame chupar una tasa de abandono de mi pulgar: 20%. De hecho, recopilaremos muchas variables, por ejemplo, edad, puntaje de trauma, pero quería mantener las cosas lo más simples posible para el cálculo del poder. A menudo he encontrado útil discutir un modelo primario y luego modelos secundarios que están cargados con más delicadeza y matices.
Farrel
Ok, pero generalmente el% de abandono esperado, el número de covariables y si las covariables se miden con errores (ver, por ejemplo, j.mp/9fJkhb ) ingrese la fórmula (en todos los casos, aumentará el tamaño de la muestra).
chl

Respuestas:

7

Los cálculos del tamaño de la muestra para la regresión logística son complejos. No intentaré resumirlo aquí. Las soluciones razonablemente accesibles a este problema se encuentran en:

Hsieh FY. Tablas de tamaños de muestra para regresión logística. Estadística en medicina. Julio de 1989; 8 (7): 795-802.

Hsieh FY, y col. Un método simple de cálculo de tamaño de muestra para regresión lineal y logística. Estadística en medicina. 30 de julio de 1998; 17 (14): 1623-34.

Se puede encontrar una discusión accesible de los problemas con ejemplos de cálculos en el último capítulo (Sección 8.5 págs. 339-347) de la Regresión logística aplicada de Hosmer & Lemeshow .

Tilacoleo
fuente
7

Por lo general, me resulta más fácil y rápido ejecutar una simulación. Los documentos tardan mucho en leer, comprender y finalmente llegar a la conclusión de que no se aplican en el caso especial en el que uno está interesado.

Por lo tanto, simplemente elegiría una serie de temas, simularía la covariable que le interesa (distribuida como cree que será), simularía resultados buenos / malos en función de la forma funcional que postula (¿efectos de umbral de la covariable? ¿No linealidad?) con el tamaño mínimo (clínicamente) significativo del efecto que le gustaría detectar, ejecute el resultado a través de su análisis y vea si el efecto se encuentra en su alfa. Vuelva a ejecutar esto 10,000 veces y vea si encontró el efecto en el 80% de las simulaciones (o cualquier otra potencia que necesite). Ajuste el número de sujetos, repita hasta que tenga un poder con el que esté satisfecho.

Esto tiene la ventaja de ser muy general, por lo que no está limitado a una forma funcional específica o un número específico o distribución de covariables. Puede incluir abandonos, ver el comentario de chl arriba, ya sea al azar o influenciado por covariable o resultado. Básicamente codifica el análisis que va a hacer en la muestra final de antemano, lo que a veces ayuda a centrar mi pensamiento en el diseño del estudio. Y se hace fácilmente en R (¡vectorizar!).

Stephan Kolassa
fuente
¿Tienes un caso trabajado en R?
Farrel
1
@Farrel: aquí hay una secuencia de comandos muy corta, que supone covariables distribuidas de manera uniforme [0,1], un OR de 2 entre el primer y el tercer cuartil de la covariable y el ruido normal estándar, que conduce a una potencia de .34 para n = 100. Jugaría con esto para ver cuán sensible es todo a mis suposiciones: ejecuta <- 1000; nn <- 100; set.seed (2010); detecciones <- replicar (n = carreras, expr = {covariable <- runif (nn); resultado <- runif (nn) <1 / (1 + exp (-2 * log (2) * covariante + rnorm (nn)) ); resumen (glm (resultado ~ covariable, familia = "binomial")) $ coeficientes ["covariable", "Pr (> | z |)"] <.05}) cat ("Potencia:", suma (detecciones) / runs, "\ n")
Stephan Kolassa
1
Puede adjuntar su código como pastie ( pastebin.com ) o Gist ( gist.github.com ) si lo considera más conveniente, y volver a vincularlo en su comentario.
chl
@chl: +1, muchas gracias! Aquí está la esencia: gist.github.com/607968
Stephan Kolassa
Gran código pero hay un problema. No soy tan inteligente como tú. Lo necesito desglosado paso a paso. Supongo que se ejecuta el número de simulaciones? ¿Qué es nn? ¿Es el número de sujetos en el estudio? Luego veo que creaste una distribución de covariables y las hiciste determinar un sí o un no dependiendo de un umbral.
Farrel
4

Siguiendo la publicación de Stephan Kolassa (no puedo agregar esto como comentario), tengo un código alternativo para una simulación. Utiliza la misma estructura básica, pero explota un poco más, 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 en la muestra. La covariable debe estar continuamente distribuida normalmente y estandarizada para significar 0 y sd 1. Utilizamos rnorm (nn) para generar esto. Seleccionamos un odds ratio y lo almacenamos en odds.ratio. También elegimos un número para la intercepción. La elección de este número rige qué proporción de la muestra experimenta el "evento" (por ejemplo, 0.1, 0.4, 0.5). Tienes que jugar con este número hasta que obtengas la proporción correcta. El siguiente código le proporciona una proporción de 0.1 con un tamaño de muestra de 950 y 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)

el resumen (proporción) confirma que la proporción es ~ 0.1

Luego, usando las mismas variables, la potencia se calcula sobre 10000 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 comparé con los ejemplos dados en Hsieh, 1998 (tabla 2), y parece estar de acuerdo con los tres ejemplos dados allí. También lo probé con el ejemplo de las páginas 342 a 343 de Hosmer y Lemeshow, donde encontró una potencia de 0,75 (en comparación con 0,8 en Hosmer y Lemeshow). Por lo tanto, puede ser que, en algunas circunstancias, este enfoque subestime el poder. Sin embargo, cuando ejecuté el mismo ejemplo en esta calculadora en línea , descubrí que está de acuerdo conmigo y no con el resultado en Hosmer y Lemeshow.

Si alguien puede decirnos por qué este es el caso, me interesaría saberlo.

Andrés
fuente
Tengo 2 preguntas si no le importa. 1) ¿Es la función de proporción simplemente para obtener la intersección correcta? 2) ¿cuál es la lógica detrás del uso de ytest (comparando prob con un sorteo aleatorio)?
B_Miner
@B_Miner 1) Al revés, para obtener la proporción correcta, debe establecer la intersección correctamente, por lo tanto, ajuste la intersección hasta obtener la proporción que espera. 2) La lógica de ytest es que necesitamos obtener un resultado dicotómico 0 o 1. Entonces, comparamos cada muestra de la distribución uniforme con la probabilidad (prob) de obtener nuestro resultado dicotómico. El 'runis' no tiene que extraerse de la distribución uniforme aleatoria: un binomio u otra distribución puede tener más sentido para sus datos. Espero que esto ayude (perdón por la demora en la respuesta).
Andrew
3

Una pregunta simple sobre el tamaño de la muestra es: qué tan grande se necesita una muestra para obtener un intervalo de confianza del 95% no más de 2d para la media [desconocida] de la distribución de datos. otra variante es: qué tan grande se necesita una muestra para tener una potencia de 0.9 en cuando se prueba H . no parece especificar ningún criterio para elegir un tamaño de muestra.0 : θ = 0θ=10:θ=0

En realidad, parece que su estudio se realizará de forma secuencial. en ese caso, puede pagar hacer de eso una parte explícita del experimento. el muestreo secuencial a menudo puede ser más eficiente que un experimento de tamaño de muestra fijo [se necesitan menos observaciones, en promedio].

farrel: estoy agregando esto en respuesta a tu comentario.

para obtener un tamaño de muestra, generalmente se especifica algún tipo de criterio de precisión para una estimación [como la longitud de un IC] O la potencia en una alternativa específica de una prueba que se realizará en los datos. parece haber mencionado ambos criterios. No hay nada de malo en eso, en principio: solo tiene que hacer dos cálculos de tamaño de muestra, uno para lograr la precisión de estimación deseada y otro para obtener la potencia deseada en la alternativa establecida. entonces el mayor de los dos tamaños de muestra es lo que se requiere. [por cierto, aparte de decir 80% de potencia, parece que no has mencionado qué prueba planeas realizar, o la alternativa en la que quieres la potencia del 80%.]

en cuanto al uso del análisis secuencial: si los sujetos se inscriben en el estudio todos al mismo tiempo, entonces un tamaño de muestra fijo tiene sentido. pero si las asignaturas son pocas y distantes entre sí, puede llevar uno o dos años [o más] inscribir el número requerido. por lo tanto, el juicio podría continuar durante tres o cuatro años [o más]. en ese caso, un esquema secuencial ofrece la posibilidad de detenerse antes de eso, si el efecto [s] que busca se vuelve estadísticamente significativo antes en el juicio.

ronaf
fuente
Los criterios serán una diferencia del 10% en la probabilidad de buenos resultados frente a malos. O digamos, ya que será una regresión logística, odds ratio = 2. alfa = 0.05, potencia = 80%, todavía no sé cuál es la varianza agrupada en la variable continua, pero supongamos que la desviación estándar es de 7 mmHg. El análisis secuencial sería bueno, pero el resultado final es dos años después de la medición.
Farrel