Primera parte

En esta actividad se explicará brevemente cómo trabajar con datos desbalanceados usando como ejemplo un experimento en el que se evalua el porcentaje de germinacion frente a distintas dosis de un acido.

set.seed(123)

porc_ger = 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_ger)
head(datos)
##   acido porc_ger
## 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

Se trabajará un ejemplo de un diseño en el que haya datos incompletos suponiendo que por alguna razón algunos datos se perdieron

datos_des = datos[-c(50, 111, 120), ]
table(datos_des$acido)
## 
## c0 c1 c2 
## 40 39 38

Analisis de varianza balanceado

Primero se realiza el analisis de varianza con los datos balanceados

mod1 = aov(porc_ger ~ 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
mu=mean(datos$porc_ger)
boxplot(datos$porc_ger ~datos$acido)
abline(h=mu, lty=2, col="blue")

Se puede observar que todas las dosis de acido presentan diferencia en las medias, y en el dato de la dosis c1 hay presencia de un dato atipico. También se puede presenciar que la dosis c2 tiene un mayor porcentaje de germinacion.

Ahora se realizará un aov con la misma metodologia pero suponiendo que hay datos faltates (desbalanceados)

mod2 = aov(porc_ger ~ 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

En este caso se puede observar que el P valor sigue siendo <5%, por lo tanto se sigue rechazando la hipotesis de que las medias son iguales. Sin embargo, se puede notar que hay una diferencia en los datos de las sumas de cuadrados y las medias de las sumas de cuadrados.

mod3 = lm(porc_ger ~ acido, datos_des)
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
mod3_res = Anova(mod3, type = 'II')
mod3_res
## Anova Table (Type II tests)
## 
## Response: porc_ger
##           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

Para datos desvalanceados se recomienda utilizar la suma de cuadrados tipo II para ordenar los tratamientos y que no afecten los resultados del ANOVA

Segunda parte

Ahora con bloqueo

set.seed(123)

porc_ger = 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_ger)
# datos_des = datos[-c(50, 111, 120), ]
datos_des = datos[-sample(120, 5), ]

datos_des
##     acido bloq porc_ger
## 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

Se aplican bloques completos generalizados al mismo diseño desvalanceado y se realizan los mismos analisis de varianza para observar las diferencias entre el modelo balanceado y desbalanceado.

Diseño aov con diferencias en la salida de datos ya que sí se encuentran los cuadrados medios

mod1 = aov(porc_ger ~ 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_ger ~ bloq * acido, 
          datos_des)
mod2_res = Anova(mod2, type='II')
mod2_res
## Anova Table (Type II tests)
## 
## Response: porc_ger
##            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

En este caso no se presentan diferencias notorias. Sin embargo, cabe aclarar que no es factible un analisis de varianza convencional (aov)

Tercera parte

Para comprobar la existencia de diferencias se realizó una prueba de analisis en la que se utilizaron diferentes ordenes de las variables, de la siguiente manera:

#1

mod3 = lm(porc_ger ~ bloq + acido + bloq:acido, datos_des)
Anova(mod3, type = 'II')
## Anova Table (Type II tests)
## 
## Response: porc_ger
##            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

#2

mod3 = lm(porc_ger ~ acido + bloq + bloq:acido, datos_des)
Anova(mod3, type = 'II')
## Anova Table (Type II tests)
## 
## Response: porc_ger
##            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

#3

mod3 = lm(porc_ger ~ bloq:acido + acido + bloq, datos_des)
Anova(mod3, type = 'II')
## Anova Table (Type II tests)
## 
## Response: porc_ger
##            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

#4

mod3 = lm(porc_ger ~ bloq:acido + bloq + acido, datos_des)
Anova(mod3, type = 'II')
## Anova Table (Type II tests)
## 
## Response: porc_ger
##            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

Haciendo uso de la suma de cuadrados tipo II se puede notar que no hay diferencia cuando se ajustan las variables en diferentes ordenes. Esto porque la suma de cuadrados tipo II es apropiada para la construccion de modelos ANOVA y al mismo tiempo es invariante al orden en que se introducen los efectos en el modelo.

Cuarta parte

En esta seccion se ingresa la covariable del diametro medio de las semillas, el cual se puede calcular como la media geometrica asumiendo que las semillas no tienen forma circular. Se dice que es un FACTOR SIMPLE porque se trabaja con un solo factor que es la dosis de acido, BLOQUES COMPLETOS (tres bloques) GENERALIZADOS (repeticiones en los bloques) AL AZAR, DSBALANCEADO (repeticiones diferentes) y con la tecnica de ANALISIS DE COVARIANZA (covariable diametro medio)

set.seed(123)

porc_ger = 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_ger, 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

Analisis de varianza de las interacciones y las posibilidades de manejo frente a los datos faltantes.

mod1 = lm(porc_ger ~ diam_med + bloq + acido + bloq:acido, datos_des)
Anova(mod1, type = 'II')
## Anova Table (Type II tests)
## 
## Response: porc_ger
##            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

Se tiene que no existe interaccion entre bloque y acido debido a que el p valor > 5%

Por ultimo, se pueden registrar los datos como desaparecidos para que el programa imposibilite el analisis al considerar los datos como no existentes, sin obviarlos

set.seed(123)

porc_ger = 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_ger, diam_med)

datos_des = datos
datos_des[sample(120, 5), 'porc_ger'] = 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_ger,
       datos_des$acido,
       mean)
##       c0       c1       c2       c3 
## 70.96384       NA       NA       NA

Cuando se tiene el problema de desbalanceo por datos faltantes se realiza una imputacion de datos para reemplazar los valores perdidos y asi convertirlo en un modelo balanceado.

tapply(datos_des$porc_ger, 
       datos_des$acido, 
       mean, na.rm=TRUE)
##       c0       c1       c2       c3 
## 70.96384 72.04659 68.44023 69.07068

Referencias