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.
Para tamaños de efecto más grandes generalmente resultan en una mayor potencia para un tamaño muestral dado, ya que el tamaño del efecto más grande facilita la detección de diferencias significativas. Los tamaños del efecto más pequeños requieren tamaños muestrales mayores para alcanzar niveles de potencia aceptables.
Con tamaños muestrales mayores, la potencia aumenta, especialmente para tamaños del efecto pequeños. Esto se debe a que con muestras más grandes, el error estándar de la media disminuye, haciendo que sea más fácil detectar diferencias significativas. A medida que el tamaño muestral aumenta, se reduce el riesgo de cometer un error Tipo II (no detectar un efecto real).
Un nivel de significancia más alto (α) generalmente aumenta la potencia, ya que se está reduciendo el umbral para rechazar la hipótesis nula. Sin embargo, esto también aumenta el riesgo de cometer un error Tipo I (falsos positivos). A medida que se incrementa α, la potencia de la prueba aumenta, pero también se aumenta el riesgo de detectar diferencias que podrían no ser verdaderas.
#Gráfica 1
#Se necesita el paquete pwr
if(!require(pwr)){install.packages("pwr");library("pwr")}
# 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.
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=0.05,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, J. (1988). Statistical Power Analysis for the Behavioral Sciences (2nd ed.). Hillsdale, NJ: Lawrence Erlbaum Associates, Publishers.
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
#Para el tipo de línea: (“blank”, “solid”, “dashed”, “dotted”, “dotdash”, “longdash”, “twodash”) ó (0, 1, 2, 3, 4, 5, 6).
#Note que lty = “solid” is idéntica a lty=1.
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
#Resaltar posiciones importantes
cuts_num<-c(2,5,8) # Cortes
#Cortes basados en: Cohen, J. (1988). Statistical Power Analysis for the Behavioral Sciences (2nd ed.). Hillsdale, NJ: Lawrence Erlbaum Associates, Publishers.
cuts_cat<-c("pequeño","medio","grande")
color_linea[cuts_num]<-c("black")
efecto <- d # Listado de los 20 valores de 20
efecto[cuts_num] <- cuts_cat #Reemplazar en "efecto" las posiciones cuts_num (2, 5, 8) por las categorías de cuts_cat
par(fig=c(0,.8,0,1),new=TRUE)
#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="t-Test", axes = FALSE)
#Editando los ejes, grid, etc.
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)) # Números en eje X
axis(2,seq(0,1,by=.05)) # Números en eje Y
#Plot de las lineas
#columnas <- 1:ncol(prueba) # lista de los valores 1:20
for(i in 1:length(columnas)) #length(columnas)=20
{
lines(1:150,
#prueba (data frame de 150 X 20, para graficar)
#columna <- 1:ncol(prueba) listado de valores 1:20
prueba[,columnas[i]], #filtrar "prueba" para valor de columna
col=color_linea[i], #color_linea[cuts_num]<-c("black")
lwd=grosor_linea, #grosor de cada linea
lty=tipo_linea[i] #tipo_linea[cuts_num]<-c(2:(length(cuts_num)+1))
)
}
#Leyendas
par(fig=c(.65,1,0,1),new=TRUE)
plot.new()
legend("top",legend=efecto, col=color_linea, lwd=3, lty=tipo_linea, title="Tamaño efecto",
bty="n" #Opciones: o (complete box), n (no box), 7, L, C, U
)
#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(size=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)
Los tamaños de muestra muy desbalanceados (por ejemplo, 28 y 1406) resultan en una menor potencia comparado con tamaños de muestra más balanceados, incluso si el tamaño total de la muestra es el mismo. Esto se debe a que los grupos desbalanceados introducen una variabilidad adicional que dificulta la detección de efectos. Los tamaños de muestra equilibrados (por ejemplo, 717 y 717) proporcionan la máxima potencia para un tamaño del efecto dado, ya que minimizan la variabilidad entre los grupos y maximizan la precisión de la estimación de la diferencia entre medias.
La potencia para detectar un tamaño del efecto específico es más alta cuando los tamaños de muestra en los dos grupos son iguales. La potencia para tamaños de efecto pequeños es especialmente sensible al equilibrio en el tamaño de la muestra.
n1=28, n2=1406: n1 representa el 2 % del tamaño total de la muestra de 1434. n1=144, n2=1290 : n1 representa el 10 % del tamaño total de la muestra de 1434. n1=287, n2=1147 : n1 representa el 20 % del tamaño total de la muestra de 1434. n1=430, n2=1004 : n1 representa el 3 % del tamaño total de la muestra de 1434. n1=574, n2=860 : n1 representa el 40 % del tamaño total de la muestra de 1434. n1=717, n2=717 : grupos 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) #Para manipulación de datos: separate, gather, spread
library(ggplot2)
library(plotly) #Para curvas de potencias interactivas
library(pwr) #Para cálculo de las potencias
#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(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") +
scale_color_discrete(name = "Sampling size")
# so simple to make interactive plots
plotly::ggplotly(p)
Con un tamaño del efecto más grande y un tamaño muestral mayor, la potencia de la prueba aumenta. Variar el nivel de significancia tiene un impacto significativo en la potencia. A niveles más altos de significancia, la potencia aumenta, pero a costa de un mayor riesgo de errores Tipo I. Los grupos de igual tamaño maximizan la potencia de la prueba t para un tamaño del efecto dado. Los tamaños desbalanceados reducen la potencia, incluso con tamaños totales de muestra similares. Para tamaños de efecto más pequeños, el desbalance en el tamaño de muestra tiene un impacto más pronunciado en la potencia, requiriendo un tamaño de efecto mayor para alcanzar una potencia aceptable si los tamaños de muestra son muy desiguales.