Analisis de varianza balanceado

Se realiza un analisis de varianza de un caso donde la respuesta es el porcentaje(%) de germinacion y el factor es la calificacion de la semilla, en este caso con los datos balanceados.

set.seed(123)

porc_germ = c(
  rnorm(40, 60, 6),
  rnorm(40, 70, 7),
  rnorm(40, 80, 8))

acido = gl(3, 40, 120, c('C0','C1','C2'))

datos = data.frame(acido, porc_germ)
head(datos)
##   acido porc_germ
## 1    C0  56.63715
## 2    C0  58.61894
## 3    C0  69.35225
## 4    C0  60.42305
## 5    C0  60.77573
## 6    C0  70.29039
table(datos$acido)
## 
## C0 C1 C2 
## 40 40 40

Analisis de varianza balanceado

mod1 = aov(porc_germ ~ acido, datos)
summary(mod1)
##              Df Sum Sq Mean Sq F value Pr(>F)    
## acido         2   7835    3918   98.15 <2e-16 ***
## Residuals   117   4670      40                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Al realizar el analisis de varianza con los datos balanceados obtenemos un p-valor< 5% por lo tanto significa que la germinacion no es la misma en todas las concentraciones

boxplot(datos$porc_germ ~ datos$acido)

Analisis de varianza desbalanceado

set.seed(123)

porc_germ = c(
  rnorm(40, 60, 6),
  rnorm(40, 70, 7),
  rnorm(40, 80, 8))

acido = gl(3, 40, 120, c('C0','C1','C2'))

datos = data.frame(acido, porc_germ)
head(datos)
##   acido porc_germ
## 1    C0  56.63715
## 2    C0  58.61894
## 3    C0  69.35225
## 4    C0  60.42305
## 5    C0  60.77573
## 6    C0  70.29039
table(datos$acido)
## 
## C0 C1 C2 
## 40 40 40
datos_des = datos[-c(50, 111, 120), ]
table(datos_des$acido)
## 
## C0 C1 C2 
## 40 39 38

\[H_0=\mu*_{g1} = \mu*_{g2} = \mu*_{g3}\] \[H_0\neq\mu*_{g1} \neq \mu*_{g2}\neq \mu*_{g3}\]

Se desbalancearon los datos quitando diferentes valores y se generan las hipotesis (se coloca en asterisco para dar a entender que los datos se encuentran desbalanceados)

mod2 = aov(porc_germ ~ acido, datos_des)
summary(mod2)
##              Df Sum Sq Mean Sq F value Pr(>F)    
## acido         2   7898    3949   98.39 <2e-16 ***
## Residuals   114   4576      40                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Se realiza el analisis de varianza con los datos desbalanceados donde encontramos un p-valor igual a cuando se tenian los datos balanceados, sin embargo este no es el tratamiento correcto para analizar la varianza con datos desbalanceados.

Para analizar correctamente los datos desbalanceados se usa la libreria ‘car’ que permite realizar un analisis ANOVA de diferentes tipos, en este caso se uso el tipo II, este tipo II permite ajustar y trabajar con los datos desbalanceados, no se uso el tipo III ya que Oyvind Langsrud en su articulo “ANOVA for Unbalanced Data Use Type II Instead of Type III Sums of Square” (2003) propone que este tipo III se basa en modelos poco realistas por lo cual es preferible usar el tipo II que es el metodo de ajuste de constantes de Yates.

Link del articulo: https://www.researchgate.net/publication/220286726_ANOVA_for_unbalanced_data_Use_type_II_instead_of_type_III_sums_of_squares.

mod3 = lm(porc_germ ~ acido, datos_des)
library(car)
## Loading required package: carData
mod3_res = Anova(mod3, type = 'II')
mod3_res
## Anova Table (Type II tests)
## 
## Response: porc_germ
##           Sum Sq  Df F value    Pr(>F)    
## acido     7898.3   2  98.392 < 2.2e-16 ***
## Residuals 4575.6 114                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Con bloqueo

Ahora se realiza el analisis pero con bloques para encontrar diferencias

set.seed(123)

porc_germ = c(
  rnorm(40, 60, 6),
  rnorm(40, 70, 7),
  rnorm(40, 80, 8))

bloq = gl(3, 40, 120, c('B0','B1','B2'))
acido = gl(4, 10, 120, c('C0','C1','C2','C3'))

datos = data.frame(acido, bloq, porc_germ)
# datos_des = datos[-c(50, 111, 120), ]
datos_des = datos[-sample(120, 5), ]
datos_des
##     acido bloq porc_germ
## 1      C0   B0  56.63715
## 2      C0   B0  58.61894
## 3      C0   B0  69.35225
## 4      C0   B0  60.42305
## 5      C0   B0  60.77573
## 6      C0   B0  70.29039
## 7      C0   B0  62.76550
## 8      C0   B0  52.40963
## 9      C0   B0  55.87888
## 10     C0   B0  57.32603
## 11     C1   B0  67.34449
## 12     C1   B0  62.15888
## 13     C1   B0  62.40463
## 15     C1   B0  56.66495
## 17     C1   B0  62.98710
## 18     C1   B0  48.20030
## 19     C1   B0  64.20814
## 20     C1   B0  57.16325
## 21     C2   B0  53.59306
## 22     C2   B0  58.69215
## 23     C2   B0  53.84397
## 24     C2   B0  55.62665
## 25     C2   B0  56.24976
## 26     C2   B0  49.87984
## 27     C2   B0  65.02672
## 28     C2   B0  60.92024
## 29     C2   B0  53.17118
## 30     C2   B0  67.52289
## 31     C3   B0  62.55879
## 32     C3   B0  58.22957
## 34     C3   B0  65.26880
## 35     C3   B0  64.92949
## 36     C3   B0  64.13184
## 37     C3   B0  63.32351
## 38     C3   B0  59.62853
## 39     C3   B0  58.16422
## 40     C3   B0  57.71717
## 41     C0   B1  65.13705
## 42     C0   B1  68.54458
## 43     C0   B1  61.14223
## 44     C0   B1  85.18269
## 45     C0   B1  78.45573
## 46     C0   B1  62.13824
## 47     C0   B1  67.17981
## 48     C0   B1  66.73341
## 49     C0   B1  75.45976
## 50     C0   B1  69.41642
## 51     C1   B1  71.77323
## 52     C1   B1  69.80017
## 53     C1   B1  69.69991
## 54     C1   B1  79.58022
## 55     C1   B1  68.41960
## 56     C1   B1  80.61529
## 57     C1   B1  59.15873
## 58     C1   B1  74.09230
## 59     C1   B1  70.86698
## 60     C1   B1  71.51159
## 61     C2   B1  72.65748
## 62     C2   B1  66.48374
## 63     C2   B1  67.66755
## 64     C2   B1  62.86997
## 65     C2   B1  62.49746
## 66     C2   B1  72.12470
## 67     C2   B1  73.13747
## 68     C2   B1  70.37103
## 69     C2   B1  76.45587
## 70     C2   B1  84.35059
## 71     C3   B1  66.56278
## 72     C3   B1  53.83582
## 73     C3   B1  77.04017
## 74     C3   B1  65.03559
## 75     C3   B1  65.18394
## 76     C3   B1  77.17900
## 77     C3   B1  68.00659
## 78     C3   B1  61.45498
## 79     C3   B1  71.26912
## 80     C3   B1  69.02776
## 81     C0   B2  80.04611
## 82     C0   B2  83.08224
## 83     C0   B2  77.03472
## 84     C0   B2  85.15501
## 85     C0   B2  78.23611
## 86     C0   B2  82.65426
## 88     C0   B2  83.48145
## 89     C0   B2  77.39255
## 90     C0   B2  89.19046
## 91     C1   B2  87.94803
## 92     C1   B2  84.38718
## 93     C1   B2  81.90985
## 94     C1   B2  74.97675
## 95     C1   B2  90.88522
## 96     C1   B2  75.19792
## 97     C1   B2  97.49866
## 98     C1   B2  92.26089
## 99     C1   B2  78.11440
## 100    C1   B2  71.78863
## 101    C2   B2  74.31675
## 102    C2   B2  82.05507
## 103    C2   B2  78.02646
## 104    C2   B2  77.21966
## 105    C2   B2  72.38705
## 106    C2   B2  79.63978
## 107    C2   B2  73.72076
## 108    C2   B2  66.65646
## 109    C2   B2  76.95819
## 110    C2   B2  87.35197
## 111    C3   B2  75.39722
## 112    C3   B2  84.86371
## 113    C3   B2  67.05694
## 114    C3   B2  79.55550
## 115    C3   B2  84.15526
## 116    C3   B2  82.40923
## 118    C3   B2  74.87435
## 119    C3   B2  73.20237
## 120    C3   B2  71.80697
table(datos_des$bloq, datos_des$acido)
##     
##      C0 C1 C2 C3
##   B0 10  8 10  9
##   B1 10 10 10 10
##   B2  9 10 10  9
mod1 = aov(porc_germ ~ bloq * acido,
           datos_des)
summary(mod1)
##              Df Sum Sq Mean Sq F value Pr(>F)    
## bloq          2   7478    3739  97.858 <2e-16 ***
## acido         3    238      79   2.073  0.108    
## bloq:acido    6    276      46   1.203  0.311    
## Residuals   103   3936      38                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
mod2 = lm(porc_germ ~ bloq * acido,
          datos_des)
mod2_res = Anova(mod2, type='II')
mod2_res
## Anova Table (Type II tests)
## 
## Response: porc_germ
##            Sum Sq  Df F value Pr(>F)    
## bloq       7399.0   2 96.8208 <2e-16 ***
## acido       237.7   3  2.0734 0.1083    
## bloq:acido  275.8   6  1.2030 0.3108    
## Residuals  3935.6 103                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Primero se revisan las interacciones entre los factores y se determina gracias al p-valor que no hay interaccion entre ellos, por consiguiente se revisan los factores y estos tienen p-valor <5% lo que nos indica que no hay efecto del factor sobre el porcentaje de germinacion.

Ajustando desbalanceado con diferente orden

Ahora se colocaran los datos en diferente orden para buscar diferencias

mod3 = lm(porc_germ ~ bloq + acido + bloq:acido, datos_des)
Anova(mod3, type='II')
## Anova Table (Type II tests)
## 
## Response: porc_germ
##            Sum Sq  Df F value Pr(>F)    
## bloq       7399.0   2 96.8208 <2e-16 ***
## acido       237.7   3  2.0734 0.1083    
## bloq:acido  275.8   6  1.2030 0.3108    
## Residuals  3935.6 103                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
mod3 = lm(porc_germ ~ acido + bloq + bloq:acido, datos_des)
Anova(mod3, type='II')
## Anova Table (Type II tests)
## 
## Response: porc_germ
##            Sum Sq  Df F value Pr(>F)    
## acido       237.7   3  2.0734 0.1083    
## bloq       7399.0   2 96.8208 <2e-16 ***
## acido:bloq  275.8   6  1.2030 0.3108    
## Residuals  3935.6 103                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
mod3 = lm(porc_germ ~ bloq:acido + acido + bloq, datos_des)
Anova(mod3, type='II')
## Anova Table (Type II tests)
## 
## Response: porc_germ
##            Sum Sq  Df F value Pr(>F)    
## acido       237.7   3  2.0734 0.1083    
## bloq       7399.0   2 96.8208 <2e-16 ***
## bloq:acido  275.8   6  1.2030 0.3108    
## Residuals  3935.6 103                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
mod3 = lm(porc_germ ~ bloq:acido + bloq + acido, datos_des)
Anova(mod3, type='II')
## Anova Table (Type II tests)
## 
## Response: porc_germ
##            Sum Sq  Df F value Pr(>F)    
## bloq       7399.0   2 96.8208 <2e-16 ***
## acido       237.7   3  2.0734 0.1083    
## bloq:acido  275.8   6  1.2030 0.3108    
## Residuals  3935.6 103                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Al revisar no se observan diferencias al cambiar el orden de los datos ya que este analisis tipo II se encarga de ajustar los datos y ajusta la suma de cuadrados.

Con covariable

Diseño Factorial Simple en Bloques Completos Generalizados y al Azar, Desbalanceado y con la tecnica Analsis de Covarianza

En este caso se agrego una covariable llamada diametro medio y se borraron otros datos para generar mas desbalanceo

set.seed(123)

porc_germ = c(
  rnorm(40, 60, 6),
  rnorm(40, 70, 7),
  rnorm(40, 80, 8))

diam_med = sort(rnorm(120, 12, 1.3))

bloq = gl(3, 40, 120, c('B0','B1','B2'))
acido = gl(4, 10, 120, c('C0','C1','C2','C3'))

datos = data.frame(acido, bloq,
                   porc_germ, diam_med)
datos_des = datos[-sample(120, 5), ]

table(datos_des$bloq, datos_des$acido)
##     
##      C0 C1 C2 C3
##   B0 10  9  9 10
##   B1 10 10  9  9
##   B2 10  9 10 10
mod1 = lm(porc_germ ~ diam_med + bloq + acido +
            bloq:acido,
          datos_des)
Anova(mod1, type='II')
## Anova Table (Type II tests)
## 
## Response: porc_germ
##            Sum Sq  Df F value    Pr(>F)    
## diam_med      6.0   1  0.1574    0.6924    
## bloq       1069.4   2 14.0706 4.013e-06 ***
## acido       151.8   3  1.3315    0.2683    
## bloq:acido  235.4   6  1.0325    0.4087    
## Residuals  3876.1 102                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

En este caso revisamos si hay interaccion entre factor y bloqueo, gracias a su p-valor determinamos que no hay interaccion por consiguiente revisamos los demas factores y encontramos que el acido tiene un p-valor >5% esto indica que no hubo efecto del factor sobre el porcentaje(%) de germinacion. Tambien se revisa el p-valor del bloque y nos damos cuenta que fue acorde bloquear y tambien miramos el p-valor de el diametro medio y encontramos que no hay relacion entre el diametro medio de la semilla y el porcentaje(%) de germinacion.

set.seed(123)

porc_germ = c(
  rnorm(40, 60, 6),
  rnorm(40, 70, 7),
  rnorm(40, 80, 8)
)
diam_med = sort(rnorm(120, 12, 1.3))

bloq = gl(3, 40, 120, c('B0','B1','B2'))
acido = gl(4, 10, 120, c('C0','C1','C2','C3'))

datos = data.frame(acido, bloq,
                   porc_germ, diam_med)
datos_des = datos
datos_des[sample(120, 5), 'porc_germ'] = NA

table(datos_des$bloq, datos_des$acido)
##     
##      C0 C1 C2 C3
##   B0 10 10 10 10
##   B1 10 10 10 10
##   B2 10 10 10 10
tapply(datos_des$porc_germ,
       datos_des$acido,
       mean, na.rm=TRUE)
##       C0       C1       C2       C3 
## 70.96384 72.04659 68.44023 69.07068