Poder estadístico

Taller EGAP - Convivimos

Agosto 23, 2017

Poder estadístico

¿Qué es poder estdístico?

Poder estadístico dentro de nuestras investigaciones

¿Cómo se ve el poder?

Análisis de poder simple: ¿Qué parámetros puedes variar?

La fórmula analítica de poder

\[ Poder = \Phi \bigg(\frac{\mid \mu_T - \mu_C \mid \sqrt{N}}{2\sigma} - \Phi^1(1 - \frac{\alpha}{2}) \bigg) \]

NOTA: Esta fórmula hace supuestos que aún no vamos a discutir

La fórmula analítica de poder

\[ Power = \Phi \bigg(\frac{\mid \mu_T - \mu_C \mid \sqrt{N}}{2\sigma} - \Phi^1(1 - \frac{\alpha}{2}) \bigg) \]

Tamaño de la muestra

Veamos con una simulación cómo cambia el poder modificando algunos de estos parámetros.

possible.ns <- seq(from = 100, to = 2000, by = 50)  # Los tamaños de la muestra que vamos a considerar
powers <- rep(NA, length(possible.ns))  # Objeto vació para guardar las estimaciones de las simulaciones
alpha <- 0.05  # Nivel de significancia estándar
sims <- 500  # Número de simulaciones para cada N

#### Loop externo para variar el número de sujetos ####
for (j in 1:length(possible.ns)) {
    N <- possible.ns[j]  # Tomar el valor j para N
    
    significant.experiments <- rep(NA, sims)  # Objeto vació para contar el número de experimentos significativos
    
    #### Loop interno para conducir experimentos 'sims' veces para
    #### cada valor de N ####
    for (i in 1:sims) {
        Y0 <- rnorm(n = N, mean = 60, sd = 20)  # Resultado potencial del control
        tau <- 5  # Efecto del tratamiento asumido
        Y1 <- Y0 + tau  # Resultado potencial del tratamiento
        Z.sim <- rbinom(n = N, size = 1, prob = 0.5)  # Hace asignación aleatoria
        Y.sim <- Y1 * Z.sim + Y0 * (1 - Z.sim)  # Resultados observados según asignación de tratemiento
        fit.sim <- lm(Y.sim ~ Z.sim)  # Análisis (regresión simple)
        p.value <- summary(fit.sim)$coefficients[2, 4]  # Extraer p-valores (asumimos igual varianza entre 
        # grupos de control y tratamiento)
        significant.experiments[i] <- (p.value <= alpha)  # Determinar significancia según p <= 0.05
    }
    
    powers[j] <- mean(significant.experiments)  # almacenar tasa promedio de éxito (poder) para cada N
}

Veámos como se ve:

Tamaño del efecto

Miremos qué pasa para diferentes tamaños del efecto

possible.taus <- seq(from = 0, to = 20, by = 0.25)
powers <- rep(NA, length(possible.taus))
for (j in 1:length(possible.taus)) {
    N <- 100
    tau <- possible.taus[j]
    significant.experiments <- rep(NA, 500)
    for (i in 1:500) {
        Y0 <- rnorm(n = N, mean = 60, sd = 20)
        Y1 <- Y0 + tau
        Z.sim <- rbinom(n = N, size = 1, prob = 0.5)
        Y.sim <- Y1 * Z.sim + Y0 * (1 - Z.sim)
        fit.sim <- lm(Y.sim ~ Z.sim)
        p.value <- summary(fit.sim)$coefficients[2, 4]
        significant.experiments[i] <- (p.value <= 0.05)
    }
    powers[j] <- mean(significant.experiments)
}
plot(possible.taus, powers, ylim = c(0, 1), main = "Cálculo de poder variando tamaño del efecto (N=100, SD=20)", 
    xlab = expression(paste("Tamaño del efecto ", tau)))
abline(h = 0.8, col = "red")

Ruido de la variable de interés

Miremos qué pasa con diferente ruido

possible.sds <- seq(from = 0, to = 100, by = 2)
powers <- rep(NA, length(possible.sds))
for (j in 1:length(possible.sds)) {
    N <- 200
    tau <- 5
    SDs <- possible.sds[j]
    significant.experiments <- rep(NA, 500)
    for (i in 1:500) {
        Y0 <- rnorm(n = N, mean = 60, sd = SDs)
        Y1 <- Y0 + tau
        Z.sim <- rbinom(n = N, size = 1, prob = 0.5)
        Y.sim <- Y1 * Z.sim + Y0 * (1 - Z.sim)
        fit.sim <- lm(Y.sim ~ Z.sim)
        p.value <- summary(fit.sim)$coefficients[2, 4]
        significant.experiments[i] <- (p.value <= 0.05)
    }
    powers[j] <- mean(significant.experiments)
}
plot(possible.sds, powers, ylim = c(0, 1), main = expression(paste("Cálculo de poder variando tamaño del ruido (N=200, ", 
    tau, " = 5)")), xlab = expression(paste("Desv. Est.", sigma)))
abline(h = 0.8, col = "red")

Análisis de poder para una aleatorización por clústeres

Nota: Al correr el siguiente código (para aleatorización por clústeres) la primera vez, asegúrense de no pararlo mientras corre. Dado que la simulación toma bastante tiempo en correr, hemos añadido cache=FALSE a la sección de R para que, después de correr por primera vez, las siguientes veces que se compile el archivo, R Markdown use la información almacenada en el folder para que este proceso sea más rápido.