Taller EGAP - Convivimos
Agosto 23, 2017
\[ 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
\[ Power = \Phi \bigg(\frac{\mid \mu_T - \mu_C \mid \sqrt{N}}{2\sigma} - \Phi^1(1 - \frac{\alpha}{2}) \bigg) \]
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:
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")
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")
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.