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). nortemiSα
- en su descripción, desea conocer el apropiado para capturar las tasas de respuesta que especificó con y power = 80%. Este es un poder a priori . norteα = .05
- podemos comenzar con la potencia post-hoc (determinar la potencia dada , las tasas de respuesta y alfa) ya que esto es conceptualmente más simple, y luego avanzarnorte
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:
- averiguar el efecto que desea poder detectar
- generar N datos de ese mundo posible
- ejecuta el análisis que pretendes realizar sobre esos datos falsos
- almacenar si los resultados son 'significativos' de acuerdo con el alfa elegido
- repetir muchas ( ) veces y usar el% 'significativo' como una estimación de la potencia (post-hoc) en esesinorte
- Para determinar la potencia a priori, busque posibles para encontrar el valor que le proporciona la potencia deseada. norte
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 Bpagspagssipagssi
En R, la forma principal de generar datos binarios con una probabilidad dada de 'éxito' es ? Rbinom
- Por ejemplo, para obtener el número de éxitos de 10 ensayos de Bernoulli con probabilidad p, el código sería
rbinom(n=10, size=1, prob=p)
(probablemente querrá asignar el resultado a una variable para el almacenamiento)
- También puede generar dichos datos de manera menos elegante utilizando ? runif , por ejemplo,
ifelse(runif(1)<=p, 1, 0)
- si cree que los resultados están mediados por una variable Gaussiana latente, podría generar la variable latente en función de sus covariables con ? rnorm , y luego convertirlas en probabilidades
pnorm()
y utilizarlas en su rbinom()
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 12v a r 1 ∗ v a r 2v a r 12A v a r 2
- Aunque escrito en el contexto de una pregunta diferente, mi respuesta aquí: la diferencia entre los modelos logit y probit tiene mucha información básica sobre este tipo de modelos.
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.
- * referencia: Maxwell, SE (2004). La persistencia de estudios de baja potencia en investigación psicológica: causas, consecuencias y remedios. Métodos psicológicos , 9 , 2 , pp. 147-163.
- sus efectos son bastante pequeños (no debe confundirse con las bajas tasas de respuesta), por lo que nos será difícil lograr un buen poder.
- Tenga en cuenta que, aunque todo esto suena bastante similar, en gran medida no son lo mismo (por ejemplo, es muy posible obtener un modelo significativo sin efectos significativos - discutido aquí: ¿Cómo puede una regresión ser significativa, pero todos los predictores son no- significativo?, o efectos significativos pero donde el modelo no es significativo - discutido aquí: Importancia de los coeficientes en regresión lineal: prueba t significativa versus estadística F no significativa ), que se ilustrará a continuación.
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).
set.seed(1)
repetitions = 1000
N = 10000
n = N/8
var1 = c( .03, .03, .03, .03, .06, .06, .09, .09)
var2 = c( 0, 0, 0, 1, 0, 1, 0, 1)
rates = c(0.0025, 0.0025, 0.0025, 0.00395, 0.003, 0.0042, 0.0035, 0.002)
var1 = rep(var1, times=n)
var2 = rep(var2, times=n)
var12 = var1**2
var1x2 = var1 *var2
var12x2 = var12*var2
significant = matrix(nrow=repetitions, ncol=7)
startT = proc.time()[3]
for(i in 1:repetitions){
responses = rbinom(n=N, size=1, prob=rates)
model = glm(responses~var1+var2+var12+var1x2+var12x2,
family=binomial(link="logit"))
significant[i,1:5] = (summary(model)$coefficients[2:6,4]<.05)
significant[i,6] = sum(significant[i,1:5])
modelDev = model$null.deviance-model$deviance
significant[i,7] = (1-pchisq(modelDev, 5))<.05
}
endT = proc.time()[3]
endT-startT
sum(significant[,1])/repetitions # pre-specified effect power for var1
[1] 0.042
sum(significant[,2])/repetitions # pre-specified effect power for var2
[1] 0.017
sum(significant[,3])/repetitions # pre-specified effect power for var12
[1] 0.035
sum(significant[,4])/repetitions # pre-specified effect power for var1X2
[1] 0.019
sum(significant[,5])/repetitions # pre-specified effect power for var12X2
[1] 0.022
sum(significant[,7])/repetitions # power for likelihood ratio test of model
[1] 0.168
sum(significant[,6]==5)/repetitions # all effects power
[1] 0.001
sum(significant[,6]>0)/repetitions # any effect power
[1] 0.065
sum(significant[,4]&significant[,5])/repetitions # power for interaction terms
[1] 0.017
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 Nnortenortenortenorte
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: Nnortenorte
sum(significant[,1])/repetitions # pre-specified effect power for var1
[1] 0.115
sum(significant[,2])/repetitions # pre-specified effect power for var2
[1] 0.091
sum(significant[,3])/repetitions # pre-specified effect power for var12
[1] 0.059
sum(significant[,4])/repetitions # pre-specified effect power for var1X2
[1] 0.606
sum(significant[,5])/repetitions # pre-specified effect power for var12X2
[1] 0.913
sum(significant[,7])/repetitions # power for likelihood ratio test of model
[1] 1
sum(significant[,6]==5)/repetitions # all effects power
[1] 0.005
sum(significant[,6]>0)/repetitions # any effect power
[1] 0.96
sum(significant[,4]&significant[,5])/repetitions # power for interaction terms
[1] 0.606
v a r 12significant
norte