Esta pregunta es en respuesta a una respuesta dada por @Greg Snow con respecto a una pregunta que hice sobre el análisis de potencia con regresión logística y SAS Proc GLMPOWER
.
Si estoy diseñando un experimento y analizaré los resultados en una regresión logística factorial, ¿cómo puedo usar la simulación (y aquí ) para realizar un análisis de potencia?
Aquí hay un ejemplo simple donde hay dos variables, la primera toma tres valores posibles {0.03, 0.06, 0.09} y la segunda es un indicador ficticio {0,1}. Para cada uno, estimamos la tasa de respuesta para cada combinación (# de respondedores / número de personas comercializadas). Además, deseamos tener 3 veces más de la primera combinación de factores que los otros (que puede considerarse igual) porque esta primera combinación es nuestra versión probada y verdadera. Esta es una configuración como la dada en el curso SAS mencionado en la pregunta vinculada.
El modelo que se utilizará para analizar los resultados será una regresión logística, con efectos principales e interacción (la respuesta es 0 o 1).
mod <- glm(response ~ Var1 + Var2 + I(Var1*Var2))
¿Cómo puedo simular un conjunto de datos para usar con este modelo para realizar un análisis de potencia?
Cuando ejecuto esto a través de SAS Proc GLMPOWER
(usando STDDEV =0.05486016
cuál corresponde a sqrt(p(1-p))
donde p es el promedio ponderado de las tasas de respuesta mostradas):
data exemplar;
input Var1 $ Var2 $ response weight;
datalines;
3 0 0.0025 3
3 1 0.00395 1
6 0 0.003 1
6 1 0.0042 1
9 0 0.0035 1
9 1 0.002 1;
run;
proc glmpower data=exemplar;
weight weight;
class Var1 Var2;
model response = Var1 | Var2;
power
power=0.8
ntotal=.
stddev=0.05486016;
run;
Nota: GLMPOWER
solo se usarán variables de clase (nominales), por lo que 3, 6, 9 anteriores se tratan como caracteres y podrían haber sido bajos, medios y altos o cualquier otra cadena. Cuando se realiza el análisis real, Var1 se utilizará de forma numérica (e incluiremos un término polinómico Var1 * Var1) para dar cuenta de cualquier curvatura.
La salida de SAS es
Entonces vemos que necesitamos 762,112 como nuestro tamaño de muestra (el efecto principal de Var2 es el más difícil de estimar) con una potencia igual a 0,80 y alfa igual a 0,05. Los asignaríamos de modo que 3 veces más fueran la combinación de línea de base (es decir, 0.375 * 762112) y el resto caiga igualmente en las otras 5 combinaciones.
Respuestas:
Preliminares:
Como se discutió en el manual de G * Power , hay varios tipos diferentes de análisis de potencia, dependiendo de lo que desee resolver. (Es decir, , el tamaño del efecto , y la potencia existen entre sí; especificar tres de ellos te permitirá resolver el cuarto).norte miS α
Además de la excelente publicación de @ GregSnow, aquí se puede encontrar otra guía realmente excelente para análisis de potencia basados en simulación en CV: Cálculo de potencia estadística . Para resumir las ideas básicas:
Si usted encontrará importancia en una iteración particular puede entenderse como el resultado de un ensayo de Bernoulli con probabilidad (donde es el poder). La proporción encontrada sobre iteraciones nos permite aproximar la verdadera . Para obtener una mejor aproximación, podemos aumentar , aunque esto también hará que la simulación tarde más. p B p Bpags pags si pags si
En R, la forma principal de generar datos binarios con una probabilidad dada de 'éxito' es ? Rbinom
rbinom(n=10, size=1, prob=p)
(probablemente querrá asignar el resultado a una variable para el almacenamiento)ifelse(runif(1)<=p, 1, 0)
pnorm()
y utilizarlas en surbinom()
código.Usted declara que "incluirá un término polinómico Var1 * Var1) para dar cuenta de cualquier curvatura". Hay una confusión aquí; Los términos polinómicos pueden ayudarnos a explicar la curvatura, pero este es un término de interacción, no nos ayudará de esta manera. No obstante, sus tasas de respuesta requieren que incluyamos términos cuadrados y términos de interacción en nuestro modelo. Específicamente, su modelo deberá incluir: , y , más allá de los términos básicos. v a r 1 ∗ v a r 2 v a r 1 2 ∗ v a r 2v ar 12 v a r 1 ∗ v a r 2 v a r 12A v a r 2
Al igual que hay diferentes tipos de tasas de error tipo I cuando hay varias hipótesis (por ejemplo, tasa de error por contraste , la tasa de errores familywise , y tasa de error por familia ), por lo que hay diferentes tipos de poder * (por ejemplo, para una solo efecto preespecificado , para cualquier efecto y para todos los efectos ). También puede buscar el poder de detectar una combinación específica de efectos, o el poder de una prueba simultánea del modelo en su conjunto. Supongo que por su descripción de su código SAS es que está buscando el último. Sin embargo, a partir de su descripción de su situación, supongo que desea detectar los efectos de interacción como mínimo.
Para ver una forma diferente de pensar sobre cuestiones relacionadas con el poder, vea mi respuesta aquí: Cómo informar la precisión general en la estimación de correlaciones dentro de un contexto de justificación del tamaño de la muestra.
Potencia post-hoc simple para regresión logística en R:
Digamos que sus tasas de respuesta postuladas representan la verdadera situación en el mundo, y que ha enviado 10,000 cartas. ¿Cuál es el poder de detectar esos efectos? (Tenga en cuenta que soy famoso por escribir código "cómicamente ineficiente", lo siguiente pretende ser fácil de seguir en lugar de estar optimizado para la eficiencia; de hecho, es bastante lento).
Entonces, vemos que 10,000 letras realmente no alcanzan el 80% de potencia (de ningún tipo) para detectar estas tasas de respuesta. (No estoy lo suficientemente seguro sobre lo que está haciendo el código SAS para poder explicar la clara discrepancia entre estos enfoques, pero este código es conceptualmente directo, si es lento, y he pasado algún tiempo revisándolo, y creo que estos los resultados son razonables)
Potencia a priori basada en simulación para regresión logística:
A partir de aquí, la idea es simplemente buscar posibles 's hasta que encontremos un valor que produzca el nivel deseado del tipo de poder que le interesa. Cualquier estrategia de búsqueda que pueda codificar para trabajar con esto estaría bien (en teoría). Dadas las que se necesitarán para capturar efectos tan pequeños, vale la pena pensar en cómo hacer esto de manera más eficiente. Mi enfoque típico es simplemente la fuerza bruta, es decir, evaluar cada que podría considerar razonablemente. (Sin embargo, tenga en cuenta que normalmente solo consideraría un rango pequeño, y normalmente estoy trabajando con muy pequeñas , al menos en comparación con esto). N N Nnorte norte norte norte
En cambio, mi estrategia aquí fue poner entre paréntesis posibles para tener una idea de cuál sería el rango de poderes. Por lo tanto, elegí un de 500,000 y volví a ejecutar el código (iniciando la misma semilla, esto tardó una hora y media en ejecutarse). Aquí están los resultados: Nnorte norte
significant
fuente
pwr
paquete). Este enfoque le brinda la oportunidad de pensar mucho más claramente (y / o refinar su pensamiento) sobre lo que espera que suceda, cómo trataría con eso, etc. NB, sin embargo, necesita los términos cuadráticos, o algo así. análogamente, si sus tasas postuladas son correctas, b / c no son lineales, y la interacción por sí sola no le permite capturar relaciones curvilíneas.poly
lugar de mostrar a los nuevos usuarios de R, la estrategia más propensa a errores de elevar los valores sin procesar. Creo que el modelo completo debería haberse presentado comoglm(responses~ poly(var1, 2) * var2, family=binomial(link="logit")
. Sería menos propenso a errores estadísticos en la interpretación y mucho más compacto. Puede que no sea importante en este caso exacto cuando solo está buscando un ajuste general, pero podría confundir fácilmente a los usuarios menos sofisticados que podrían verse tentados a mirar términos individuales.=
, etc. La gente estará más familiarizada con las variables de cuadratura a partir de una regresión básica. clase, y menos conscientes de lo quepoly()
es, si no son usuarios de R.La respuesta de @ Gung es genial para entender. Aquí está el enfoque que usaría:
Esta función prueba el efecto general de v2, los modelos se pueden cambiar para ver otros tipos de pruebas. Me gusta escribirlo como una función para que cuando quiera probar algo diferente pueda cambiar los argumentos de la función. También puede agregar una barra de progreso o usar el paquete paralelo para acelerar las cosas.
Aquí acabo de hacer 100 repeticiones, generalmente comienzo alrededor de ese nivel para encontrar el tamaño aproximado de la muestra, y luego las iteraciones cuando estoy en el parque de pelota correcto (no es necesario perder el tiempo en 10,000 iteraciones cuando tienes un 20% de potencia).
fuente
n
filas. Puede ser más eficiente hacer pesos en la función también.