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
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
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)
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.
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