Instalar paquetes y sus dependencias ——————

Crear un vector de paquetes

pacotes <- c("agricolae", "performance", "ggplot2",
             "outliers","car", "readxl","tidyverse", 
             "RColorBrewer","nortest", "stats", 
             "agridat", "performance")

Script para instalar y cargar librerias y dependencias

if(sum(as.numeric(!pacotes %in% installed.packages())) != 0){
  instalador <- pacotes[!pacotes %in% installed.packages()]
  for(i in 1:length(instalador)) {
    install.packages(instalador, dependencies = T)
    break()}
  sapply(pacotes, require, character = T) 
} else {
  sapply(pacotes, require, character = T) 
}
## Loading required package: agricolae
## Loading required package: performance
## Loading required package: ggplot2
## Loading required package: outliers
## Loading required package: car
## Loading required package: carData
## Loading required package: readxl
## Loading required package: tidyverse
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.3     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ dplyr::recode() masks car::recode()
## ✖ purrr::some()   masks car::some()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## Loading required package: RColorBrewer
## 
## Loading required package: nortest
## 
## Loading required package: agridat
## Warning: package 'agridat' was built under R version 4.3.2
##    agricolae  performance      ggplot2     outliers          car       readxl 
##         TRUE         TRUE         TRUE         TRUE         TRUE         TRUE 
##    tidyverse RColorBrewer      nortest        stats      agridat  performance 
##         TRUE         TRUE         TRUE         TRUE         TRUE         TRUE

Datos

df <- read_excel("C:/Users/PC/Desktop/Ing Agronomica/semestre 9/Software R/Clase 5/ANOVA DCA y DBCA con 2 Factores/ANOVA DCA y DBCA con 2 Factores/APLICACION DRON.xlsx")
str(df)
## tibble [32 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Aplicación: chr [1:32] "Dron" "Dron" "Dron" "Dron" ...
##  $ DosisN    : chr [1:32] "Control" "Ridomil_2cc" "Ridomil_4cc" "Ridomil_6cc" ...
##  $ Rep       : num [1:32] 1 1 1 1 2 2 2 2 3 3 ...
##  $ Lulos     : num [1:32] 8.2 14.3 18.2 21.6 9.3 10.3 18.2 22.1 5.2 12.5 ...
df
## # A tibble: 32 × 4
##    Aplicación DosisN        Rep Lulos
##    <chr>      <chr>       <dbl> <dbl>
##  1 Dron       Control         1   8.2
##  2 Dron       Ridomil_2cc     1  14.3
##  3 Dron       Ridomil_4cc     1  18.2
##  4 Dron       Ridomil_6cc     1  21.6
##  5 Dron       Control         2   9.3
##  6 Dron       Ridomil_2cc     2  10.3
##  7 Dron       Ridomil_4cc     2  18.2
##  8 Dron       Ridomil_6cc     2  22.1
##  9 Dron       Control         3   5.2
## 10 Dron       Ridomil_2cc     3  12.5
## # ℹ 22 more rows

Verificar Valores atípicos

df%>%
  select_if(is.numeric)%>%
  outlier()
##   Rep Lulos 
##   4.0   4.8

ANOVA bifactorial para un DCA ———-

Realizar el análisis de varianza (ANOVA)

modelo_anova <- aov(Lulos ~ DosisN + Aplicación + DosisN:Aplicación, 
                    data = df)
summary(modelo_anova)
##                   Df Sum Sq Mean Sq F value   Pr(>F)    
## DosisN             3 1001.2   333.7 114.257 2.41e-14 ***
## Aplicación         1   11.3    11.3   3.862   0.0611 .  
## DosisN:Aplicación  3    2.3     0.8   0.267   0.8482    
## Residuals         24   70.1     2.9                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Verificar Normalidad mediante prueba de Shapiro

shapiro.test(residuals(modelo_anova))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modelo_anova)
## W = 0.98001, p-value = 0.8

Homogeneidad de varianzas ——————-

Calcular los residuos del modelo ANOVA

residuos <- residuals(modelo_anova)

Agrupar los residuos por los niveles de las interacciones

grupo <- paste(df$DosisN, df$Lulos, sep = "_")
grupos_residuos <- split(residuos, grupo)

Realizar la prueba de homogeneidad de varianzas con fligner.test

fligner.test(grupos_residuos)
## 
##  Fligner-Killeen test of homogeneity of variances
## 
## data:  grupos_residuos
## Fligner-Killeen:med chi-squared = 23.137, df = 26, p-value = 0.6252

Gráfico

residuos_estandarizados <- rstandard(modelo_anova)

Obtener los valores ajustados (fitted values)

valores_ajustados <- fitted(modelo_anova)

Crear un gráfico de residuos estandarizados vs. valores ajustados

plot(valores_ajustados, residuos_estandarizados, pch = 11    , 
     col = "blue",
     xlab = "Valores Ajustados", ylab = "Residuos Estandarizados",
     main = "Gráfico de Residuos Est. vs. Valores Ajustados")

plot(valores_ajustados, residuos_estandarizados, pch = 11    , 
     col = "blue",
     xlab = "Valores Ajustados", ylab = "Residuos Estandarizados",
     main = "Gráfico de Residuos Est. vs. Valores Ajustados")
abline(h = 0, lty = 2, col = "red")  

Otra forma de verificar los supuestos:

plot(modelo_anova)

check_model(modelo_anova)

Obtener lsmeans (medias ajustadas) para la interacción

EVALUAR LOS EFECTOS SIMPLES COMO “DosisN”

LSD.test(modelo_anova,c("DosisN"),
         console=TRUE)
## 
## Study: modelo_anova ~ c("DosisN")
## 
## LSD t Test for Lulos 
## 
## Mean Square Error:  2.921042 
## 
## DosisN,  means and individual ( 95 %) CI
## 
##              Lulos      std r        se       LCL       UCL  Min  Max    Q25
## Control      6.500 1.789653 8 0.6042601  5.252869  7.747131  4.8  9.3  5.200
## Ridomil_2cc 12.300 2.383275 8 0.6042601 11.052869 13.547131  8.3 16.1 11.200
## Ridomil_4cc 18.025 1.023649 8 0.6042601 16.777869 19.272131 16.2 19.2 17.425
## Ridomil_6cc 21.125 1.425031 8 0.6042601 19.877869 22.372131 18.7 23.1 20.375
##               Q50    Q75
## Control      5.50  8.225
## Ridomil_2cc 12.40 13.400
## Ridomil_4cc 18.20 18.675
## Ridomil_6cc 21.35 22.100
## 
## Alpha: 0.05 ; DF Error: 24
## Critical Value of t: 2.063899 
## 
## least Significant Difference: 1.76371 
## 
## Treatments with the same letter are not significantly different.
## 
##              Lulos groups
## Ridomil_6cc 21.125      a
## Ridomil_4cc 18.025      b
## Ridomil_2cc 12.300      c
## Control      6.500      d

EVALUAR LOS EFECTOS SIMPLES COMO Lulos

LSD.test(modelo_anova,c("Lulos"),
         console=TRUE)
## 
## Study: modelo_anova ~ c("Lulos")
## 
## LSD t Test for Lulos 
## 
## Mean Square Error:  2.921042 
## 
## Lulos,  means and individual ( 95 %) CI
## 
##      Lulos std r        se       LCL       UCL  Min  Max  Q25  Q50  Q75
## 4.8    4.8  NA 1 1.7091055  1.272580  8.327420  4.8  4.8  4.8  4.8  4.8
## 5.2    5.2   0 3 0.9867525  3.163443  7.236557  5.2  5.2  5.2  5.2  5.2
## 5.8    5.8  NA 1 1.7091055  2.272580  9.327420  5.8  5.8  5.8  5.8  5.8
## 8.2    8.2  NA 1 1.7091055  4.672580 11.727420  8.2  8.2  8.2  8.2  8.2
## 8.3    8.3   0 2 1.2085201  5.805737 10.794263  8.3  8.3  8.3  8.3  8.3
## 9.3    9.3  NA 1 1.7091055  5.772580 12.827420  9.3  9.3  9.3  9.3  9.3
## 10.3  10.3  NA 1 1.7091055  6.772580 13.827420 10.3 10.3 10.3 10.3 10.3
## 11.5  11.5  NA 1 1.7091055  7.972580 15.027420 11.5 11.5 11.5 11.5 11.5
## 12.3  12.3  NA 1 1.7091055  8.772580 15.827420 12.3 12.3 12.3 12.3 12.3
## 12.5  12.5  NA 1 1.7091055  8.972580 16.027420 12.5 12.5 12.5 12.5 12.5
## 13.1  13.1  NA 1 1.7091055  9.572580 16.627420 13.1 13.1 13.1 13.1 13.1
## 14.3  14.3  NA 1 1.7091055 10.772580 17.827420 14.3 14.3 14.3 14.3 14.3
## 16.1  16.1  NA 1 1.7091055 12.572580 19.627420 16.1 16.1 16.1 16.1 16.1
## 16.2  16.2  NA 1 1.7091055 12.672580 19.727420 16.2 16.2 16.2 16.2 16.2
## 17.2  17.2  NA 1 1.7091055 13.672580 20.727420 17.2 17.2 17.2 17.2 17.2
## 17.5  17.5  NA 1 1.7091055 13.972580 21.027420 17.5 17.5 17.5 17.5 17.5
## 18.2  18.2   0 2 1.2085201 15.705737 20.694263 18.2 18.2 18.2 18.2 18.2
## 18.5  18.5  NA 1 1.7091055 14.972580 22.027420 18.5 18.5 18.5 18.5 18.5
## 18.7  18.7  NA 1 1.7091055 15.172580 22.227420 18.7 18.7 18.7 18.7 18.7
## 19.2  19.2   0 2 1.2085201 16.705737 21.694263 19.2 19.2 19.2 19.2 19.2
## 19.7  19.7  NA 1 1.7091055 16.172580 23.227420 19.7 19.7 19.7 19.7 19.7
## 20.6  20.6  NA 1 1.7091055 17.072580 24.127420 20.6 20.6 20.6 20.6 20.6
## 21.1  21.1  NA 1 1.7091055 17.572580 24.627420 21.1 21.1 21.1 21.1 21.1
## 21.6  21.6  NA 1 1.7091055 18.072580 25.127420 21.6 21.6 21.6 21.6 21.6
## 22.1  22.1   0 2 1.2085201 19.605737 24.594263 22.1 22.1 22.1 22.1 22.1
## 23.1  23.1  NA 1 1.7091055 19.572580 26.627420 23.1 23.1 23.1 23.1 23.1
## 
## Alpha: 0.05 ; DF Error: 24
## Critical Value of t: 2.063899 
## 
## Groups according to probability of means differences and alpha level( 0.05 )
## 
## Treatments with the same letter are not significantly different.
## 
##      Lulos groups
## 23.1  23.1      a
## 22.1  22.1      a
## 21.6  21.6     ab
## 21.1  21.1    abc
## 20.6  20.6   abcd
## 19.7  19.7   abcd
## 19.2  19.2   abcd
## 18.7  18.7  abcde
## 18.5  18.5  abcde
## 18.2  18.2   bcde
## 17.5  17.5  bcdef
## 17.2  17.2 bcdefg
## 16.2  16.2 cdefgh
## 16.1  16.1  defgh
## 14.3  14.3  efghi
## 13.1  13.1  fghij
## 12.5  12.5  ghijk
## 12.3  12.3  ghijk
## 11.5  11.5   hijk
## 10.3  10.3   ijkl
## 9.3    9.3    jkl
## 8.3    8.3    klm
## 8.2    8.2    klm
## 5.8    5.8     lm
## 5.2    5.2      m
## 4.8    4.8      m

EVALUAR LOS EFECTOS COMPUESTOS PORQUE DIERON DIF. SIGNIF.EN LA INTERACCIÓN

resultados_lsd<-LSD.test(modelo_anova,c("DosisN","Aplicación"),
                         console=T)
## 
## Study: modelo_anova ~ c("DosisN", "Aplicación")
## 
## LSD t Test for Lulos 
## 
## Mean Square Error:  2.921042 
## 
## DosisN:Aplicación,  means and individual ( 95 %) CI
## 
##                           Lulos       std r        se      LCL      UCL  Min
## Control:BombaEspalda      5.875 1.6276261 4 0.8545528  4.11129  7.63871  4.8
## Control:Dron              7.125 1.9448650 4 0.8545528  5.36129  8.88871  5.2
## Ridomil_2cc:BombaEspalda 11.300 2.1039645 4 0.8545528  9.53629 13.06371  8.3
## Ridomil_2cc:Dron         13.300 2.4819347 4 0.8545528 11.53629 15.06371 10.3
## Ridomil_4cc:BombaEspalda 17.775 1.3375973 4 0.8545528 16.01129 19.53871 16.2
## Ridomil_4cc:Dron         18.275 0.6994045 4 0.8545528 16.51129 20.03871 17.5
## Ridomil_6cc:BombaEspalda 20.625 1.4268263 4 0.8545528 18.86129 22.38871 18.7
## Ridomil_6cc:Dron         21.625 1.4268263 4 0.8545528 19.86129 23.38871 19.7
##                           Max    Q25   Q50    Q75
## Control:BombaEspalda      8.3  5.100  5.20  5.975
## Control:Dron              9.3  5.650  7.00  8.475
## Ridomil_2cc:BombaEspalda 13.1 10.700 11.90 12.500
## Ridomil_2cc:Dron         16.1 11.950 13.40 14.750
## Ridomil_4cc:BombaEspalda 19.2 16.950 17.85 18.675
## Ridomil_4cc:Dron         19.2 18.025 18.20 18.450
## Ridomil_6cc:BombaEspalda 22.1 20.125 20.85 21.350
## Ridomil_6cc:Dron         23.1 21.125 21.85 22.350
## 
## Alpha: 0.05 ; DF Error: 24
## Critical Value of t: 2.063899 
## 
## least Significant Difference: 2.494263 
## 
## Treatments with the same letter are not significantly different.
## 
##                           Lulos groups
## Ridomil_6cc:Dron         21.625      a
## Ridomil_6cc:BombaEspalda 20.625     ab
## Ridomil_4cc:Dron         18.275     bc
## Ridomil_4cc:BombaEspalda 17.775      c
## Ridomil_2cc:Dron         13.300      d
## Ridomil_2cc:BombaEspalda 11.300      d
## Control:Dron              7.125      e
## Control:BombaEspalda      5.875      e

Crear un data frame con los resultados de la prueba LSD

resultados_lsd_df <- data.frame(
  DosisN_Aplicación = rownames(resultados_lsd$groups),
  Lulos = resultados_lsd$groups$Lulos,
  groups = resultados_lsd$groups$groups
)

Separar la columna DosisN_Aplicación en DosisN y Aplicación

resultados_lsd_df <- separate(resultados_lsd_df, 
                              DosisN_Aplicación, into = c("DosisN", "Aplicación"), 
                              sep = ":")

resultados_lsd_df$DosisN<-
  factor(resultados_lsd_df$DosisN, 
         levels = c("Ridomil_6cc",
                    "Ridomil_4cc", "Ridomil_2cc", "Control"))
resultados_lsd_df
##        DosisN   Aplicación  Lulos groups
## 1 Ridomil_6cc         Dron 21.625      a
## 2 Ridomil_6cc BombaEspalda 20.625     ab
## 3 Ridomil_4cc         Dron 18.275     bc
## 4 Ridomil_4cc BombaEspalda 17.775      c
## 5 Ridomil_2cc         Dron 13.300      d
## 6 Ridomil_2cc BombaEspalda 11.300      d
## 7     Control         Dron  7.125      e
## 8     Control BombaEspalda  5.875      e

Crear un gráfico de barras agrupadas

library(ggplot2)

ggplot(resultados_lsd_df, aes(x = DosisN, y = Lulos, fill = Aplicación, label = groups)) +
  geom_bar(position = "dodge", stat = "identity") +
  labs(title = "Comparación de Medias Significativas",
       x = "Dosis", y = "Lulos/Planta") +
  scale_fill_manual(values = c("Dron" = "blue", "BombaEspalda" = "green")) +
  theme_minimal() +
  theme(legend.position = "top")

Visualizar todas las paletas disponibles

display.brewer.all()

Crear un gráfico de barras agrupadas con paleta pastel

ggplot(resultados_lsd_df, aes(x = DosisN, y = Lulos, fill = Aplicación, label = groups)) +
  geom_bar(position = "dodge", stat = "identity") +
  labs(title = "Comparación de Medias Significativas",
       x = "Dosis N", y = "Lulos/planta") +
  scale_fill_brewer(palette = "Blues") +  
  theme_minimal() +
  theme(legend.position = "top")

Colocando los nombres

Crear un gráfico de barras agrupadas con paleta pastel

Aumentar el tamaño de letra

library(ggplot2)
ggplot(resultados_lsd_df, aes(x = DosisN, y = Lulos, fill = Aplicación, label = groups)) +
  geom_bar(position = "dodge", stat = "identity") +
  geom_text(position = position_dodge(width = 0.9),    
            vjust = -0.5,                              
            aes(group = Aplicación),                      
            size = 4) +                                
  labs(title = "Comparación de Medias Significativas",
       x = "Dosis N", y = "Lulos/planta") +
  scale_fill_brewer(palette = "Blues") +  
  theme_minimal() +
  theme(legend.position = "top")