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=FALSEa la sección de R para que, después de correr por primera vez, las siguientes veces que se compile el archivo,R Markdownuse la información almacenada en el folder para que este proceso sea más rápido.