La técnica de análisis de varianza (ANOVA) también conocida como análisis factorial y desarrollada por Fisher en 1930, constituye la herramienta básica para el estudio del efecto de uno o más factores (cada uno con dos o más niveles) sobre la media de una variable continua. Es por lo tanto el test estadístico a emplear cuando se desea comparar las medias de dos o más grupos. Esta técnica puede generalizarse también para estudiar los posibles efectos de los factores sobre la varianza de una variable.
La hipótesis nula de la que parten los diferentes tipos de ANOVA es que la media de la variable estudiada es la misma en los diferentes grupos, en contraposición a la hipótesis alternativa de que al menos dos medias difieren de forma significativa. ANOVA permite comparar múltiples medias, pero lo hace mediante el estudio de las varianzas.
El funcionamiento básico de un ANOVA consiste en calcular la media de cada uno de los grupos para a continuación comparar la varianza de estas medias (varianza explicada por la variable grupo, intervarianza) frente a la varianza promedio dentro de los grupos (la no explicada por la variable grupo, intravarianza). Bajo la hipótesis nula de que las observaciones de los distintos grupos proceden todas la misma población (tienen la misma media y varianza), la varianza ponderada entre grupos será la misma que la varianza promedio dentro de los grupos. Conforme las medias de los grupos estén más alejadas las unas de las otras, la varianza entre medias se incrementará y dejará de ser igual a la varianza promedio dentro de los grupos.
El ANOVA de una vía, ANOVA con un factor o modelo factorial de un solo factor es el tipo de análisis que se emplea cuando los datos no están pareados y se quiere estudiar si existen diferencias significativas entre las medias de una variable aleatoria continua en los diferentes niveles de otra variable cualitativa o factor. Es una extensión de los t-test independientes para más de dos grupos.
Las hipótesis contrastadas en un ANOVA de un factor son:
H0: No hay diferencias entre las medias de los diferentes grupos : μ1=μ2…=μk=μ H1: Al menos un par de medias son significativamente distintas la una de la otra.
Otra forma de plantear las hipótesis de un ANOVA es la siguiente. Si se considera μ como el valor esperado para una observación cualquiera de la población (la media de todas las observaciones sin tener en cuenta los diferentes niveles), y αi el efecto introducido por el nivel i. La media de un determinado nivel (μi) se puede definir como:
μi=μ+αi
H0: Ningún nivel introduce un efecto sobre la media total: α1=α2=…αk=0 H1: Al menos un nivel introduce un efecto que desplaza su media: Algún αi≠0
Como se ha mencionado anteriormente, la diferencia entre medias se detecta a través del estudio de la varianza entre grupos y dentro de grupos. Para lograrlo, el ANOVA requiere de una descomposición de la varianza basada en la siguiente idea:
Variabilidad total =
variabilidad debida a los diferentes niveles del factor + variabilidad residual
lo que es equivalente a:
variabilidad explicada por el factor + variabilidad no explicada por el factor
lo que es equivalente a:
(varianza entre niveles) + (varianza dentro de los niveles)
Para poder calcular las diferentes varianzas en primer lugar se tienen que obtener las Sumas de Cuadrados (SS o Sc):
Suma de Cuadrados Total o Total Sum of Squares (TSS): mide la variabilidad total de los datos, se define como la suma de los cuadrados de las diferencias de cada observación respecto a la media general de todas las observaciones. Los grados de libertad de la suma de cuadrados totales es igual al número total de observaciones menos uno (N-1).
Suma de cuadrados del factor o Sum of Squares due to Treatment (SST): mide la variabilidad en los datos asociada al efecto del factor sobre la media (la diferencia de las medias entre los diferentes niveles o grupos). Se obtiene como la suma de los cuadrados de las desviaciones de la media de cada proveedor respecto de la media general, ponderando cada diferencia al cuadrado por el número de observaciones de cada grupo. Los grados de libertad correspondientes son igual al número niveles del factor menos uno (k-1).
Suma de cuadrados residual/error o Sum of Squares of Errors (SSE): mide la variabilidad dentro de cada nivel, es decir, la variabilidad que no es debida a variable cualitativa o factor. Se calcula como la suma de los cuadrados de las desviaciones de cada observación respecto a la media del nivel al que pertenece. Los grados de libertad asignados a la suma de cuadrados residual equivale la diferencia entre los grados de libertad totales y los grados de libertad del factor, o lo que es lo mismo (N-k). En estadística se emplea el termino error o residual ya que se considera que esta es la variabilidad que muestran los datos debido a los errores de medida. Desde el punto de vista biológico tiene más sentido llamarlo Suma de cuadrados dentro de grupos, ya que se sabe que la variabilidad observada no sólo se debe a errores de medida, sino a los muchos factores que no se controlan y que afectan a los procesos biológicos.
TSS=SSE+SST
CONDICIONES
Independencia: Las observaciones deben ser aleatorias. El tamaño total de la muestra de cada grupo debe de ser < 10% de la población a la que representa. Los grupos (niveles del factor) deben de ser independientes entre ellos.
Distribución normal de cada uno de los niveles o grupos: La variable cuantitativa debe de distribuirse de forma normal en cada uno de los grupos, siendo menos estricta esta condición cuanto mayor sea el tamaño de cada grupo. La mejor forma de verificar la normalidad es estudiar los residuos de cada observación respecto a la media del grupo al que pertenecen.
A pesar de que el ANOVA es bastante robusto aun cuando existe cierta falta de normalidad, si la simetría es muy pronunciada y el tamaño de cada grupo no es muy grande, se puede recurrir en su lugar al test no paramétrico prueba H de Kruskal-Wallis. En algunos libros recomiendan mantenerse con ANOVA a no ser que la falta de normalidad sea muy extrema.
Los datos atípicamente extremos pueden invalidar por completo las conclusiones de un ANOVA. Si se observan residuos extremos hay que estudiar con detalle a qué observaciones pertenecen, siendo aconsejable recalcular el ANOVA sin ellas y comparar los resultados obtenidos.
Varianza constante entre grupos (homocedasticidad): La varianza dentro de los grupos debe de ser aproximadamente igual en todos ellos. Esto es así, ya que en la hipótesis nula se considera que todas las observaciones proceden de la misma población, por lo que tienen la misma media y también la misma varianza.
Esta condición es más importante cuanto menor es el tamaño de los grupos.
El ANOVA es bastante robusto a la falta de homodedasticidad si el diseño es equilibrado (mismo número de observaciones por grupo).
En diseños no equilibrados, la falta de homocedasticidad tiene mayor impacto. Si los grupos de menor tamaño son los que presentan mayor desviación estándar, aumentará el número de falsos positivos. Si por el contrario los grupos de mayor tamaño tienen mayor desviación estándar aumentarán los falsos negativos.
Si no se puede aceptar la homocedasticidad, se recurre a lo que se conoce como ANOVA heterocedástica, que emplea la corrección de Welch (Welch test), en R su función es oneway.test().
Si un Análisis de Varianza resulta significativo, implica que al menos dos de las medias comparadas son significativamente distintas entre sí, pero no se indican cuáles. Para identificarlas hay que comparar dos a dos las medias de todos los grupos introducidos en el análisis mediante un t-test u otro test que compare 2 grupos, a esto se le conoce como análisis post-hoc. Debido a la inflación del error de tipo I, cuantas más comparaciones se hagan más aumenta la probabilidad de encontrar diferencias significativas (para α = 0.05, de cada 100 comparaciones se esperan 5 significativas solo por azar).
Los niveles de significancia pueden ser ajustados en función del número de comparaciones (corrección de significancia). Si no se hace ningún tipo de corrección se aumenta la posibilidad de falsos positivos (error tipo I) pero si se es muy estricto con las correcciones se pueden considerar como no significativas diferencias que realmente podrían serlo (error tipo II). La necesidad de corrección o no, y de qué tipo, se ha de estudiar con detenimiento en cada caso.
El tamaño del efecto de un ANOVA, es el valor que permite medir cuanta varianza en la variable dependiente cuantitativa es resultado de la influencia de la variable cualitativa independiente, o lo que es lo mismo, cuanto afecta la variable independiente (factor) a la variable dependiente.
Los niveles de clasificación más empleados para el tamaño del efecto son:
0.01 = pequeño 0.06 = mediano 0.14 = grande
Los valores necesarios para calcular η2 se obtienen del summary del ANOVA. En R puede obtenerse mediante la función etaSquared() de paquete lsr.
Supóngase que de un estudio quiere comprobar si existe una diferencia significativa entre el % de bateos exitosos de los jugadores de béisbol dependiendo de la posición en la que juegan. En caso de que exista diferencia se quiere saber qué posiciones difieren del resto. La siguiente tabla contiene una muestra de jugadores seleccionados aleatoriamente.
posicion <- c("OF", "IF", "IF", "OF", "IF", "IF", "OF", "OF", "IF", "IF", "OF", "OF", "IF", "OF", "IF", "IF", "IF", "OF", "IF", "OF", "IF", "OF", "IF", "OF", "IF", "DH", "IF", "IF", "IF", "OF", "IF", "IF", "IF", "IF", "OF", "IF", "OF", "IF", "IF", "IF", "IF", "OF", "OF", "IF", "OF", "OF", "IF", "IF", "OF", "OF", "IF", "OF", "OF", "OF", "IF", "DH", "OF", "OF", "OF", "IF", "IF", "IF", "IF", "OF", "IF", "IF", "OF", "IF", "IF", "IF", "OF", "IF", "IF", "OF", "IF", "IF", "IF", "IF", "IF", "IF", "OF", "DH", "OF", "OF", "IF", "IF", "IF", "OF", "IF", "OF", "IF", "IF", "IF", "IF", "OF", "OF", "OF", "DH", "OF", "IF", "IF", "OF", "OF", "C", "IF", "OF", "OF", "IF", "OF", "IF", "IF", "IF", "OF", "C", "OF", "IF", "C", "OF", "IF", "DH", "C", "OF", "OF", "IF", "C", "IF", "IF", "IF", "IF", "IF", "IF", "OF", "C", "IF", "OF", "OF", "IF", "OF", "IF", "OF", "DH", "C", "IF", "OF", "IF", "IF", "OF", "IF", "OF", "IF", "C", "IF", "IF", "OF", "IF", "IF", "IF", "OF", "OF", "OF", "IF", "IF", "C", "IF", "C", "C", "OF", "OF", "OF", "IF", "OF", "IF", "C", "DH", "DH", "C", "OF", "IF", "OF", "IF", "IF", "IF", "C", "IF", "OF", "DH", "IF", "IF", "IF", "OF", "OF", "C", "OF", "OF", "IF", "IF", "OF", "OF", "OF", "OF", "OF", "OF", "IF", "IF", "DH", "OF", "IF", "IF", "OF", "IF", "IF", "IF", "IF", "OF", "IF", "C", "IF", "IF", "C", "IF", "OF", "IF", "DH", "C", "OF", "C", "IF", "IF", "OF", "C", "IF", "IF", "IF", "C", "C", "C", "OF", "OF", "IF", "IF", "IF", "IF", "OF", "OF", "C", "IF", "IF", "OF", "C", "OF", "OF", "OF", "OF", "OF", "OF", "OF", "OF", "OF", "OF", "OF", "C", "IF", "DH", "IF", "C", "DH", "C", "IF", "C", "OF", "C", "C", "IF", "OF", "IF", "IF", "IF", "IF", "IF", "IF", "IF", "IF", "OF", "OF", "OF", "IF", "OF", "OF", "IF", "IF", "IF", "OF", "C", "IF", "IF", "IF", "IF", "OF", "OF", "IF", "OF", "IF", "OF", "OF", "OF", "IF", "OF", "OF", "IF", "OF", "IF", "C", "IF", "IF", "C", "DH", "OF", "IF", "C", "C", "IF", "C", "IF", "OF", "C", "C", "OF")
bateo <- c(0.359, 0.34, 0.33, 0.341, 0.366, 0.333, 0.37, 0.331, 0.381, 0.332, 0.365, 0.345, 0.313, 0.325, 0.327, 0.337, 0.336, 0.291, 0.34, 0.31, 0.365, 0.356, 0.35, 0.39, 0.388, 0.345, 0.27, 0.306, 0.393, 0.331, 0.365, 0.369, 0.342, 0.329, 0.376, 0.414, 0.327, 0.354, 0.321, 0.37, 0.313, 0.341, 0.325, 0.312, 0.346, 0.34, 0.401, 0.372, 0.352, 0.354, 0.341, 0.365, 0.333, 0.378, 0.385, 0.287, 0.303, 0.334, 0.359, 0.352, 0.321, 0.323, 0.302, 0.349, 0.32, 0.356, 0.34, 0.393, 0.288, 0.339, 0.388, 0.283, 0.311, 0.401, 0.353, 0.42, 0.393, 0.347, 0.424, 0.378, 0.346, 0.355, 0.322, 0.341, 0.306, 0.329, 0.271, 0.32, 0.308, 0.322, 0.388, 0.351, 0.341, 0.31, 0.393, 0.411, 0.323, 0.37, 0.364, 0.321, 0.351, 0.329, 0.327, 0.402, 0.32, 0.353, 0.319, 0.319, 0.343, 0.288, 0.32, 0.338, 0.322, 0.303, 0.356, 0.303, 0.351, 0.325, 0.325, 0.361, 0.375, 0.341, 0.383, 0.328, 0.3, 0.277, 0.359, 0.358, 0.381, 0.324, 0.293, 0.324, 0.329, 0.294, 0.32, 0.361, 0.347, 0.317, 0.316, 0.342, 0.368, 0.319, 0.317, 0.302, 0.321, 0.336, 0.347, 0.279, 0.309, 0.358, 0.318, 0.342, 0.299, 0.332, 0.349, 0.387, 0.335, 0.358, 0.312, 0.307, 0.28, 0.344, 0.314, 0.24, 0.331, 0.357, 0.346, 0.351, 0.293, 0.308, 0.374, 0.362, 0.294, 0.314, 0.374, 0.315, 0.324, 0.382, 0.353, 0.305, 0.338, 0.366, 0.357, 0.326, 0.332, 0.323, 0.306, 0.31, 0.31, 0.333, 0.34, 0.4, 0.389, 0.308, 0.411, 0.278, 0.326, 0.335, 0.316, 0.371, 0.314, 0.384, 0.379, 0.32, 0.395, 0.347, 0.307, 0.326, 0.316, 0.341, 0.308, 0.327, 0.337, 0.36, 0.32, 0.372, 0.306, 0.305, 0.347, 0.281, 0.281, 0.296, 0.306, 0.343, 0.378, 0.393, 0.337, 0.327, 0.336, 0.32, 0.381, 0.306, 0.358, 0.311, 0.284, 0.364, 0.315, 0.342, 0.367, 0.307, 0.351, 0.372, 0.304, 0.296, 0.332, 0.312, 0.437, 0.295, 0.316, 0.298, 0.302, 0.342, 0.364, 0.304, 0.295, 0.305, 0.359, 0.335, 0.338, 0.341, 0.3, 0.378, 0.412, 0.273, 0.308, 0.309, 0.263, 0.291, 0.359, 0.352, 0.262, 0.274, 0.334, 0.343, 0.267, 0.321, 0.3, 0.327, 0.313, 0.316, 0.337, 0.268, 0.342, 0.292, 0.39, 0.332, 0.315, 0.298, 0.298, 0.331, 0.361, 0.272, 0.287, 0.34, 0.317, 0.327, 0.354, 0.317, 0.311, 0.174, 0.302, 0.302, 0.291, 0.29, 0.268, 0.352, 0.341, 0.265, 0.307, 0.36, 0.305, 0.254, 0.279, 0.321, 0.305, 0.35, 0.308, 0.326, 0.219, 0.23, 0.322, 0.405, 0.321, 0.291, 0.312, 0.357, 0.324)
datos <- data.frame(posicion = posicion, bateo = bateo)
str(datos)
## 'data.frame': 327 obs. of 2 variables:
## $ posicion: chr "OF" "IF" "IF" "OF" ...
## $ bateo : num 0.359 0.34 0.33 0.341 0.366 0.333 0.37 0.331 0.381 0.332 ...
summary(datos)
## posicion bateo
## Length:327 Min. :0.1740
## Class :character 1st Qu.:0.3090
## Mode :character Median :0.3310
## Mean :0.3322
## 3rd Qu.:0.3545
## Max. :0.4370
table(datos$posicion)
##
## C DH IF OF
## 39 14 154 120
aggregate(bateo ~posicion, data=datos, FUN = mean)
## posicion bateo
## 1 C 0.3226154
## 2 DH 0.3477857
## 3 IF 0.3315260
## 4 OF 0.3342500
ANOVA contrasta que la media de la variable dependiente (cuantitativa) es similar en cada uno de los grupos.
La media del bateo de las posiciones es similar en valores cercanos a 0.33
Es muy probable que el ANOVA acepte la hipótesis nula de igualdad de medias.
aggregate(bateo ~posicion, data=datos, FUN = var)
## posicion bateo
## 1 C 0.0020368745
## 2 DH 0.0012986429
## 3 IF 0.0013760418
## 4 OF 0.0008669454
Las varianzas son diferentes en cada grupo. Por ejemplo: la mayor varianza es 0.002, que es el doble de la obtenida por DH e IF y mucho valor que la de OF.
aggregate(bateo~posicion, data=datos, FUN = sd)
## posicion bateo
## 1 C 0.04513175
## 2 DH 0.03603669
## 3 IF 0.03709504
## 4 OF 0.02944394
Obtenemos conclusiones similares a las obtenidas al estudiar las varianzas.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
ggplot(data=datos, aes(x=posicion, y=bateo, color = posicion)) +
geom_boxplot()+
theme_bw()
Este tipo de representación permite identificar de forma preliminar si existen asimetrías, datos atípicos o diferencia de varianzas. En este caso, los 4 grupos parecen seguir una distribución simétrica. En el nivel IF se detectan algunos valores extremos que habrá que estudiar con detalle por si fuese necesario eliminarlos. El tamaño de las cajas es similar para todos los niveles por lo que no hay indicios de falta de homocedasticidad.
par(mfrow= c(2,2))
qqnorm(datos[datos$posicion == "C", "bateo"], main = "C")
qqline(datos[datos$posicion == "C", "bateo"])
qqnorm(datos[datos$posicion == "DH", "bateo"], main = "DH")
qqline(datos[datos$posicion == "DH", "bateo"])
qqnorm(datos[datos$posicion == "IF", "bateo"], main = "IF")
qqline(datos[datos$posicion == "IF", "bateo"])
qqnorm(datos[datos$posicion == "OF", "bateo"], main = "OF")
qqline(datos[datos$posicion == "OF", "bateo"])
Para las cuatro categorías se aceptaría la distribución normal, ya que
los valores se ajustan adecuadamente a la recta de los cuantiles
teóricos de la normal.
par(mfrow = c(1,1))
# Test de Normalidad de Shapiro Wilks
#======================================
require(nortest)
## Loading required package: nortest
by(data=datos, INDICES = datos$posicion, FUN = function(x){lillie.test((x$bateo))})
## datos$posicion: C
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: (x$bateo)
## D = 0.087208, p-value = 0.6403
##
## ------------------------------------------------------------
## datos$posicion: DH
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: (x$bateo)
## D = 0.11205, p-value = 0.9046
##
## ------------------------------------------------------------
## datos$posicion: IF
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: (x$bateo)
## D = 0.070653, p-value = 0.05787
##
## ------------------------------------------------------------
## datos$posicion: OF
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: (x$bateo)
## D = 0.044082, p-value = 0.8213
En todos los casos, los p-valores son mayores a 0.05. Tenemos evidencia empírica suficiente para aceptar la hipótesis de normalidad al 5% en todos los casos.
No hace falta corregir los datos atípicos, ya que todos los casos aceptan la normalidad.
fligner.test(bateo~posicion, datos)
##
## Fligner-Killeen test of homogeneity of variances
##
## data: bateo by posicion
## Fligner-Killeen:med chi-squared = 6.9724, df = 3, p-value = 0.07278
bartlett.test(bateo~posicion, datos)
##
## Bartlett test of homogeneity of variances
##
## data: bateo by posicion
## Bartlett's K-squared = 13, df = 3, p-value = 0.004638
library(car)
## Warning: package 'car' was built under R version 4.2.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.2.3
leveneTest(bateo ~posicion, datos, center = "median")
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = "median")
## Df F value Pr(>F)
## group 3 2.6057 0.0518 .
## 323
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Al nivel de significación del 10%, los tres contrastes rechazan la homocedasticidad.
Al nivel del 5%, sólo la de Fligner y Levene aceptan la homocedasticidad.
Siendo prudentes, hay que suponer que tenemos un problema de heterocedasticidad.
Suponiendo Homocedasticidad, se procede de la siguiente manera:
anova <- aov(datos$bateo ~ datos$posicion)
summary(anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## datos$posicion 3 0.0076 0.002519 1.994 0.115
## Residuals 323 0.4080 0.001263
H0: La media del bateo de cada posición es similar. H1: La media del bateo de cada posición es diferente.
El F=1.994, siendo su p-valor de 0.115 > 0.05. Tenemos evidencia empírica suficiente para aceptar la hipótesis de igualdad de medias.
La media de los bateos no difiere de la posición del jugador.
plot(anova)
Grafico 1, 3, 4 tiene un ajuste de una recta horizontal; esto indica que no hay observaciones influyentes (anómalas) y que tenemos homocedasticidad en el error. Gráfico 2, que es el qqplot, la mayoría de los puntos cae en la recta de los cuantiles de la normal. Por tanto, se acepta la distribución normal para el residuo.
Se cumplen las propiedades del error del modelo ANOVA.
eta2 <- 0.0076/(0.0076+0.4080)
eta2
## [1] 0.01828681
El efecto es pequeño (efecto pequeño = ANOVA acepta H0)
pairwise.t.test(x=datos$bateo, g = datos$posicion, p.adjust.method = "holm",
pool.sd = TRUE, paired = FALSE, alternative = "two.sided")
##
## Pairwise comparisons using t tests with pooled SD
##
## data: datos$bateo and datos$posicion
##
## C DH IF
## DH 0.14 - -
## IF 0.49 0.41 -
## OF 0.38 0.49 0.53
##
## P value adjustment method: holm
DH vs C p valor = 0.14 > 0.05 Medias iguales al aceptar HO IF vs C p valor = 0.49 > 0.05 Medias iguales al aceptar HO IF vs DH p valor = 0.51 > 0.05 Medias iguales al aceptar HO OF vs C p valor = 0.38 > 0.05 Medias iguales al aceptar HO OF vs DH p valor = 0.49 > 0.05 Medias iguales al aceptar HO OF vs IF p valor = 0.53 > 0.05 Medias iguales al aceptar HO
Lógicamente, el resultado debe ser ésta, ya que el ANOVA acepta H0 – todas las medias son iguales.
plot(TukeyHSD(anova))
El cero está dentro de todos los intervalos de confianza; con lo cual,
todas las medias son iguales.
No se detectan diferencias en las medias de bateo en las posiciones de los jugadores. La posición no influye en el bateo medio de los jugadores del equipo.