Introducción

En este documento, exploraremos el diseño completamente al azar, el cual es el diseño experimental más simple y proporciona el máximo número de grados de libertad para el error.

Características

  • Maneja una sola fuente de variación.
  • Tiene más grados de libertad en el error que otros diseños.
  • Requiere que las unidades experimentales sean homogéneas.
  • La asignación a los tratamientos se realiza al azar.

Instalación y Carga de Librerías

Instalaremos tidyverse debido a recientes actualizaciones en el paquete ggplot2.

# install.packages("tidyverse")
library(tidyverse)

Caso de Estudio: Telas para Camisa de Caballero

Un ingeniero de desarrollo está interesado en la resistencia a la tensión de una nueva fibra sintética para camisas de caballero. Se sabe que la calidad de la tela se afecta por la composición de algodón, variando entre 10% y 40%. Se decide probar cinco niveles de algodón (15%, 20%, 25%, 30% y 35%) con 5 replicaciones por nivel.

A continuación, elaboramos la tabla de datos directamente en R.

# Datos de resistencia por porcentaje de algodón
Resistencia <- c(7, 7, 15, 11, 9, 12, 17, 12, 18, 18, 14, 18, 18, 19, 19, 19, 25, 22, 19, 23, 7, 10, 11, 15, 11)

# Asignación de porcentajes como factor
Porcentaje <- factor(rep(c("15%", "20%", "25%", "30%", "35%"), each = 5))

# Creación del data frame
Datos <- data.frame(Porcentaje, Resistencia)

Exportación de Datos

Guardamos los datos en formato CSV para su uso externo.

write.csv(Datos, "exp_algodon.csv", row.names = FALSE)

Limpieza del Entorno y Carga de Datos

Limpiamos el entorno y cargamos el archivo generado previamente.

rm(list = ls())
library(readr)
library(tidyverse)
Datos <- read_csv("exp_algodon.csv")
## Rows: 25 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Porcentaje
## dbl (1): Resistencia
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Analisis exploratorio de datos

Generamos una tabla con promedios, desviación estándar, error estándar y límites de confianza.

# Calculamos estadísticas descriptivas por porcentaje
estadisticas <- Datos %>%
  group_by(Porcentaje) %>%
  summarise(
    Promedio = mean(Resistencia, na.rm = TRUE),
    DE = sd(Resistencia, na.rm = TRUE),
    n = n(),
    Error = DE/sqrt(n),
    Li = Promedio - Error,
    Ls = Promedio + Error
  )

# Mostramos la tabla de estadísticas
estadisticas
## # A tibble: 5 × 7
##   Porcentaje Promedio    DE     n Error    Li    Ls
##   <chr>         <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1 15%             9.8  3.35     5 1.50   8.30  11.3
## 2 20%            15.4  3.13     5 1.4   14     16.8
## 3 25%            17.6  2.07     5 0.927 16.7   18.5
## 4 30%            21.6  2.61     5 1.17  20.4   22.8
## 5 35%            10.8  2.86     5 1.28   9.52  12.1

Generación de Gráficos

Gráfico de Error Estándar con ggplo2

Usamos gráficos de base para visualizar la variabilidad entre los tratamientos.

estadisticas %>%
  ggplot(aes(x = Porcentaje, y = Promedio, col = Porcentaje)) +
  geom_point(size = 3, shape = 21, fill = "black") +
  geom_errorbar(aes(ymin = Li, ymax = Ls), width = 0.2) +
  theme_minimal() +
  labs(x = "Porcentaje de Algodón", y = "Resistencia", title = "Error Estándar de la Resistencia")

Gráfico de violín

ggplot(Datos, aes(x = Porcentaje, y = Resistencia, fill = Porcentaje)) +
  geom_violin(trim = FALSE) +
  geom_boxplot(width = 0.1, fill = "white") +
  theme_minimal() +
  labs(title = "Gráfico de Violín de Resistencia por Porcentaje de Algodón")

Histograma + Densidad Global

ggplot(Datos, aes(x = Resistencia)) +
  geom_histogram(aes(y = ..density..), bins = 10, fill = "skyblue", color = "black") +
  geom_density(color = "red", size = 1) +
  theme_minimal() +
  labs(title = "Histograma y Curva de Densidad de Resistencia")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Modelado Bajo un Diseño Completamente al Azar

Realizamos un ANOVA para evaluar los efectos del porcentaje de algodón en la resistencia.

library(agricolae)
#data(package = "agricolae")
#data("corn")
#?corn
# convertir factor los tratamientos
Datos$Porcentaje <- as.factor(Datos$Porcentaje)

anova_telas <- aov(Resistencia ~ Porcentaje, data = Datos)
summary(anova_telas)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Porcentaje   4  475.8  118.94   14.76 9.13e-06 ***
## Residuals   20  161.2    8.06                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

F tabulado

qf(0.05, df1 = 4, df2 = 20, lower.tail = F)
## [1] 2.866081
# Ft = 2.866081
# Fc = 14.76

Prueba de duncan

Aplicamos la prueba de Duncan para comparar las medias de los grupos.

compara_duncan <- duncan.test(anova_telas, "Porcentaje")
compara_duncan$groups
##     Resistencia groups
## 30%        21.6      a
## 25%        17.6      b
## 20%        15.4      b
## 35%        10.8      c
## 15%         9.8      c

Grafica de medias con Agrupación de Duncan

bar.group(compara_duncan$groups, ylim = c(0, max(compara_duncan$groups$Resistencia) * 1.4))

grupos_duncan <- compara_duncan$groups
grupos_duncan$Porcentaje <- rownames(grupos_duncan)
rownames(grupos_duncan) <- NULL

Grafico de barras usando ggplot2

ggplot(grupos_duncan, aes(x = Porcentaje, y = Resistencia)) +
  geom_col(fill = "lightblue", col = "black") +
  geom_text(aes(label = groups), vjust = -0.5, size = 5, fontface = "bold") +
  theme_minimal() +
  labs(title = "Comparación de Medias - Prueba de Duncan",
       x = "Porcentaje de Algodón", y = "Resistencia") +
  ylim(0, max(grupos_duncan$Resistencia) * 1.2)