1. Ejemplo introductorio

Se quiere comparar la velocidad de tres algoritmos A, B y C para procesar imágenes. Se les pasa una batería de 10 imágenes, las procesan y se anota el tiempo que han tardado con cada una. Los tiempos medios por algoritmo son:

Algoritmo Tiempo medio
A 5.1
B 5.0
C 4.9

El algoritmo C ha sido “globalmente” más rápido con la muestra de imágenes, ¿pero lo seguirá siendo a largo plazo? Veamos dos situaciones extremas con esos valores medios:

CONCLUSIÓN: SE BUSCA TÉCNICA “OBJETIVA” (JUSTIFICADA ESTADÍSTICAMENTE) QUE PERMITA COMPARAR Y DECIDIR SOBRE SI LOS PROMEDIOS DE MÁS DE 2 POBLACIONES SON SIGNIFICATIVAMENTE DISTINTOS O NO (A PARTIR DE OBSERVAR MUESTRAS DE ELLAS). ES DECIR, QUE PERMITA DECIDIR ENTRE:

2. Objetivos del ANOVA

3. El modelo ANOVA de un factor \(Y = \mu_X + N(0,\sigma^2)\)

4. El modelo ANOVA de dos factores

4.1. Sin interacción \(Y = \mu_A + \mu_B + N(0,\sigma^2)\)

  • \(Y\): variable numérica de gran interés.
  • \(A\): un factor que podría influir sobre el valor final de \(Y\).
    • \(A_1\), \(A_2\), \(\ldots\), \(A_a\): niveles del factor \(A\) (\(a\) = número de niveles).
  • \(B\): otro factor que podría influir sobre el valor final de \(Y\).
    • \(B_1\), \(B_2\), \(\ldots\), \(B_b\): niveles del factor \(B\) (\(b\) = número de niveles).
  • Parámetros:
    • \(\mu_{A_1}\), \(\mu_{A_2}\), \(\ldots\), \(\mu_{A_a}\) (correspondientes al factor \(A\))
    • \(\mu_{B_1}\), \(\mu_{B_2}\), \(\ldots\), \(\mu_{B_b}\) (correspondientes al factor \(B\))
    • \(\sigma^2\) la dispersión de los datos de \(Y\) en cada combinación de niveles de los factores
  • Muestreo:
    • Se toma \(A=a_i\), \(B=b_j\)
    • Se observa, \(y_{ijk} = \mu_{A_i} + \mu_{B_j} + e_{ijk}\) para \(k=1,2,\ldots\), donde
      • \(\mu_{A_i}\) es el valor medio de \(Y\) provocado por el nivel \(A=A_i\) del factor \(A\),
      • \(\mu_{B_j}\) es el valor medio de \(Y\) provocado por el nivel \(B=B_j\) del factor \(B\),
      • \(e_{ijk}\) es un valor aleatorio, sigue el modelo \(N(0,\sigma^2)\), es independiente de todos los valores muestreados.
  • Un ejemplo de muestra: \(\begin{array}{c|cccc} & B & & & \\ A & B_1 & B_2& \cdots & B_b\\ \hline A_1 & [y_{111}, \ldots, y_{11n_{11}}] & [y_{121}, \ldots, y_{12n_{12}}] & \cdots & [y_{1b1}, \ldots, y_{1bn_{1b}}] \\ A_2 & [y_{211}, \ldots, y_{21n_{21}}] & [y_{221}, \ldots, y_{22n_{22}}] & \cdots & [y_{2b1}, \ldots, y_{2bn_{2b}}] \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ A_a & [y_{a11}, \ldots, y_{a1n_{a1}}] & [y_{a21}, \ldots, y_{a2n_{a2}}] & \cdots & [y_{ab1}, \ldots, y_{abn_{ab}}] \end{array}\).
  • El ANOVA plantea dos contrastes, donde cada uno chequea el efecto (principal) de cada factor sobre la respuesta \(Y\). El \(p\)-valor de cada estadístico \(F\) ayuda a decidir sobre la significatividad del efecto de cada factor sobre la respueste \(Y\).

4.2. Con interacción \(Y = \mu_A + \mu_B + \gamma_{(A,B)}+ N(0,\sigma^2)\)

  • El planteamiento es el mismo, con los dos factores \(A\) y \(B\).
  • El efecto “conjunto” de una combinación de niveles \(A\) y \(B\) NO ES “la suma de los efectos marginales”, es decir:
    • \(y_{ijk} = \mu_{A_i} + \mu_{B_j} + \gamma_{A_i, B_j} + e_{ijk}\)
    • con \(\gamma_{A_i, B_j} \neq 0\) al menos para alguna combinación de niveles \(A_i\), \(B_j\).
  • El ANOVA resuelve tres contrastes, uno para cada factor, y otro para la posible interacción, sobre la respuesta \(Y\). El \(p\)-valor de cada estadístico \(F\) ayuda a decidir sobre la significatividad del efecto de cada factor, y el de la interacción, sobre la respueste \(Y\).
  • La interacción se puede chequear también gráficamente.

5. El modelo ANOVA con R

5.1. Los datos

  • Los datos deben ser en dos variables (una para \(Y\) y otra para \(X\)) o tres (una para \(Y\), otra para el factor \(A\) y otra para el factor \(B\)). Pueden ser:
    • Columnas de una misma hoja de datos (mejor)
    • Vectores sueltos (ok, pero se podría formar una hoja de datos con ellos)
  • A veces hay varios vectores con datos de \(Y\), un vector “por cada nivel” del factor \(X\). En ese caso conviene “fabricar” la hoja de datos que tenga:
    • Una columna con todos los datos de \(Y\): concatenar todos los vectores de datos de \(Y\) con la función c().
    • Otra columna con los niveles del factor \(X\) que acompañan a cada dato de \(Y\): repetir “cada nivel” de \(X\) (número o palabra) tantas veces como datos de \(Y\) asociados a ese nivel, y concatenar todos al final. Por ejemplo c(rep("x1", 10), rep("x2", 30),...).
    • Atención! la columna (o columnas) de la variable factor (\(X\)) debe ser de tipo factor en R. Comprobarlo con la función str() aplicada a la hoja de datos, y si no lo es, forzarlo con la función factor(). Por ejemplo: data.frame(X=factor(vectornivelesX), Y=vectordatosY)

5.2. Chequeo gráfico de los datos

  • Diagramas de puntos o de caja son muy informativos de cómo puede resultar la decisión final.
  • Función boxplot(formula, data) realiza cajas de la variable dependiente separada por niveles de la variable (o variables) independientes.
  • Argumentos:
    • formula: expresión de la forma y ~ x o bien y ~ x1 + x2 donde y es la etiqueta de la columna numérica (dependiente) y x (o x1 y x2) es la etiqueta de la columna factor (independiente) que hace la separación en grupos.
    • data: hoja de datos con las columnas referidas en la formula.
  • Ejemplos:
    • boxplot(formula=Sepal.Lengty ~ Species, data=iris)
    • boxplot(formula=vocab~nativeBorn, data=carData::GSSvocab)
    • boxplot(formula=vocab~nativeBorn+gender, data=carData::GSSvocab)

5.3. Cálculo de estadísticos por grupos

  • Tenemos una hoja de datos con una columna cuantitativa de la que queremos obtener estadísticos por grupos que vienen determinados por otras columnas.
  • Función aggregate(formula, data, FUN)
  • Argumentos:
    • formula: expresión de la forma y ~ x o bien y ~ x1 + x2 donde y es la etiqueta de la columna numérica (dependiente) y x (o x1 y x2) es la etiqueta de la columna factor (independiente) que hace la separación en grupos.
    • data: hoja de datos con las columnas referidas en la formula.
    • FUN: función a calcular sobre los datos de la columna y para cada grupo indicado por la columna x (o columnas x1 y x2)
  • Ejemplos:
    • aggregate(formula=Sepal.Lengty ~ Species, data=iris, FUN="mean")
    • aggregate(formula=Sepal.Lengty ~ Species, data=iris, FUN="sd")
    • aggregate(formula=vocab~nativeBorn+gender, data=carData::GSSvocab, FUN="mean")

5.4. La tabla ANOVA y la decisión del contraste

  • Es una tabla que ayuda a calcular el estadístico \(F\) y su \(p\)-valor para decidir el contraste de igualdad de medias.
  • Se consigue en dos pasos: primero aov() y luego summary()
  • Función aov( formula, data,... ):
    • Argumentos:
      • formula: expresión que indica, primero, la variable depemndiente, después el símbolo ~ (que indica la dependencia), y después la (o las) variables factor, de la forma:
        • y ~ x, en el modelo de un factor
        • y ~ x1 + x2, en el modelo de dos factores sin interacción,
        • y ~ x1 * x2, en el modelo de dos factores con interacción,
      • data: si los datos están en dos vectores suelto, no utilizar. Si los datos están en dos columnas de una hoja de datos, poner el nombre de la hoja de datos.
    • Devuelve: un objeto tipo lista, y por pantalla, las sumas de cuadrados (inter e intra) y sus grados de libertad, además de la estimación (insesgada) de \(\sigma\)
  • Función anova(object):
    • Argumento: object, el objeto devuelto por aov()
    • Devuelve: la tabla ANOVA (como hoja de datos), con las columnas de: grados de libertad (Df), las sumas de cuadrados (Sum Sq) inter (con el nombre de cada factor) e intra (con el nombre Residuals), las medias de cuadrados (Mean Sq), el valor (o valores) del estadístico de contraste (F) para cada factor, y su \(p\)-valor (Pr(>F)). Si se quiere acceder al \(p\)-valor exacto, poner anova(object)[1,5] (etc.)
  • Decisión del contraste:
    • “Rechazar \(H_0\) si \(p\)-valor \(< \alpha\)
    • Recuerda:
      • Aceptar \(H_0\) significa…
        • Aceptar \(\mu_1 = \mu_2 = \cdots = \mu_a\), que es lo mismo que
        • Aceptar que \(Y\) se comporta igual, sea cual sea el valor de \(X\), que es lo mismo que
        • Aceptar que \(Y\) NO depende del factor \(X\), que es lo mismo que
        • Aceptar que \(X\) no ejerce influencia sobre \(Y\).
      • Rechazar \(H_0\) significa…
        • Lo contrario de todo lo anterior
        • En este caso se motiva continuar el análisis estableciendo un ranking de niveles del factor \(X\) (ver sección 4.4)

5.5. Chequeo gráfico de la interacción (dos factores)

  • Se puede inspeccionar gráficamente la ausencia o presencia de interacción.
  • Función interaction.plot(x.factor, trace.factor, response,...).
  • Argumentos:
    • x.factor: columna de datos del factor (cuyos niveles formarán el eje x).
    • trace.factor: columna de datos del otro factor.
    • response: columna de datos de la variable respuesta \(Y\).
  • Si no hay interacción, las “curvas” de medias para cada nivel de un factor, fijando el otro factor, forman un perfil, que varía “paralelamente” cuando se cambia el nivel del otro factor.

5.6. Adecuación del modelo

  • Para poder aplicar ANOVA y confiar en sus resultados, las \(Y\)’s deben cumplir las condiciones del modelo ANOVA (errores “normales”, independientes entre sí, independientes del nivel del factor, y con varianza común en todos los niveles).
  • Cuando hay pocos datos por nivel, es imposible detectar nada, y se puede aceptar todo. Cuando hay muchos datos, se pueden comprobar las condiciones.
  • Normalidad de los datos de todos los niveles:
    • Se pueden representar histogramas y ver si encajan en “campanas de Gauss”.
    • Se pueden lanzar contrastes de normalidad shapiro.test() y ver si se acepta la hipótesis nula, que es la normalidad
    • Se puede lanzar el ANOVA con R (aov()), hacerle un plot(), cuya figura Normal Q-Q (la segunda), relaciona los cuantiles teóricos de la normal con los de los errores estimados y:
      • Si los puntos quedan “cerca” de la diagonal, entonces, aparentemente, se está cumpliendo la normalidad de los errores.
      • Si “bastantes” puntos se alejan de la diagonal, entonces, aparentemente, está fallando la normalidad de los errores.
  • Igualdad de varianzas en todos los niveles:
    • Se puede contrastar de manera objetiva: contraste de Bartlett de igualdad de varianzas
      • Función bartlett.test(formula, data) o bien bartlett.test(x,...):
        • formula: la misma que en aov()
        • data: el mismo que aov()
        • x,...: los vectores con los datos de \(Y\) para los diversos niveles del factor \(X\)
      • La hipótesis nula es la igualdad de varianzas en todos los niveles
    • Se puede lanzar el ANOVA con R (aov()), hacerle un plot(), cuya figura Residuals vs Factor Levels (la cuarta) muestra las desviaciones de los datos respecto de la media del nivel, permitiendo comparar las varianzas (amplitud vertical de los puntos).

5.7. Comparaciones a posteriori

  • Si la tabla ANOVA conduce a aceptar que \(Y\) no depende de \(X\), ya está todo terminado.
  • En caso contrario, interesa conocer qué niveles de \(X\) dan mayor media de \(Y\). Hacemos un ranking de los niveles de \(X\).
  • Método LSD de Fisher:
    • Función LSD.test(y, trt, alpha, console), perteneciente al paquete agricolae, que se debe cargar (e instalar si no lo está).
    • Argumentos:
      • y: objeto devuelto por la función aov().
      • trt: nombre (etiqueta entrecomillada) del factor (la \(X\)) o vector de nombres de los factores si hay varios.
      • alpha: nivel de significación deseado (\(0.05\) por defecto).
      • console: poner a TRUE si se quiere ver en la R Console el resultado.
    • Devuelve: un objeto de tipo lista con estadísticos y tablas,
      • Una tabla con los niveles del factor y, para cada uno,
        • la media de la variable \(Y\),
        • error estándar,
        • número de observaciones,
        • intervalo de confianza, etc.;
      • Estadísticos varios;
      • LSD: valor de la mínima distancia significativa, y
      • Tabla con
        • el ranking: código (a, b, etc.) asignado por valor de media,
        • nivel del factor,
        • media de \(Y\) para dicho nivel.
        • Puede aparece un nivel con dos códigos distintos (cuando no se puede distinguir del nivel superior ni del inferior, pero ellos sí se distinguen entre sí).

6. Ejercicios evaluables

Carga el espacio de trabajo mt1021-2021-la-5-anova.RData, y en él encontrarás las variables que necesitas para los ejercicios.

# despeja esta linea cuando tengas el archivo
#load("mt1021-1415-la-4-anova.RData")

Problema 1 (25%)

La variable tiempos recoge los tiempos de realización de una misma tarea informática de varios operadores (de características muy similares) bajo 3 sistemas operativos, para comparar sobre cuál es más rápida.

  1. Realiza una gráfica “sencilla” que compare los tiempos por cada sistema operativo sobre el tiempo.
# Escribe aquí el codigo R de lo que se pide

Y TUS COMENTARIOS SI TAMBIÉN SE PIDEN

  1. Calcula los tiempos medios bajo cada sistema operativo, y establece un ranking de “rapidez” basado en esos tiempos medios.
# Escribe aquí el codigo R de lo que se pide

Y TUS COMENTARIOS SI TAMBIÉN SE PIDEN

  1. Aplica el ANOVA para demostrar o refutar que el tiempo medio depende del sistema operativo. ¿Qué se puede decir usando un nivel de confianza del 5%?
# Escribe aquí el codigo R de lo que se pide

Y TUS COMENTARIOS SI TAMBIÉN SE PIDEN

  1. Comprueba si es razonable aplicar ANOVA a estos datos, o si no se debería aplicar. Figuras y comentario.
# Escribe aquí el codigo R de lo que se pide

Y TUS COMENTARIOS SI TAMBIÉN SE PIDEN

  1. En caso afirmativo, y si decidiste que el sistema operativo SÍ influía en los tiempos medios, haz un nuevo ranking donde se vea si hay diferencias estadísticamente significativas (al 5%) entre los sistemas operativos.
# Escribe aquí el codigo R de lo que se pide

Y TUS COMENTARIOS SI TAMBIÉN SE PIDEN

Problema 2 (25%)

Las variables prodA, prodB, prodC y prodD recogen la producción (en miles de unidades) de 4 líneas en las que se aplican métodos distintos (A, B, C y D) que se quieren comparar. A partir de ellos crea una única hoja de datos que reúna todos los datos, con dos columnas bien emparejadas: metodo (que indique el método usado, "A", "B", "C" o "D"), y prod que tenga los datos de la producción. Repite todos los apartados del problema anterior.

  1. Realiza una gráfica “sencilla” que compare los tiempos por cada sistema operativo sobre el tiempo.
# Escribe aquí el codigo R de lo que se pide

Y TUS COMENTARIOS SI TAMBIÉN SE PIDEN

  1. Calcula las producciones medias bajo cada método, y establece un ranking de “productividad”.
# Escribe aquí el codigo R de lo que se pide

Y TUS COMENTARIOS SI TAMBIÉN SE PIDEN

  1. Aplica el ANOVA para demostrar o refutar que la productividad media depende del método. ¿Qué se puede decir usando un nivel de confianza del 1%?
# Escribe aquí el codigo R de lo que se pide

Y TUS COMENTARIOS SI TAMBIÉN SE PIDEN

  1. Comprueba si es razonable aplicar ANOVA a estos datos, o si no se debería aplicar. Figuras y comentario.
# Escribe aquí el codigo R de lo que se pide

Y TUS COMENTARIOS SI TAMBIÉN SE PIDEN

  1. En caso afirmativo, y si decidiste que el método SÍ influía en la productividad media, haz un nuevo ranking donde se vea si hay diferencias estadísticamente significativas (al 1%) entre los métodos.
# Escribe aquí el codigo R de lo que se pide

Y TUS COMENTARIOS SI TAMBIÉN SE PIDEN

Problema 3 (25%)

La variable Test recoge las puntuaciones en una prueba nacional tipo test de vocabulario con 10 preguntas. Analiza si los factores género ( Gender) y nivel educativo (educGroup) tienen separadamente y/o conjuntamente un efecto diferenciador sobre la puntuación media en el test (columna vocab). Estudia la posible interacción enter los factores.

# Escribe aquí el codigo R de lo que se pide

Y TUS COMENTARIOS SI TAMBIÉN SE PIDEN

Problema 4 (25%)

  1. (75%) Programa simulaciones del modelo ANOVA, y ponlas a prueba con la tabla ANOVA, según las siguientes instrucciones.
  • Empieza estableciendo una semilla set.seed()
  • Crea un vector pvalor donde vas a guardar 10000 p-valores de 10000 aplicaciones del ANOVA, que harás en un bucle for
  • \(X\) tome los niveles \(x_1\) = “bajo” (20 muestreos), \(x_2\) = “medio” (30 muestreos) y \(x_3\) = “alto” (20 muestreos)
  • Muestreo de \(Y\) (aquí empezaría el bucle):
    • Cuando \(X\) = “bajo”, simula 20 valores de \(Y\) del modelo \(N(\mu=5, \sigma^2=2)\)
    • Cuando \(X\) = “medio”, simula 30 valores de \(Y\) del modelo \(N(\mu=5, \sigma^2=2)\)
    • Cuando \(X\) = “alto”, simula 20 valores de \(Y\) del modelo \(N(\mu=5, \sigma^2=2)\)
    • Crea la hoja de datos con los datos de \(X\) e \(Y\)
    • Aplica el ANOVA a esa muestra y guarda el \(p\)-valor en el vector pvalor
  • Repite el proceso 10000 veces.
# aqui la programacion
  1. (25%) Contesta las siguientes preguntas:

2.1. En el modelo ANOVA programado, ¿\(Y\) depende de \(X\)? ¿Por qué?

AQUÍ TU RESPUESTA, NO VALE SI NO SE RAZONA

2.2. Si hubieras usado una significación del 5% con las 10000 muestras simuladas, ¿en qué porcentaje de ellas te habría resultado “rechazar que las medias de \(Y\) son iguales”?