El “efecto del tamaño” (o “tamaño del efecto”, en inglés “effect size”) en el contexto de la prueba de hipótesis se refiere a la magnitud de la diferencia o la fuerza de la relación que se está investigando entre las variables. En otras palabras, mide la cantidad de cambio o la importancia práctica de los resultados, más allá de simplemente determinar si una diferencia es estadísticamente significativa. El tamaño del efecto es crucial porque, incluso si una prueba estadística muestra que un resultado es significativo (es decir, rechazas la hipótesis nula), el tamaño del efecto te dice si esa diferencia es realmente importante en un sentido práctico o clínico. Por ejemplo, un estudio podría encontrar que un nuevo medicamento reduce la presión arterial de manera estadísticamente significativa, pero el tamaño del efecto te indicaría si la reducción es lo suficientemente grande como para tener relevancia clínica. En resumen, el tamaño del efecto proporciona una medida complementaria a la significancia estadística, ayudando a interpretar el verdadero impacto o importancia de los resultados encontrados.
En este problema, nos centraremos en una aplicación que requiere la aplicación de la prueba t de Student para comparar las medias entre dos grupos. En este contexto evaluaremos cómo el efecto de los tamaños o las diferencias en los tamaños muestrales de los grupos influyen en la potencia de la prueba. De manera formal, la potencia se define como la probabilidad de rechazar la hipótesis nula cuando la hipótesis alternativa es verdadera. De forma más coloquial, la potencia es la capacidad de una prueba estadística para identificar un efecto si este realmente existe. En general, desequilibrios muy marcados en los tamaños de muestra tienden a reducir la potencia estadística, incluso cuando se asocian con tamaños de efecto considerables, lo que aumenta la probabilidad de cometer un error de tipo II. Para fundamentar esta afirmación, debes analizar diferentes resultados computacionales que se presentan a continuación.
En los códigos del archivo llamado caso1.R, para cada tamaño fijo de los efectos 𝑑, se modela la relación entre el tamaño muestral y la potencia (manteniendo constante el nivel de significancia 𝛼=0.05). En las figuras se visualizan los resultados para tamaño de efecto muy pequeño (𝑑=0.1), pequeño (𝑑=0.2), mediano (𝑑=0.5) y grande (𝑑=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.
Se realiza un primer gráfico que contiene la relación entre el tamaño de la muestra y la potencia con 𝛼=0.05.
#Gráfica 1
# Se necesita el paquete pwr
#if(!require(pwr)){install.packages("pwr");library("pwr")}
# t-TEST
d <- seq(.1, 2, by=.1) # 20 tamaños de los efectos
n <- 1:150 # Tamaños muestrales
# Calcular potencia para cada combinación de tamaño de muestra y tamaño de efecto
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=0.05, power=NULL, type="two.sample")$power
})
})))
# Ajustar NA a cero
t.test.power.effect[is.na(t.test.power.effect)] <- 0
colnames(t.test.power.effect) <- paste(d, "effect size")
# Data frame de 150 x 20 (para graficar)
prueba <- t.test.power.effect
cuts_num <- c(2, 5, 8)
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)) # Tipo de línea (sólido por defecto)
tipo_linea[cuts_num] <- c(2:(length(cuts_num)+1)) # Cambiar tipo de línea en cortes
color_linea[cuts_num] <- c("black") # Resaltar posiciones importantes
efecto <- d # Listado de los 20 valores de 20
efecto[cuts_num] <- cuts_cat # Reemplazar en "efecto" los cortes por categorías
# Ajustar márgenes del gráfico para hacer espacio a la leyenda
par(mar=c(5, 4, 4, 8)) # Aumentar el margen derecho
# Graficar
plot(1, type="n", frame.plot=FALSE,
xlab="Tamaño muestral", ylab="Potencia",
xlim=c(1, 150), ylim=c(0, 1), main="t-Test", axes=FALSE)
# Añadir grid y ejes
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
# Añadir 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])
}
# Añadir leyenda a la derecha (dentro del área gráfica, pero con espacio)
par(xpd=TRUE) # Permite que la leyenda se dibuje fuera del área del gráfico
legend(x=160, y=1, legend=efecto, col=color_linea, lwd=3, lty=tipo_linea, title="Tamaño efecto", bty="n")
par(xpd=FALSE) # Restaurar configuración de gráficos
Esta misma gráfica se genera utilizando un formato más interactivo de ggplot2.
#Gráfica 2
#plot using ggplot2
#library(ggplot2)
#library(reshape)
#library(plotly)
obj <- cbind(size=1:150, prueba) #Agregando el tamaño al data frame "prueba"
# Usar melt y unir con "effect" para el mapeo
#El data frame "obj" se reconstruye con respecto al parámetro id="size".
melted <- cbind(reshape::melt(obj, id="size"), effect=rep(d,each=150))
p<- ggplot(data=melted, aes(x=size, y=value, color=as.factor(effect))) +
geom_line(linewidth=0.7,alpha=.5) +
ylab("Potencia") +
xlab("Tamaño muestral") +
ggtitle("t-Test")+
theme_bw() +
#guides(fill=guide_legend(title="Efecto"))
#scale_fill_discrete(name = "Efecto")
#labs(fill='Efecto')
#scale_fill_manual("Efecto"#,values=c("orange","red")
scale_color_discrete(name = "Tamaño del efecto")
# Interactive plot
plotly::ggplotly(p)
A continuación se repite el ejercicio para diferentes niveles de significancia: 0.01, 0.05, 0.1, 0.15, 0.2
# Definir los valores de los niveles de significancia a evaluar
niveles_sig <- c(0.01, 0.05, 0.1, 0.15, 0.2)
# Crear una lista para almacenar los resultados de cada nivel de significancia
resultados_por_sig <- list()
# Iterar sobre los niveles de significancia
for (sig in niveles_sig) {
# Crear un data frame para almacenar los resultados para cada nivel de significancia
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
})
})))
# Ajustar los valores NA a cero
t.test.power.effect[is.na(t.test.power.effect)] <- 0
colnames(t.test.power.effect) <- paste(d, "effect size")
# Guardar los resultados en la lista
resultados_por_sig[[paste("sig =", sig)]] <- t.test.power.effect
}
# Gráfica para cada nivel de significancia
for (sig in niveles_sig) {
prueba <- resultados_por_sig[[paste("sig =", sig)]]
# Ajustar márgenes del gráfico para hacer espacio para la leyenda a la derecha
par(mar=c(5, 4, 4, 8)) # Aumentar margen derecho a 8 líneas
# Graficar utilizando base R
plot(1, type="n", frame.plot=FALSE, xlab="Tamaño muestral", ylab="Potencia",
xlim=c(1, 150), ylim=c(0, 1), main=paste("t-Test - Nivel de significancia =", sig), axes=FALSE)
abline(v=seq(0, 150, by=10), col="lightgray", lty="dotted")
abline(h=seq(0, 1, by=.05), col="lightgray", lty="dotted")
axis(1, seq(0, 150, by=10))
axis(2, seq(0, 1, by=.05))
for (i in 1:length(columnas)) {
lines(1:150,
prueba[,columnas[i]],
col=color_linea[i],
lwd=grosor_linea,
lty=tipo_linea[i]
)
}
# Ajustar posición de la leyenda a la derecha y fuera del gráfico
par(xpd=TRUE) # Permite que la leyenda se dibuje fuera del área del gráfico
legend(x=160, y=1, legend=efecto, col=color_linea, lwd=3, lty=tipo_linea, title="Tamaño efecto", bty="n")
par(xpd=FALSE) # Restaurar configuración de gráficos
}
Conclusiones del Caso 1: Las gráficas evidencian que el efecto de los tamaños o las diferencias en los tamaños muestrales de los grupos si influyen en la potencia de la prueba, entre menor es el tamaño muestral- 20 en nuestro caso- se requiere que la prueba tenga mas potencia o sea que aumenta la probabilidad de rechazar la hipótesis nula cuando la hipótesis alternativa es verdadera generando un error tipo 2 o sea que se concluye que no hay efecto cuando en realidad sí lo hay. En contraste en una muestra de tamaño 140 esta recta tiene menos pendiente o sea que entre mayor sea la diferencia de tamaño muestral no se generan cambios significativos en la potencia de la prueba (se observa menor pendiente de la recta entre mayor tamaño de la muestra) disminuyendo la probabilidad de generar un error tipo 2.Es importante anotar que estas son solo presunciones pues este tipo de análisis requiere de un contexto que nos permita dar una mejor interpretación.
En los códigos del archivo llamado caso2.R, se modela la relación entre el tamaño del efecto 𝑑 y la potencia (manteniendo constante el nivel de significancia 𝛼=0.05). Para ello, se considera los siguientes tamaños de muestra, donde 𝑛1 es el número de sujetos en el grupo 1 y 𝑛2 es el número de sujetos en el grupo 2:
𝑛1=28, 𝑛2=1406 : 𝑛1 representa el 2 % del tamaño total de la muestra de 1434
𝑛1=144, 𝑛2=1290 : 𝑛1 representa el 10 % del tamaño total de la muestra de 1434
𝑛1=287, 𝑛2=1147 : 𝑛1 representa el 20 % del tamaño total de la muestra de 1434
𝑛1=430, 𝑛2=1004 : 𝑛1 representa el 30 % del tamaño total de la muestra de 1434
𝑛1=574, 𝑛2=860 : 𝑛1 representa el 40 % del tamaño total de la muestra de 1434
𝑛1=717, 𝑛2=717 : grupos de igual tamaño (esto es óptimo porque conduce a la potencia más alta para un tamaño de efecto dado).
En la figura resultante, se trazaron las curvas de potencia para la prueba t de Student, en función del tamaño del efecto, asumiendo una tasa de error Tipo I del 5%. La comparación de diferentes curvas de potencia (basadas en el tamaño de la muestra de cada grupo) en el mismo gráfico es una representación visual útil de este análisis. En la figura también se trazó una línea discontinua horizontal en un nivel de potencia aceptable del 80% y una línea vertical en el tamaño del efecto que tendría que estar presente en nuestros datos para alcanzar el 80 % de potencia. Se observa que el tamaño del efecto debe ser superior a 0.54 para alcanzar un nivel de potencia aceptable dados tamaños de grupo altamente desequilibrados de 𝑛1=28 y 𝑛2=1406, en comparación con todos los demás escenarios que conducen al 100% de potencia. Repite el análisis usando 5 valores distintos del nivel de significancia. ¿Cambian los resultados? ¿Qué ocurre cuando 𝑛1=28 y 𝑛2=1406? Analiza y compara los resultados.
#Generar cálculos de las potencias con la funcion pwr.t2n.test.
#Es un t-test para 2 muestras con tamaños diferentes
#Aquí: d es el tamaño del efecto, Power= potencia de la prueba= 1-beta):
#pwr.t2n.test(n1 = NULL, n2= NULL, d = NULL, sig.level = 0.05, power = NULL, alternative = c("two.sided", "less","greater"))
ptab <- cbind(NULL, NULL)
for (i in seq(0,1, length.out = 200)){
pwrt1 <- pwr.t2n.test(n1 = 28, n2 = 1406,
sig.level = 0.05, power = NULL,
d = i, alternative="two.sided")
pwrt2 <- pwr.t2n.test(n1 = 144, n2 = 1290,
sig.level = 0.05, power = NULL,
d = i, alternative="two.sided")
pwrt3 <- pwr.t2n.test(n1 = 287, n2 = 1147,
sig.level = 0.05, power = NULL,
d = i, alternative="two.sided")
pwrt4 <- pwr.t2n.test(n1 = 430, n2 = 1004,
sig.level = 0.05, power = NULL,
d = i, alternative="two.sided")
pwrt5 <- pwr.t2n.test(n1 = 574, n2 = 860,
sig.level = 0.05, power = NULL,
d = i, alternative="two.sided")
pwrt6 <- pwr.t2n.test(n1 = 717, n2 = 717,
sig.level = 0.05, power = NULL,
d = i, alternative="two.sided")
#Es un data frame de tamaño 200 por 12:
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 (la 1ra columna es ID)
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")
#gather se usa para "reunir" un par key-value. En este caso, en 3 columnas: ID, variables y respuestas numericas
temp1 <- ptab %>% as.data.frame() %>% gather(key = name, value = val, 2:13)
#Separar celdas en columnas, de acuerdo a una condición (sep=). En este caso, se separó "name" en dos columnas: samples y pruebas
temp2 <- temp1 %>% separate(col = name, into = c("samples", "pruebas"), sep = ";")
#La función spread hace lo opuesto a gather. Son funciones complementarias.
#Es decir, si al resultado de aplicar la función spread le aplicamos la función gather llegamos al dataset original.
temp3 <- temp2 %>% spread(key = pruebas, value = val)
#Convertir la variable "samples" a factor.
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")
)
#Gráfica
p<- ggplot(temp3, aes(x = `effect size`, y = power, color = samples)) +
geom_line(linewidth=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") +
scale_color_discrete(name = "Sampling size")
# so simple to make interactive plots
plotly::ggplotly(p)
Conclusiones del Caso 2: Esta gráfica además muestra desequilibrios muy marcados en los tamaños de muestra pues las curvas de potencia generadas muestran mayores pendientes asociadas al tamaño del efecto lo que establecería una tendencia a cambios marcados en la potencia estadística asociados al tamaño muestral. La curva de potencia correspondiente a 𝑛1=28, 𝑛2=1406 muestra que el tamaño del efecto es mayor para alcanzar una potencia aceptable a diferencia de los otros subgrupos que tiene un comportamiento similar entre si. Estas curvas de potencia requieren de un tamaño de efecto menor para lograr la potencia deseada debido a que los rangos de diferencias entre n1 y n2 se nivelan.