#install.packages("kableExtra")
#install.packages("moments")
#install.packages("gganimate")
#install.packages("gifski")
#install.packages("ggplot2")
#install.packages("magick")
#install.packages("reshape2")
#install.packages("plotly")
#install.packages("pwr")

Problema 5: Relaciones entre la potencia, el tamaño de los efectos y el tamaño de la muestra

5.1

Para cada tamaño fijo de los efectos d, se modela la relación entre el tamaño muestral y la potencia (manteniendo constante el nivel de significancia \(\alpha=0.05\)). En las figuras se visualizan los resultados para tamaño de efecto muy pequeño (\(d=0.1\)), pequeño (\(d=0.2\)), mediano (\(d=0.5\)) y grande (\(d=0.8\)). Repite el análisis usando 5 valores distintos del nivel de significancia. ¿Cambian los resultados? ¿Qué ocurre cuando el tamaño de muestra de los grupos que se comparan es de 20, 60, 100 y 140? Analiza y compara los resultados.

# t-TEST
# Se aplicará power.t.test del paquete stats (ya en R). Calcula la potencia de la prueba t de una o dos muestras, o determina los parámetros para obtener un valor particular de la potencia.

# t-TEST
library("magick")

# Niveles de significancia que deseas evaluar
significance_levels <- c(0.01, 0.025, 0.05, 0.1, 0.2)

imagenes <- list()

for(sig in significance_levels) {

  d <- seq(.1, 2, by = .1)  # 20 tamaños de los efectos
  n <- 1:150  # Tamaños muestrales
  
  t.test.power.effect <- as.data.frame(do.call("cbind", lapply(1:length(d), function(i) {
    sapply(1:length(n), function(j) {
      power.t.test(n = n[j], d = d[i], sig.level = sig, power = NULL, type = "two.sample")$power
    })
  })))

  # Si algunas potencias no se pueden calcular, se ajustan a cero:
  t.test.power.effect[is.na(t.test.power.effect)] <- 0 
  colnames(t.test.power.effect) <- paste(d, "effect size")
  
  # Graficando los resultados
  prueba <- t.test.power.effect  # data frame de 150 X 20 (para graficar)
  cuts_num <- c(2, 5, 8)  # cortes
  
  # Cortes basados en Cohen
  cuts_cat <- c("pequeño", "medio", "grande") 
  columnas <- 1:ncol(prueba)  # Lista de los valores 1:20
  color_linea <- rainbow(length(columnas), alpha = .5)  # Lista de 20 colores
  grosor_linea <- 3  # Grosor de la línea
  
  tipo_linea <- rep(1, length(color_linea))  # Repetir length(color)=20 veces el 1
  tipo_linea[cuts_num] <- c(2:(length(cuts_num) + 1))  # Asignar 2, 3, 4 en las posiciones 2, 5, 8 de tipo_linea
  color_linea[cuts_num] <- c("black")  # Resaltar en negro
  
  efecto <- d  # Listado de los 20 valores de tamaño de efecto
  efecto[cuts_num] <- cuts_cat  # Reemplazar en "efecto" las posiciones cuts_num por las categorías de cuts_cat
  
  png_filename <- paste0("grafico_sig_", sig, ".png")
  png(png_filename)
  
  layout(matrix(c(1, 2), ncol = 2), widths = c(4, 1))
  
  # Gráfica
  plot(1, type = "n",  # no produce puntos ni líneas
       frame.plot = FALSE, 
       xlab = "Tamaño muestral", ylab = "Potencia", 
       xlim = c(1, 150), ylim = c(0, 1), 
       main = paste("t-Test (Significancia =", sig, ")"), axes = FALSE)
  
  # Editando los ejes y la cuadrícula
  abline(v = seq(0, 150, by = 10), col = "lightgray", lty = "dotted")  # Grid vertical
  abline(h = seq(0, 1, by = .05), col = "lightgray", lty = "dotted")  # Grid horizontal
  axis(1, seq(0, 150, by = 10))  # Eje X
  axis(2, seq(0, 1, by = .05))  # Eje Y
  
  # Dibujar las líneas
  for (i in 1:length(columnas)) {
    lines(1:150, prueba[, columnas[i]], col = color_linea[i], lwd = grosor_linea, lty = tipo_linea[i])
  }

  # Leyenda
  par(mar = c(0, 0, 0, 0))  # Sin márgenes adicionales en la leyenda
  plot.new()
  legend("topright", legend = efecto, col = color_linea, lwd = 3, lty = tipo_linea, title = "Tamaño efecto", bty = "n")
  
  dev.off()  # Guardar gráfico
  
  # Cargar la imagen generada en la lista
  imagenes[[length(imagenes) + 1]] <- image_read(png_filename)
}
# Crear un GIF con las imágenes generadas
gif <- image_animate(image_join(imagenes), fps = 1)
image_write(gif, "potencia_ttest.gif")
Fig. 1 Potencia del t-Test para Diferentes Niveles de Significancia y Tamaños de Efecto.
Fig. 1 Potencia del t-Test para Diferentes Niveles de Significancia y Tamaños de Efecto.


Como se puede evidenciar en la grafica, a medida que aumenta o disminuye el nivel de significancia, la potencia tambien aumenta o disminuye, respectivamente, independiente de los tamaños de muestra y para un mismo tamaño del efecto.

Esto sucede ya que, para un mismo tamaño de muestra, a medida que el nivel de significancia (o error tipo I) aumenta, el \(\beta\) (o error tipo II) tiende a disminuir. Y ya que la potencia de la prueba se define como \(1-\beta\), a medida que aumenta el nivel de significancia, la potencia también aumenta.

También se nota que, entre mayor sea el tamaño del efecto, más rápido aumenta la potencia, incluso para tamaños de muestra pequeños.

5.2

se modela la relación entre el tamaño del efecto \(d\) y la potencia (manteniendo constante el nivel de significancia \(\alpha=0.05\)). Para ello, se considera los siguientes tamaños de muestra, donde \(n_1\) es el número de sujetos en el grupo 1 y \(n_2\) es el número de sujetos en el grupo 2:

  • \(n_1=28\), \(n_2=1406\), donde \(n_1\) representa el 2% del tamaño total de la muestra de 1434.
  • \(n_1=144\), \(n_2=1290\), donde \(n_1\) representa el 10% del tamaño total de la muestra de 1434.
  • \(n_1=287\), \(n_2=1147\), donde \(n_1\) representa el 20% del tamaño total de la muestra de 1434.
  • \(n_1=430\), \(n_2=1004\), donde \(n_1\) representa el 30% del tamaño total de la muestra de 1434.
  • \(n_1=574\), \(n_2=860\), donde \(n_1\) representa el 40% del tamaño total de la muestra de 1434.
  • \(n_1=717\), \(n_2=717\), donde los grupos son de igual tamaño (esto es óptimo porque conduce a la potencia más alta para un tamaño de efecto dado).
library(dplyr)    
library(tidyr)    
library(ggplot2)  
library(plotly)   
library(pwr)      
library(magick)
library(scales)

# Definir los niveles de significancia
significance_levels <- c(0.01, 0.025, 0.05, 0.1, 0.2)

# Lista para almacenar los gráficos
plot_list <- list()

# Bucle para generar gráficos para cada nivel de significancia
for (sig in significance_levels) {
  
  # Generar cálculos de las potencias con pwr.t2n.test para cada nivel de significancia
  ptab <- cbind(NULL, NULL)       
  for (i in seq(0, 1, length.out = 200)){
    pwrt1 <- pwr.t2n.test(n1 = 28, n2 = 1406, sig.level = sig, power = NULL, d = i, alternative="two.sided")
    pwrt2 <- pwr.t2n.test(n1 = 144, n2 = 1290, sig.level = sig, power = NULL, d = i, alternative="two.sided")
    pwrt3 <- pwr.t2n.test(n1 = 287, n2 = 1147, sig.level = sig, power = NULL, d = i, alternative="two.sided")
    pwrt4 <- pwr.t2n.test(n1 = 430, n2 = 1004, sig.level = sig, power = NULL, d = i, alternative="two.sided")
    pwrt5 <- pwr.t2n.test(n1 = 574, n2 = 860, sig.level = sig, power = NULL, d = i, alternative="two.sided")
    pwrt6 <- pwr.t2n.test(n1 = 717, n2 = 717, sig.level = sig, power = NULL, d = i, alternative="two.sided")
    
    ptab <- rbind(ptab, cbind(pwrt1$d, pwrt1$power,
                              pwrt2$d, pwrt2$power,
                              pwrt3$d, pwrt3$power,
                              pwrt4$d, pwrt4$power,
                              pwrt5$d, pwrt5$power,
                              pwrt6$d, pwrt6$power))
  }
  
  # Es un data frame de tamaño 200 por 13
  ptab <- cbind(seq_len(nrow(ptab)), ptab)
  colnames(ptab) <- c("id", "n1=28, n2=1406;effect size", "n1=28, n2=1406;power",
                      "n1=144, n2=1290;effect size", "n1=144, n2=1290;power",
                      "n1=287, n2=1147;effect size", "n1=287, n2=1147;power",
                      "n1=430, n2=1004;effect size", "n1=430, n2=1004;power",
                      "n1=574, n2=860;effect size", "n1=574, n2=860;power",
                      "n1=717, n2=717;effect size", "n1=717, n2=717;power")

  # Transformar el data frame para graficar
  temp1 <- ptab %>% as.data.frame() %>% gather(key = name, value = val, 2:13)
  temp2 <- temp1 %>% separate(col = name, into = c("samples", "pruebas"), sep = ";")
  temp3 <- temp2 %>% spread(key = pruebas, value = val)
  
  temp3$samples <- factor(temp3$samples, 
                          levels = c("n1=28, n2=1406", "n1=144, n2=1290", 
                                     "n1=287, n2=1147", "n1=430, n2=1004",
                                     "n1=574, n2=860", "n1=717, n2=717"))
  
  # Generar el gráfico
  p <- ggplot(temp3, aes(x = `effect size`, y = power, color = samples)) +
    geom_line(size = 1) +
    theme_bw() +
    theme(axis.text = element_text(size = 10), 
          axis.title = element_text(size = 10), 
          legend.text = element_text(size = 10)) +
    geom_vline(xintercept = .54, linetype = 2) +
    geom_hline(yintercept = 0.80, linetype = 2) +
    labs(x = "Effect size", y = "Power", title = paste("Significance Level =", sig)) +
    scale_color_discrete(name = "Sampling size") +
    scale_y_continuous(limits = c(0, 1), expand = c(0, 0))
  
  # Guardar el gráfico en la lista
  plot_list[[paste0("sig_", sig)]] <- p
  
  # Guardar cada gráfico como PNG
  ggsave(filename = paste0("power_curve_", sig, ".png"), plot = p, width = 8, height = 6)
}
# Crear el GIF a partir de las imágenes guardadas
images <- image_read(list.files(pattern = "t_test_power_sig_.*\\.png"))

# Crear el GIF
gif <- image_animate(images, fps = 1)
image_write(gif, "power_curve_animation.gif")
Fig. 2 Curvas de Potencia del t-Test para Diferentes Niveles de Significancia.
Fig. 2 Curvas de Potencia del t-Test para Diferentes Niveles de Significancia.


En este caso, se denota que a medida que el nivel de significancia aumenta, la potencia también aumenta, para los distintos tamaños de muestra, requiriendo cada vez un tamaño del efecto menor para lograr el nivel de potencia aceptable (80%).

Para la curva de \(n_1=28\), \(n_2=1406\), se evidencia que, para un nivel de significancia de \(0.01\), se requerirá un tamaño del efecto de, aproximadamente, \(0.65\) para lograr una potencia del \(80\)%. Y para un nivel de significancia del \(0.2\), se requrirá un tamaño del efecto de \(0.41\). Por tanto, se comprueba que a medida que aumenta el nivel de significancia, dicha curva irá requiriendo un menor tamaño del efecto para un nivel de potencia deseado.

Además, se evidencia que el nivel de potencia mínimo se determinará a partir del nivel de significancia escogido, de manera que, por ejemplo, si se define un nivel de significancia de \(0.25\), el nivel de potencia para las distintas distribuciones empezarán desde este valor, incluso con un tamaño del efecto \(0\). Y que entre más equitativos estén distribuidas las muestras, aumentarán su potencia con mayor facilidad requiriendo un menor tamaño del efecto, con respecto a otros.