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)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

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)

Visualizacion de la data

print(Datos)
##    Porcentaje Resistencia
## 1         15%           7
## 2         15%           7
## 3         15%          15
## 4         15%          11
## 5         15%           9
## 6         20%          12
## 7         20%          17
## 8         20%          12
## 9         20%          18
## 10        20%          18
## 11        25%          14
## 12        25%          18
## 13        25%          18
## 14        25%          19
## 15        25%          19
## 16        30%          19
## 17        30%          25
## 18        30%          22
## 19        30%          19
## 20        30%          23
## 21        35%           7
## 22        35%          10
## 23        35%          11
## 24        35%          15
## 25        35%          11

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.

#group_by(Datos, Porcentaje) = Datos %>% group_by(Porcentaje)

# 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
  )  %>%
  mutate(across(where(is.numeric), ~ round(.x, 2)))

# Mostramos la tabla de estadísticas
estadisticas
## # A tibble: 5 × 7
##   Porcentaje Promedio    DE     n Error    Li    Ls
##   <chr>         <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 15%             9.8  3.35     5  1.5   8.3   11.3
## 2 20%            15.4  3.13     5  1.4  14     16.8
## 3 25%            17.6  2.07     5  0.93 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) +
  geom_errorbar(aes(ymin = Li, ymax = Ls), width = 0.2) +
  theme_minimal() +
  labs(x = "Porcentaje de Algodón", y = "Resistencia a la tension (lb/in^2)", title = "Error Estándar de la Resistencia a la tension")

Diagrama de cajas

Datos %>%
  ggplot(aes(x = Porcentaje, y = Resistencia, fill = Porcentaje)) +
  geom_boxplot() +
  theme_minimal() +
  coord_flip() +
  labs(x = "Porcentaje de Algodón", y = "Resistencia a la tension (lb/in^2)", title = "Variabilidad de la Resistencia a la tension")

Modelado Bajo un Diseño Completamente al Azar

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

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

# convertir factor los tratamientos
Datos$Porcentaje <- as.factor(Datos$Porcentaje)

str(Datos)
## spc_tbl_ [25 × 2] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Porcentaje : Factor w/ 5 levels "15%","20%","25%",..: 1 1 1 1 1 2 2 2 2 2 ...
##  $ Resistencia: num [1:25] 7 7 15 11 9 12 17 12 18 18 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Porcentaje = col_character(),
##   ..   Resistencia = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
anova_telas <- aov(formula = 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

Como el p_value es < 0.05 (valor de la significancia), entonces debo llevar a cabo una prueba de medias (duncan, DMS, Tukey)

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

Link de yopad