Saltar al contenido principal
LibreTexts Español

16.10: ANOVA Factorial 3- Diseños Desbalanceados

  • Page ID
    151293
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    El ANOVA factorial es algo muy útil de conocer. Ha sido una de las herramientas estándar utilizadas para analizar datos experimentales durante muchas décadas, y descubrirás que no puedes leer más de dos o tres artículos en psicología sin toparte con un ANOVA ahí dentro. Sin embargo, hay una gran diferencia entre los ANOVA que verás en muchos artículos científicos reales y el ANOVA que acabo de describir: en la vida real, rara vez tenemos la suerte de tener diseños perfectamente equilibrados. Por una razón u otra, es típico terminar con más observaciones en algunas celdas que en otras. O, para decirlo de otra manera, tenemos un diseño desequilibrado.

    Los diseños desequilibrados necesitan ser tratados con mucho más cuidado que los diseños equilibrados, y la teoría estadística que los sustenta es mucho más desordenada. Podría ser una consecuencia de este desorden, o podría ser una escasez de tiempo, pero mi experiencia ha sido que las clases de métodos de investigación de pregrado en psicología tienen una desagradable tendencia a ignorar este tema por completo. Muchos libros de texto de estadísticas tienden a pasarlo por alto también. El resultado neto de esto, creo, es que muchos investigadores activos en el campo en realidad no saben que hay varios “tipos” diferentes de ANOVA desequilibrados, y producen respuestas bastante diferentes. De hecho, al leer la literatura psicológica, me sorprende el hecho de que la mayoría de las personas que reportan los resultados de un ANOVA factorial desequilibrado en realidad no te dan suficientes detalles para reproducir el análisis: Sospecho secretamente que la mayoría de la gente ni siquiera se da cuenta de que su paquete de software estadístico es tomar una gran cantidad de decisiones sustantivas de análisis de datos en su nombre. En realidad es un poco aterrador, cuando lo piensas. Entonces, si quieres evitar entregar el control de tu análisis de datos a un software estúpido, sigue leyendo...

    datos de café

    Como es habitual, nos ayudará a trabajar con algunos datos. El archivo Coffee.rdata contiene un conjunto de datos hipotéticos (el marco de datos de café) que produce un ANOVA de 3×2 desequilibrado. Supongamos que nos interesaba saber si la tendencia de la gente a balbucear cuando toma demasiado café es puramente un efecto del café en sí, o si hay algún efecto de la leche y el azúcar que la gente agrega al café. Supongamos que llevamos a 18 personas, y les dimos algo de café para tomar. La cantidad de café/ cafeína se mantuvo constante, y variamos si se agregaba o no leche: así que la leche es un factor binario con dos niveles, “sí” y “no”. También variamos el tipo de azúcar involucrado. El café podría contener azúcar “real”, o podría contener azúcar “falso” (es decir, edulcorante artificial), o podría contener “ninguno” en absoluto, por lo que la variable de azúcar es un factor de tres niveles. Nuestra variable de resultado es una variable continua que presumiblemente se refiere a alguna medida psicológicamente sensible del grado en que alguien está “balbuceando”. Los detalles realmente no importan para nuestro propósito. Para tener una idea de cómo se ven los datos, utilizamos la función some () en el paquete del automóvil. La función some () selecciona aleatoriamente algunas de las observaciones en el marco de datos para imprimirlas, lo que a menudo es muy útil:

    load("./rbook-master/data/coffee.rdata")
     some( coffee )
    ##    milk sugar babble
    ## 1   yes  real    4.6
    ## 5   yes  real    5.1
    ## 6    no  real    5.5
    ## 7   yes  none    3.9
    ## 9   yes  none    3.7
    ## 10   no  fake    5.6
    ## 11   no  fake    4.7
    ## 13   no  real    6.0
    ## 14   no  real    5.4
    ## 17   no  none    5.3

    Si usamos la función aggregate () para producir rápidamente una tabla de medias, obtenemos una fuerte impresión de que hay diferencias entre los grupos:

     aggregate( babble ~ milk + sugar, coffee, mean )
    ##   milk sugar babble
    ## 1  yes  none  3.700
    ## 2   no  none  5.550
    ## 3  yes  fake  5.800
    ## 4   no  fake  4.650
    ## 5  yes  real  5.100
    ## 6   no  real  5.875

    Esto es especialmente cierto cuando comparamos estas medias con las desviaciones estándar para la variable balbuceo, que puedes calcular usando aggregate () de la misma manera. Entre los grupos, esta desviación estándar varía de .14 a .71, que es bastante pequeña en relación con las diferencias en las medias grupales. 246 Hasta el momento, parece un ANOVA factorial sencillo, tal como lo hicimos antes. El problema surge cuando comprobamos para ver cuántas observaciones tenemos en cada grupo:

    xtabs( ~ milk + sugar, coffee )
    ##      sugar
    ## milk  none fake real
    ##   yes    3    2    3
    ##   no     2    4    4

    Esto viola uno de nuestros supuestos originales, a saber, que el número de personas en cada grupo es el mismo. Realmente no hemos discutido cómo manejar esta situación.

    “ANOVA estándar” no existe para diseños desequilibrados

    Los diseños desequilibrados nos llevan al descubrimiento algo inquietante de que realmente no hay una cosa a la que podamos referirnos como un ANOVA estándar. De hecho, resulta que hay tres formas fundamentalmente diferentes 247 en las que podrías querer ejecutar un ANOVA en un diseño desequilibrado. Si tienes un diseño equilibrado, las tres versiones producen resultados idénticos, con las sumas de cuadrados, valores F etc todos conformes a las fórmulas que di al inicio del capítulo. No obstante, cuando tu diseño está desequilibrado no dan las mismas respuestas. Además, no todos son igualmente apropiados para cada situación: algunos métodos serán más adecuados a tu situación que otros. Ante todo esto, es importante entender cuáles son los diferentes tipos de ANOVA y en qué se diferencian entre sí.

    El primer tipo de ANOVA se conoce convencionalmente como suma de cuadrados de Tipo I. Seguro que puedes adivinar cómo se llaman los otros dos. La parte de “suma de cuadrados” del nombre fue introducida por el paquete de software estadístico SAS, y se ha convertido en la nomenclatura estándar, pero es un poco engañosa de alguna manera. Creo que la lógica para referirse a ellos como diferentes tipos de suma de cuadrados es que, cuando miras las tablas ANOVA que producen, la diferencia clave en los números son los valores SS. Los grados de libertad no cambian, los valores de MS todavía se definen como SS divididos por df, etc. Sin embargo, lo que la terminología se equivoca es que oculta la razón por la que los valores de SS son diferentes entre sí. Para ello, es mucho más útil pensar en los tres tipos diferentes de ANOVA como tres estrategias diferentes de prueba de hipótesis. Estas diferentes estrategias llevan a diferentes valores de SS, para estar seguros, pero es la estrategia lo que es lo importante aquí, no los valores de SS en sí mismos. Recordemos de las secciones 16.5 y 16.6 que cualquier prueba F en particular se considera mejor como una comparación entre dos modelos lineales. Entonces, cuando estás mirando una tabla ANOVA, ayuda recordar que cada una de esas pruebas F corresponde a un par de modelos que se están comparando. Por supuesto, esto lleva naturalmente a la pregunta de qué par de modelos se está comparando. Esta es la diferencia fundamental entre ANOVA Tipos I, II y III: cada uno corresponde a una manera diferente de elegir los pares de modelos para las pruebas.

    Suma de cuadrados tipo I

    El método Tipo I a veces se conoce como la suma “secuencial” de cuadrados, ya que implica un proceso de agregar términos al modelo uno a la vez. Considera los datos del café, por ejemplo. Supongamos que queremos ejecutar el ANOVA factorial completo de 3×2, incluyendo términos de interacción. El modelo completo, como ya hemos comentado anteriormente, se expresa por la fórmula R balbuceo ~ azúcar + leche + azúcar:leche, aunque a menudo lo acortamos usando la notación azúcar * leche. La estrategia Tipo I construye este modelo secuencialmente, partiendo del modelo más simple posible y agregando términos gradualmente.

    El modelo más simple posible para los datos sería aquel en el que ni la leche ni el azúcar se supone que tienen ningún efecto sobre el balbuceo. El único término que se incluiría en dicho modelo es la intercepción, y en notación de fórmula R la escribiríamos como balbuceo ~ 1. Esta es nuestra hipótesis nula inicial. El siguiente modelo más simple para los datos sería aquel en el que sólo se incluya uno de los dos efectos principales. En los datos del café, aquí hay dos opciones diferentes posibles, porque podríamos optar por agregar leche primero o agregar azúcar primero (perdón por el juego de palabras). El orden en realidad resulta importar, como veremos más adelante, pero por ahora solo hagamos una elección arbitrariamente, y recojamos azúcar. Entonces el segundo modelo en nuestra secuencia de modelos es el balbuceo ~ azúcar, y forma la hipótesis alternativa para nuestra primera prueba. Ahora tenemos nuestra primera prueba de hipótesis:

    knitr::kable(tibble::tribble(
                       ~V1,                ~V2,
             "Null model:",     "`babble ~ 1`",
      "Alternative model:", "`babble ~ sugar`"
      ), col.names= c("", ""))
    Modelo nulo: balbuceo ~ 1
    Modelo alternativo: balbuceo ~ azúcar

    Esta comparación forma nuestra prueba de hipótesis del efecto principal del azúcar. El siguiente paso en nuestra construcción de modelos lo ejercita para agregar el otro término de efecto principal, por lo que el siguiente modelo en nuestra secuencia es el balbuceo ~ azúcar + leche. La segunda prueba de hipótesis se forma luego comparando el siguiente par de modelos:

    knitr::kable(tibble::tribble(
                       ~V1,                ~V2,
             "Null model:",     "`babble ~ sugar`",
      "Alternative model:", "`babble ~ sugar + milk`"
      ), col.names= c("", ""))
    Modelo nulo: balbuceo ~ azúcar
    Modelo alternativo: balbuceo ~ azúcar + leche

    Esta comparación forma nuestra prueba de hipótesis del efecto principal de la leche. En un sentido, este enfoque es muy elegante: la hipótesis alternativa de la primera prueba forma la hipótesis nula para la segunda. Es en este sentido que el método Tipo I es estrictamente secuencial. Cada prueba se basa directamente en los resultados de la última. Sin embargo, en otro sentido es muy poco elegante, porque hay una fuerte asimetría entre las dos pruebas. La prueba del efecto principal del azúcar (la primera prueba) ignora completamente la leche, mientras que la prueba del efecto principal de la leche (la segunda prueba) sí toma en cuenta el azúcar. En cualquier caso, el cuarto modelo de nuestra secuencia es ahora el modelo completo, balbuceo ~ azúcar + leche + azúcar:leche, y la prueba de hipótesis correspondiente es

    knitr::kable(tibble::tribble(
                       ~V1,                ~V2,
             "Null model:",     "`babble ~ sugar + milk`",
      "Alternative model:", "`babble ~ sugar + milk + sugar:milk`"
      ), col.names= c("", ""))
    
    Modelo nulo: balbuceo ~ azúcar + leche
    Modelo alternativo: balbuceo ~ azúcar + leche + azúcar:leche

    La suma de cuadrados tipo I es el método de prueba de hipótesis predeterminado utilizado por la función anova (), por lo que es fácil producir los resultados a partir de un análisis de Tipo I. Simplemente tecleamos los mismos comandos que siempre hicimos. Como ahora hemos llegado al punto en que no necesitamos ocultar el hecho de que ANOVA y regresión son ambos modelos lineales, usaré la función lm () para ejecutar los análisis:

     mod <- lm( babble ~ sugar + milk + sugar:milk, coffee )
     anova( mod )
    ## Analysis of Variance Table
    ## 
    ## Response: babble
    ##            Df Sum Sq Mean Sq F value   Pr(>F)   
    ## sugar       2 3.5575 1.77876  6.7495 0.010863 * 
    ## milk        1 0.9561 0.95611  3.6279 0.081061 . 
    ## sugar:milk  2 5.9439 2.97193 11.2769 0.001754 **
    ## Residuals  12 3.1625 0.26354                    
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    Dejando de lado por un momento la cuestión de cómo debe interpretarse este resultado, tomemos nota de que nuestros tres valores p son .0109, .0811 y .0018 respectivamente. A continuación, veamos si podemos replicar el análisis usando herramientas con las que estamos un poco más familiarizados. Primero, ajustemos los cuatro modelos:

    mod.1 <- lm( babble ~ 1, coffee )
     mod.2 <- lm( babble ~ sugar, coffee )
     mod.3 <- lm( babble ~ sugar + milk, coffee )
     mod.4 <- lm( babble ~ sugar + milk + sugar:milk, coffee )

    Para ejecutar la primera prueba de hipótesis comparando mod.1 con mod.2 podemos usar el comando anova (mod.1, mod.2) de la misma manera que hicimos en la Sección 16.5. Del mismo modo, podemos usar los comandos anova (mod.2, mod.3) y anova (mod.3, mod.4) y para ejecutar las pruebas de hipótesis segunda y tercera. Sin embargo, en lugar de ejecutar cada uno de esos comandos por separado, podemos ingresar la secuencia completa de modelos como este:

    anova( mod.1, mod.2, mod.3, mod.4 )
    ## Analysis of Variance Table
    ## 
    ## Model 1: babble ~ 1
    ## Model 2: babble ~ sugar
    ## Model 3: babble ~ sugar + milk
    ## Model 4: babble ~ sugar + milk + sugar:milk
    ##   Res.Df     RSS Df Sum of Sq       F   Pr(>F)   
    ## 1     17 13.6200                                 
    ## 2     15 10.0625  2    3.5575  6.7495 0.010863 * 
    ## 3     14  9.1064  1    0.9561  3.6279 0.081061 . 
    ## 4     12  3.1625  2    5.9439 11.2769 0.001754 **
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    Esta salida es bastante más detallada que la última, pero está contando esencialmente la misma historia. 248

    El gran problema con el uso de la suma de cuadrados Tipo I es el hecho de que realmente depende del orden en que ingreses las variables. Sin embargo, en muchas situaciones el investigador no tiene razón para preferir un orden sobre otro. Este es presumiblemente el caso de nuestro problema de leche y azúcar. ¿Debemos agregar primero la leche, o primero el azúcar? Se siente exactamente tan arbitraria como una pregunta de análisis de datos como lo hace como una pregunta de elaboración de café. De hecho, puede haber algunas personas con opiniones firmes sobre ordenar, pero es difícil imaginar una respuesta de principios a la pregunta. Sin embargo, mira lo que sucede cuando cambiamos el orden:

    mod <- lm( babble ~  milk + sugar + sugar:milk, coffee )
     anova( mod )
    
    ## Analysis of Variance Table
    ## 
    ## Response: babble
    ##            Df Sum Sq Mean Sq F value   Pr(>F)   
    ## milk        1 1.4440 1.44400  5.4792 0.037333 * 
    ## sugar       2 3.0696 1.53482  5.8238 0.017075 * 
    ## milk:sugar  2 5.9439 2.97193 11.2769 0.001754 **
    ## Residuals  12 3.1625 0.26354                    
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    Los valores p para ambos términos del efecto principal han cambiado, y de manera bastante dramática. Entre otras cosas, el efecto de la leche se ha vuelto significativo (aunque se debe evitar sacar conclusiones fuertes al respecto, como ya he mencionado anteriormente). ¿Cuál de estos dos ANOVA debería reportar uno? No es inmediatamente obvio.

    Cuando nos fijamos en las pruebas de hipótesis que se utilizan para definir el “primer” efecto principal y el “segundo”, está claro que son cualitativamente diferentes entre sí. En nuestro ejemplo inicial, vimos que la prueba para el efecto principal del azúcar ignora completamente la leche, mientras que la prueba del efecto principal de la leche sí toma en cuenta el azúcar. Como tal, la estrategia de prueba Tipo I realmente trata el primer efecto principal como si tuviera una especie de primacía teórica sobre el segundo. En mi experiencia hay muy raramente, si alguna vez, alguna primacía teórica de este tipo que justifique tratar cualquiera de dos efectos principales asimétricamente.

    La consecuencia de todo esto es que las pruebas de Tipo I rara vez son de mucho interés, por lo que debemos pasar a discutir las pruebas de Tipo II y las pruebas de Tipo III. Sin embargo, en aras de la integridad —en la remota posibilidad de que alguna vez te encuentres necesitando realizar pruebas de Tipo I—, comentaré brevemente cómo R determina el orden de los términos en una prueba de Tipo I. El principio clave en la suma de cuadrados Tipo I es que las pruebas de hipótesis sean secuenciales, con términos agregados uno a la vez. Sin embargo, también implica que los efectos principales se agreguen primero (por ejemplo, factores A, B, C, etc.), seguidos de términos de interacción de primer orden (por ejemplo, términos como A:B y B:C), luego interacciones de segundo orden (por ejemplo, A:B:C) y así sucesivamente. Dentro de cada “bloque” puedes especificar el orden que quieras. Entonces, por ejemplo, si especificamos nuestro modelo usando un comando como este,

    mod <- lm( outcome ~ A + B + C + B:C + A:B + A:C )

    y luego usó anova (mod) para producir pruebas de hipótesis secuenciales, lo que veríamos es que los términos de efecto principal se ingresarían A luego B y luego C, pero luego las interacciones se ingresarían en el orden B:C primero, luego A:B y luego finalmente A:C. Reordenar los términos dentro de cada grupo cambiará el orden, como vimos anteriormente. Sin embargo, cambiar el orden de los términos entre bloques no tiene ningún efecto. Por ejemplo, si intentamos mover el término de interacción B:C al frente, así,

    mod <- lm( outcome ~ B:C + A + B + C + A:B + A:C )

    no tendría ningún efecto. R seguiría ingresando los términos en el mismo orden que la última vez. Si por alguna razón realmente, realmente necesitas ingresar primero un término de interacción, entonces tienes que hacerlo a la larga, creando cada modelo manualmente usando un comando lm () separado y luego usando un comando como anova (mod.1, mod.2, mod.3, mod.4) para forzar a R a ingresarlos en el orden en que usted quiere.

    Suma de cuadrados tipo III

    Al terminar de hablar de las pruebas Tipo I, podrías pensar que lo natural a hacer a continuación sería hablar de las pruebas de Tipo II. Sin embargo, creo que en realidad es un poco más natural discutir las pruebas de Tipo III (que son simples) antes de hablar de las pruebas de Tipo II (que son más complicadas). La idea básica detrás de las pruebas Tipo III es extremadamente simple: independientemente del término que intentes evaluar, ejecuta la prueba F en la que la hipótesis alternativa corresponde al modelo ANOVA completo según lo especificado por el usuario, y el modelo nulo solo elimina ese término que estás probando. Por ejemplo, en el ejemplo del café, en el que nuestro modelo completo era balbuceo ~ azúcar + leche + azúcar:leche, la prueba para un efecto principal del azúcar correspondería a una comparación entre los dos modelos siguientes:

    knitr::kable(tibble::tribble(
                       ~V1,                ~V2,
             "Null model:",     "`babble ~ milk + sugar:milk`",
      "Alternative model:", "`babble ~ sugar + milk + sugar:milk`"
      ), col.names= c("", ""))
    Modelo nulo: balbuceo ~ leche + azúcar:leche
    Modelo alternativo: balbuceo ~ azúcar + leche + azúcar:leche

    De igual manera se evalúa el efecto principal de la leche probando el modelo completo contra un modelo nulo que elimina el término lácteo, así:

    knitr::kable(tibble::tribble(
                       ~V1,                ~V2,
             "Null model:",     "`babble ~ sugar + sugar:milk`",
      "Alternative model:", "`babble ~ sugar + milk + sugar:milk`"
      ), col.names= c("", ""))
    Modelo nulo: balbuceo ~ azúcar + azúcar:leche
    Modelo alternativo: balbuceo ~ azúcar + leche + azúcar:leche

    Finalmente, el término de interacción azúcar:leche se evalúa exactamente de la misma manera. Una vez más, probamos el modelo completo contra un modelo nulo que elimina el término de interacción azúcar:leche, así:

    knitr::kable(tibble::tribble(
                       ~V1,                ~V2,
             "Null model:",     "`babble ~ sugar + milk`",
      "Alternative model:", "`babble ~ sugar + milk + sugar:milk`"
      ), col.names= c("", ""))
    Modelo nulo: balbuceo ~ azúcar + leche
    Modelo alternativo: balbuceo ~ azúcar + leche + azúcar:leche

    La idea básica se generaliza a ANOVA de orden superior. Por ejemplo, supongamos que estábamos tratando de ejecutar un ANOVA con tres factores, A, B y C, y quisiéramos considerar todos los posibles efectos principales y todas las interacciones posibles, incluyendo la interacción de tres vías A:B:C. La siguiente tabla te muestra cómo son las pruebas Tipo III para esta situación:

    knitr::kable(tibble::tribble(
                         ~V1,                                 ~V2,                                     ~V3,
    
                       "`A`", "`B + C + A:B + A:C + B:C + A:B:C`", "`A + B + C + A:B + A:C + B:C + A:B:C`",
                       "`B`", "`A + C + A:B + A:C + B:C + A:B:C`", "`A + B + C + A:B + A:C + B:C + A:B:C`",
                       "`C`", "`A + B + A:B + A:C + B:C + A:B:C`", "`A + B + C + A:B + A:C + B:C + A:B:C`",
                     "`A:B`",   "`A + B + C + A:C + B:C + A:B:C`", "`A + B + C + A:B + A:C + B:C + A:B:C`",
                     "`A:C`",   "`A + B + C + A:B + B:C + A:B:C`", "`A + B + C + A:B + A:C + B:C + A:B:C`",
                     "`B:C`",   "`A + B + C + A:B + A:C + A:B:C`", "`A + B + C + A:B + A:C + B:C + A:B:C`",
                   "`A:B:C`",     "`A + B + C + A:B + A:C + B:C`", "`A + B + C + A:B + A:C + B:C + A:B:C`"
      ), col.names = c(  "Term being tested is",     "Null model is `outcome ~ ...`",  "Alternative model is `outcome ~ ...`"))
    El término que se está probando es Modelo nulo es resultado ~... Modelo alternativo es resultado ~...
    A B + C + A:B + A:C + B:C + A:B:C A + B + C + A:B + A:C + B:C + A: B:C
    B A + C + A:B + A:C + B:C + A:B:C A + B + C + A:B + A:C + B:C + A: B:C
    C A + B + A:B + A:C + B:C + A:B:C A + B + C + A:B + A:C + B:C + A: B:C
    A: B A + B + C + A: C + B:C + A: B:C A + B + C + A:B + A:C + B:C + A: B:C
    A:C A + B + C + A: B + B:C + A: B:C A + B + C + A:B + A:C + B:C + A: B:C
    B:C A + B + C + A:B + A:C + A:B:C A + B + C + A:B + A:C + B:C + A: B:C
    A: B:C A + B + C + A: B + A: C + B:C A + B + C + A:B + A:C + B:C + A: B:C

    Por muy fea que se vea esa mesa, es bastante simple. En todos los casos, la hipótesis alternativa corresponde al modelo completo, que contiene tres términos de efecto principal (por ejemplo, A), tres interacciones de primer orden (por ejemplo, A:B) y una interacción de segundo orden (es decir, A:B:C). El modelo nulo siempre contiene 6 de estos 7 términos: y el que falta es aquel cuya significación estamos tratando de probar.

    Al primer paso, las pruebas Tipo III parecen una buena idea. En primer lugar, hemos eliminado la asimetría que nos provocó tener problemas al ejecutar pruebas de Tipo I. Y como ahora estamos tratando todos los términos de la misma manera, los resultados de las pruebas de hipótesis no dependen del orden en que los especifiquemos. Esto definitivamente es algo bueno. Sin embargo, existe un gran problema a la hora de interpretar los resultados de las pruebas, especialmente para términos de efectos principales. Considera los datos del café. Supongamos que resulta que el efecto principal de la leche no es significativo según las pruebas Tipo III. Lo que esto nos está diciendo es que el balbuceo ~ azúcar + azúcar:leche es un mejor modelo para los datos que el modelo completo. Pero, ¿qué significa eso? Si el término de interacción azúcar:leche tampoco fuera significativo, estaríamos tentados a concluir que los datos nos están diciendo que lo único que importa es el azúcar. Pero supongamos que tenemos un término de interacción significativo, pero un efecto principal no significativo de la leche. En este caso, ¿vamos a suponer que realmente hay un “efecto del azúcar”, una “interacción entre la leche y el azúcar”, pero no “efecto de la leche”? Eso parece una locura. La respuesta correcta simplemente debe ser que no tiene sentido 249 hablar del efecto principal si la interacción es significativa. En general, esto parece ser lo que la mayoría de los estadísticos nos aconsejan hacer, y creo que ese es el consejo adecuado. Pero si realmente no tiene sentido hablar de efectos principales no significativos ante la presencia de una interacción significativa, entonces no es para nada obvio por qué las pruebas de Tipo III deberían permitir que la hipótesis nula se base en un modelo que incluya la interacción pero omita uno de los principales efectos que la componen. Cuando se caracterizan de esta manera, las hipótesis nulas realmente no tienen mucho sentido en absoluto.

    Más adelante, veremos que las pruebas de Tipo III se pueden canjear en algunos contextos, pero será mejor que te muestre primero cómo calcular realmente un ANOVA Tipo III. La función anova () en R no soporta directamente pruebas de tipo II o pruebas de tipo III. Técnicamente, puedes hacerlo creando los diversos modelos que forman las hipótesis nulas y alternativas para cada prueba, y luego usando anova () para comparar los modelos entre sí. Delineé la esencia de cómo se haría eso al hablar de pruebas Tipo I, pero hablando desde la experiencia de primera mano 250 te puedo decir que es muy tedioso. En la práctica, la función anova () sólo se utiliza para producir pruebas de Tipo I o para comparar modelos específicos de particular interés (ver Sección 16.5). Si quieres pruebas Tipo II o Tipo III necesitas usar la función Anova () en el paquete del auto. Es bastante fácil de usar, ya que hay un argumento tipo que especificas. Entonces, para volver a nuestro ejemplo de café, nuestras pruebas Tipo III se ejecutan de la siguiente manera:

    mod <- lm( babble ~ sugar * milk, coffee )
     Anova( mod, type=3 )
    ## Anova Table (Type III tests)
    ## 
    ## Response: babble
    ##             Sum Sq Df F value   Pr(>F)    
    ## (Intercept) 41.070  1 155.839 3.11e-08 ***
    ## sugar        5.880  2  11.156 0.001830 ** 
    ## milk         4.107  1  15.584 0.001936 ** 
    ## sugar:milk   5.944  2  11.277 0.001754 ** 
    ## Residuals    3.162 12                     
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    Como pueden ver, esta vez me volví perezoso y usé el azúcar * la leche como forma taquigráfica de referirme al azúcar + leche + azúcar:leche. El punto importante aquí es que esta es solo una tabla ANOVA regular, y podemos ver que nuestras pruebas Tipo III son significativas para todos los términos, incluso la intercepción.

    Excepto, como de costumbre, no es tan sencillo. Una de las características perversas de la estrategia de pruebas Tipo III es que los resultados resultan depender de los contrastes que utilices para codificar tus factores (ver Sección 16.7 si has olvidado cuáles son los diferentes tipos de contrastes). Los resultados que presenté en la tabla ANOVA anterior se basan en el valor predeterminado de R, que es los contrastes de tratamiento; y como veremos más adelante, esta suele ser una opción muy mala si quieres realizar pruebas de Tipo III. Entonces veamos qué pasa si cambiar a Helmert contrasta:

     my.contrasts <- list( milk = "contr.Helmert", sugar = "contr.Helmert" )
     mod.H <- lm( babble ~ sugar * milk, coffee, contrasts = my.contrasts )
     Anova( mod.H, type=3 )
    ## Anova Table (Type III tests)
    ## 
    ## Response: babble
    ##             Sum Sq Df   F value    Pr(>F)    
    ## (Intercept) 434.29  1 1647.8882 3.231e-14 ***
    ## sugar         2.13  2    4.0446  0.045426 *  
    ## milk          1.00  1    3.8102  0.074672 .  
    ## sugar:milk    5.94  2   11.2769  0.001754 ** 
    ## Residuals     3.16 12                        
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    Oh, eso no es nada bueno. En el caso de la leche en particular, el valor p ha cambiado de .002 a .07. Esta es una diferencia bastante sustancial, y ojalá te dé una idea de lo importante que es que te cuides al usar las pruebas de Tipo III.

    Bien, entonces si los valores p que salen de los análisis de Tipo III son tan sensibles a la elección de los contrastes, ¿significa eso que las pruebas de Tipo III son esencialmente arbitrarias y de no ser confiables? En cierta medida eso es cierto, y cuando volvamos a una discusión sobre las pruebas de Tipo II veremos que los análisis de Tipo II evitan por completo esta arbitrariedad, pero creo que esa es una conclusión demasiado fuerte. En primer lugar, es importante reconocer que algunas opciones de contrastes siempre producirán las mismas respuestas. De particular importancia es el hecho de que si las columnas de nuestra matriz de contraste están todas restringidas a sumar a cero, entonces el análisis Tipo III siempre dará las mismas respuestas. Esto significa que obtendrás las mismas respuestas si usas contr.helmert o contr.sum o contr.poly, pero diferentes respuestas para contr.treatment o contr.sas.

    random.contrasts <- matrix( rnorm(6), 3, 2 )   # create a random matrix
     random.contrasts[, 1] <- random.contrasts[, 1] - mean( random.contrasts[, 1] ) # contrast 1 sums to 0
     random.contrasts[, 2] <- random.contrasts[, 2] - mean( random.contrasts[, 2] ) # contrast 2 sums to 0
     random.contrasts  # print it to check that we really have an arbitrary contrast matrix...
    
    ##           [,1]       [,2]
    ## [1,] -1.523759  0.6891740
    ## [2,] -0.334936  0.9999209
    ## [3,]  1.858695 -1.6890949
     contrasts( coffee$sugar ) <- random.contrasts # random contrasts for sugar
     contrasts( coffee$milk ) <- contr.Helmert(2)  # Helmert contrasts for the milk factor 
     mod.R <- lm( babble ~ sugar * milk, coffee )  # R will use the contrasts that we assigned
     Anova( mod.R, type = 3 )   
    
    ## Anova Table (Type III tests)
    ## 
    ## Response: babble
    ##             Sum Sq Df   F value    Pr(>F)    
    ## (Intercept) 434.29  1 1647.8882 3.231e-14 ***
    ## sugar         2.13  2    4.0446  0.045426 *  
    ## milk          1.00  1    3.8102  0.074672 .  
    ## sugar:milk    5.94  2   11.2769  0.001754 ** 
    ## Residuals     3.16 12                        
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    Sí, mismas respuestas.

    Suma de cuadrados tipo II

    Bien, entonces ya hemos visto pruebas de Tipo I y III, y ambas son bastante sencillas: las pruebas de Tipo I se realizan agregando gradualmente términos uno a la vez, mientras que las pruebas de Tipo III se realizan tomando el modelo completo y buscando ver qué sucede cuando eliminas cada término. No obstante, ambos tienen algunas fallas graves: las pruebas de Tipo I dependen del orden en que ingreses los términos, y las pruebas de Tipo III dependen de cómo codifiques tus contrastes. Debido a estos defectos, ninguno es fácil de interpretar. Las pruebas tipo II son un poco más difíciles de describir, pero evitan ambos problemas, y como resultado son un poco más fáciles de interpretar.

    Las pruebas de tipo II son ampliamente similares a las pruebas de tipo III: comience con un modelo “completo” y pruebe un término en particular eliminándolo de ese modelo. Sin embargo, las pruebas Tipo II se basan en el principio de marginalidad que establece que no debes omitir un término de orden inferior de tu modelo si hay alguno de orden superior que dependa de él. Entonces, por ejemplo, si tu modelo contiene la interacción A:B (un término de segundo orden), entonces realmente debería contener los efectos principales A y B (términos de 1er orden). De igual manera, si contiene un término de interacción de tres vías A:B:C, entonces el modelo también debe incluir los efectos principales A, B y C así como las interacciones más simples A:B, A:C y B:C. Las pruebas tipo III violan rutinariamente el principio de marginalidad. Por ejemplo, considere la prueba del efecto principal de A en el contexto de un ANOVA de tres vías que incluya todos los términos de interacción posibles. Según las pruebas Tipo III, nuestros modelos nulos y alternativos son:

    knitr::kable(tibble::tribble(
                       ~V1,                                               ~V2,
             "Null model:",     "`outcome ~ B + C + A:B + A:C + B:C + A:B:C`",
      "Alternative model:", "`outcome ~ A + B + C + A:B + A:C + B:C + A:B:C`"
      ), col.names = c("", ""))
    Modelo nulo: resultado ~ B + C + A:B + A:C + B:C + A:B:C
    Modelo alternativo: resultado ~ A + B + C + A:B + A:C + B:C + A:B:C

    Observe que la hipótesis nula omite A, pero incluye A:B, A:C y A:B:C como parte del modelo. Esto, según las pruebas Tipo II, no es una buena opción de hipótesis nula. Lo que debemos hacer en cambio, si queremos probar la hipótesis nula de que A no es relevante para nuestro resultado, es especificar la hipótesis nula que es el modelo más complicado que no se basa en A en ninguna forma, ni siquiera como interacción. La hipótesis alternativa corresponde a este modelo nulo más un término de efecto principal de A. Esto está mucho más cerca de lo que la mayoría de la gente pensaría intuitivamente como un “efecto principal de A”, y arroja lo siguiente como nuestra prueba Tipo II del efecto principal de A. 251

    knitr::kable(tibble::tribble(
                       ~V1,                                               ~V2,
             "Null model:",     "`outcome ~ B + C + B:C`",
      "Alternative model:", "`outcome ~ A + B + C + B:C`"
      ), col.names = c("", ""))
    Modelo nulo: resultado ~ B + C + B:C
    Modelo alternativo: resultado ~ A + B + C + B:C

    De todas formas, solo para darte una idea de cómo se desarrollan las pruebas Tipo II, aquí tienes la tabla completa de pruebas que se aplicarían en un ANOVA factorial de tres vías:

    knitr::kable(tibble::tribble(
                         ~V1,                             ~V2,                                     ~V3,
    
                       "`A`",                 "`B + C + B:C`",                     "`A + B + C + B:C`",
                       "`B`",                 "`A + C + A:C`",                     "`A + B + C + A:C`",
                       "`C`",                 "`A + B + A:B`",                     "`A + B + C + A:B`",
                     "`A:B`",       "`A + B + C + A:C + B:C`",         "`A + B + C + A:B + A:C + B:C`",
                     "`A:C`",       "`A + B + C + A:B + B:C`",         "`A + B + C + A:B + A:C + B:C`",
                     "`B:C`",       "`A + B + C + A:B + A:C`",         "`A + B + C + A:B + A:C + B:C`",
                   "`A:B:C`", "`A + B + C + A:B + A:C + B:C`", "`A + B + C + A:B + A:C + B:C + A:B:C`"
      ), col.names = c(  "Term being tested is", "Null model is `outcome ~ ...`",  "Alternative model is `outcome ~ ...`"))
    El término que se está probando es Modelo nulo es resultado ~... Modelo alternativo es resultado ~...
    A B + C + B:C A + B + C + B:C
    B A + C + A: C A + B + C + A: C
    C A + B + A: B A + B + C + A: B
    A: B A + B + C + A: C + B:C A + B + C + A: B + A: C + B:C
    A:C A + B + C + A: B + B:C A + B + C + A: B + A: C + B:C
    B:C A + B + C + A: B + A: C A + B + C + A: B + A: C + B:C
    A: B:C A + B + C + A: B + A: C + B:C A + B + C + A:B + A:C + B:C + A: B:C

    En el contexto del ANOVA de dos vías que hemos estado usando en los datos del café, las pruebas de hipótesis son aún más simples. El principal efecto del azúcar corresponde a una prueba F comparando estos dos modelos:

    knitr::kable(tibble::tribble(
                       ~V1,                                               ~V2,
             "Null model:",     "`babble ~ milk`",
      "Alternative model:", "`babble ~ sugar + milk`"
      ), col.names = c("", "")) 
    Modelo nulo: balbuceo ~ leche
    Modelo alternativo: balbuceo ~ azúcar + leche

    La prueba para el efecto principal de la leche es

    knitr::kable(tibble::tribble(
                       ~V1,                                               ~V2,
             "Null model:",     "`babble ~ sugar`",
      "Alternative model:", "`babble ~ sugar + milk`"
      ), col.names = c("", ""))
    Modelo nulo: balbuceo ~ azúcar
    Modelo alternativo: balbuceo ~ azúcar + leche

    Finalmente, la prueba para la interacción azúcar:leche es:

    knitr::kable(tibble::tribble(
                       ~V1,                                               ~V2,
             "Null model:",     "`babble ~ sugar + milk`",
      "Alternative model:", "`babble ~ sugar + milk + sugar:milk`"
      ), col.names = c("", ""))
    Modelo nulo: balbuceo ~ azúcar + leche
    Modelo alternativo: balbuceo ~ azúcar + leche + azúcar:leche

    Ejecutar las pruebas vuelve a ser sencillo. Usamos la función Anova (), especificando type=2:

    mod <- lm( babble ~  sugar*milk, coffee )
     Anova( mod, type = 2 )
    ## Anova Table (Type II tests)
    ## 
    ## Response: babble
    ##            Sum Sq Df F value   Pr(>F)   
    ## sugar      3.0696  2  5.8238 0.017075 * 
    ## milk       0.9561  1  3.6279 0.081061 . 
    ## sugar:milk 5.9439  2 11.2769 0.001754 **
    ## Residuals  3.1625 12                    
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    Las pruebas de tipo II tienen algunas ventajas claras sobre las pruebas de tipo I y tipo III. No dependen del orden en que especifiques los factores (a diferencia del Tipo I), y no dependen de los contrastes que utilices para especificar tus factores (a diferencia del Tipo III). Y aunque las opiniones pueden diferir sobre este último punto, y definitivamente dependerá de lo que intentes hacer con tus datos, sí creo que las pruebas de hipótesis que especifican tienen más probabilidades de corresponder a algo que realmente te importa. Como consecuencia, encuentro que suele ser más fácil interpretar los resultados de una prueba de Tipo II que los resultados de una prueba de Tipo I o Tipo III. Por esta razón, mi consejo tentativo es que, si no se te ocurre ninguna comparación obvia de modelos que se asigne directamente a tus preguntas de investigación pero aún quieres ejecutar un ANOVA en un diseño desequilibrado, las pruebas de Tipo II son probablemente una mejor opción que Tipo I o Tipo III. 252

    Tamaños de efecto (y sumas no aditivas de cuadrados)

    La función etaSquared () en el paquete lsr calcula los valores η2 y η2 parciales para diseños desequilibrados y para diferentes Tipos de pruebas. Es bastante sencillo. Todo lo que tienes que hacer es indicar qué tipo de pruebas estás haciendo,

    etaSquared( mod, type=2 )
    ##                eta.sq eta.sq.part
    ## sugar      0.22537682   0.4925493
    ## milk       0.07019886   0.2321436
    ## sugar:milk 0.43640732   0.6527155

    y sale los valores η 2 y η parcial 2, según lo solicitado. Sin embargo, cuando tienes un diseño desequilibrado, hay un poco de complejidad adicional involucrada. Para ver por qué, vamos a expandir la salida de la función etaSquared () para que muestre la tabla ANOVA completa:

     es <- etaSquared( mod, type=2, anova=TRUE )
     es
    ##                eta.sq eta.sq.part        SS df        MS         F
    ## sugar      0.22537682   0.4925493 3.0696323  2 1.5348161  5.823808
    ## milk       0.07019886   0.2321436 0.9561085  1 0.9561085  3.627921
    ## sugar:milk 0.43640732   0.6527155 5.9438677  2 2.9719339 11.276903
    ## Residuals  0.23219530          NA 3.1625000 12 0.2635417        NA
    ##                      p
    ## sugar      0.017075099
    ## milk       0.081060698
    ## sugar:milk 0.001754333
    ## Residuals           NA

    Bien, si recuerdas nuestras primeras discusiones sobre ANOVA, una de las ideas clave detrás de los cálculos de sumas de cuadrados es que si sumamos todos los términos SS asociados a los efectos en el modelo, y agregamos eso al SS residual, se supone que sumarán a la suma total de cuadrados. Y, además de eso, toda la idea detrás de η 2 es que —porque estás dividiendo uno de los términos SS por el valor total de SS— es que un valor η 2 puede interpretarse como la proporción de varianza contabilizada por un término en particular.

    Ahora echa un vistazo a la salida anterior. Debido a que he incluido el valor η 2 asociado con los residuos (es decir, proporción de varianza en el resultado atribuido a los residuales, en lugar de a uno de los efectos), se esperaría que todos los valores η 2 sumen a 1. Porque, la idea aquí fue que la varianza en la variable de resultado se puede dividir en la variabilidad atribuible al modelo, y la variabilidad en los residuos. ¿Correcto? ¿Correcto? Y sin embargo, cuando sumamos los valores η 2 para nuestro modelo...

    sum( es[,"eta.sq"] )
    ## [1] 0.9641783

    ... descubrimos que para las pruebas Tipo II y Tipo III generalmente no suman a 1. Parte de la variabilidad se ha “perdido”. No se le está atribuyendo al modelo, y tampoco se le está atribuyendo a los residuos. ¿Qué está pasando aquí?

    Antes de darte la respuesta, quiero empujar esta idea un poco más allá. Desde una perspectiva matemática, es bastante fácil ver que la varianza faltante es consecuencia de que en los Tipos II y III, los valores individuales de SS no están obligados a la suma total de cuadrados, y solo lo harán si se tienen datos balanceados. Explicaré por qué sucede esto y qué significa en un segundo, pero primero verifiquemos que este es el caso usando la tabla ANOVA. Primero, podemos calcular la suma total de cuadrados directamente a partir de los datos brutos:

    ss.tot <- sum( (coffee$babble - mean(coffee$babble))^2 )
     ss.tot
    ## [1] 13.62

    A continuación, podemos leer todos los valores SS de una de nuestras tablas ANOVA Tipo I, y sumarlos. Como puedes ver, esto nos da la misma respuesta, tal como se supone que debe:

     type.I.sum <- 3.5575 + 0.9561 + 5.9439 + 3.1625
     type.I.sum
    ## [1] 13.62

    Sin embargo, cuando hacemos lo mismo para la tabla ANOVA Tipo II, resulta que los valores SS en la tabla suman un poco menos que el valor SS total:

    type.II.sum <- 0.9561 + 3.0696 + 5.9439 + 3.1625
    type.II.sum
    ## [1] 13.1321

    Entonces, una vez más, podemos ver que hay un poco de varianza que ha “desaparecido” en alguna parte.

    Bien, es hora de explicar lo que ha pasado. La razón por la que esto sucede es que, cuando tienes diseños desequilibrados, tus factores se correlacionan entre sí, y se vuelve difícil distinguir entre el efecto del Factor A y el efecto del Factor B. En el caso extremo, supongamos que ejecutaríamos un diseño 2×2 en el que el número de los participantes en cada grupo habían sido los siguientes:

    knitr::kable(tibble::tribble(
            ~V1,     ~V2,        ~V3,
         "milk",   "100",        "0",
      "no milk",     "0",      "100"
      ), col.names = c(         "", "sugar", "no sugar"))
    azúcar sin azúcar
    leche 100 0
    sin leche 0 100

    Aquí tenemos un diseño espectacularmente desequilibrado: 100 personas tienen leche y azúcar, 100 personas no tienen leche ni azúcar, y eso es todo. Hay 0 personas con leche y sin azúcar, y 0 personas con azúcar pero sin leche. Ahora supongamos que, cuando recolectamos los datos, resultó que hay una gran diferencia (y estadísticamente significativa) entre el grupo “leche y azúcar” y el grupo “sin leche y sin azúcar”. ¿Es este un efecto principal del azúcar? ¿Un efecto principal de la leche? ¿O una interacción? Es imposible decirlo, porque la presencia del azúcar tiene una asociación perfecta con la presencia de la leche. Ahora supongamos que el diseño había sido un poco más equilibrado:

    knitr::kable(tibble::tribble(
            ~V1,     ~V2,        ~V3,
         "milk",   "100",        "5",
      "no milk",     "5",      "100"
      ), col.names = c(         "", "sugar", "no sugar"))
    azúcar sin azúcar
    leche 100 5
    sin leche 5 100

    En esta ocasión, es técnicamente posible distinguir entre el efecto de la leche y el efecto del azúcar, porque tenemos algunas personas que tienen una pero no la otra. No obstante, seguirá siendo bastante difícil hacerlo, porque la asociación entre el azúcar y la leche sigue siendo extremadamente fuerte, y hay muy pocas observaciones en dos de los grupos. Nuevamente, es muy probable que estemos en la situación en la que sabemos que las variables predictoras (leche y azúcar) están relacionadas con el resultado (balbuceo), pero no sabemos si la naturaleza de esa relación es un efecto principal de un predictor, o del otro predictor o la interacción.

    Esta incertidumbre es la razón de la varianza faltante. La varianza “faltante” corresponde a la variación en la variable de resultado que es claramente atribuible a los predictores, pero no sabemos cuál de los efectos en el modelo es responsable. Al calcular la suma de cuadrados de Tipo I, nunca falta varianza: la naturaleza secuencial de la suma de cuadrados de Tipo I significa que el ANOVA atribuye automáticamente esta varianza a los efectos que se ingresen primero. Sin embargo, las pruebas Tipo II y Tipo III son más conservadoras. La varianza que no se puede atribuir claramente a un efecto específico no se le atribuye a ninguno de ellos, y desaparece.


    This page titled 16.10: ANOVA Factorial 3- Diseños Desbalanceados is shared under a CC BY-SA 4.0 license and was authored, remixed, and/or curated by Danielle Navarro via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.