Se comparan tres soluciones diferentes para lavar los envases de leche de dos litros, con el objetivo de estudiar su efectividad en el retraso del crecimiento de bacterias. El análisis se realiza en un laboratorio y solo pueden efectuarse tres pruebas en un mismo día. Como los días son una fuente de variabilidad potencial, el investigador decide usar un diseño aleatorizado por bloques. Las observaciones se recopilaron durante cuatro días y los datos se presentan en la siguiente tabla:
| Solución | Dia. | |||
|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |
| a | 13 | 22 | 18 | 39 |
| b | 16 | 24 | 17 | 44 |
| c | 5 | 4 | 1 | 22 |
1. Unidades Experimentales: Cada unidad experimental corresponde a un envase de leche de dos litros que ha sido lavado con una de las tres soluciones diferentes. En total, hay \(3\times 4=12\) unidades experimentales, representadas por las combinaciones de las tres soluciones y los cuatro días de observación.
2. Factor de Tratamiento: El factor de tratamiento es la solución utilizada para lavar los envases de leche. Este factor tiene tres niveles: solución “a”, solución “b” y solución “c”.
3. Factor de Bloque: El factor de bloque es el día en que se realizó la observación. Este factor tiene cuatro niveles correspondientes a los cuatro días de observación.
4. Respuesta: La respuesta es el tiempo de retraso en el crecimiento de bacterias en los envases de leche lavados con cada solución. Esta variable se mide en horas o algún otro intervalo de tiempo relevante.
El modelo de análisis estadístico para este experimento puede ser planteado de la siguiente manera:
\[Y_{ijk} = \mu + \tau_i+\beta_j+\epsilon_{ijk}\] * Donde \(Y_{ijk}\) representa la observación de la variable de respuesta para la unidad experimental \(ijk\).
\(\mu\) es el parámetro de interés que representa el efecto medio global.
\(\tau_i\) es el efecto del tratamiento \(i\) (solución de lavado).
\(\beta_j\) es el efecto del bloque \(j\) (dia de la observación)
\(\epsilon_{ijk}\) es el término de error aleatorio que captura la variabilidad no explicada por los tratamientos ni por los bloques.
La unidad experimental son los envases de leche sobre la cual se aplica las soluciones para detener la proliferación de bacterias. ¿Sería aconsejable realizar preferentemente un diseño completamente al azar frente al modelo planteado en el punto anterior?
Considero que es mejor un utilizar un diseño completamente al azar (DCA), pues cada unidad experimental (caa envase de leche) es asignado aleatoriamente a uno de los tratamientos (lavado del envase) sin considerar aparentemente ningún factor adicional como los días de observación.
Dado que no se está tratando de determinar el efecto de los días en los tratamientos, el (DCA) es más sencillo de analizar y los resultados pueden ser más simples de interpretar.
Se debe plantear un modelo de cuatro bloques y tres tratamientos ¿Se puede asegurar que las distintas soluciones incluyen en el retraso del crecimiento de bacterias?
En realidad a priori, no se puede asegurar que las distintas soluciones influyan en el retraso del crecimiento de bacterias sin un análisis estadístico adecuado. Para determinar si las diferentes soluciones tienen un efecto significativo en el retraso del crecimiento de bacterias, se necesita realizar un análisis apropiado de los datos experimentales. Podemos hacer pruebas de hipótesis, como el análisis de varianza (ANOVA), seguido de pruebas post-hoc, para determinar si en efecto, encontramos diferencias significativas entre los tratamientos. Estas pruebas permitirán determinar si hay evidencia estadística para afirmar que al menos una de las soluciones tiene un efecto en el retraso del crecimiento de bacterias.
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
bacterias <- read.csv("bacterias.csv")
bacterias
## Soluciones dia_1 dia_2 dia_3 dia_4
## 1 a 13 22 18 39
## 2 b 16 24 17 44
## 3 c 5 4 1 22
Con pivot longer, cambiamos a una tabla larga
bacterias <- bacterias %>% pivot_longer(cols = dia_1:dia_4, names_to = "Dia",
values_to = "Efectividad")
bacterias
## # A tibble: 12 × 3
## Soluciones Dia Efectividad
## <chr> <chr> <int>
## 1 a dia_1 13
## 2 a dia_2 22
## 3 a dia_3 18
## 4 a dia_4 39
## 5 b dia_1 16
## 6 b dia_2 24
## 7 b dia_3 17
## 8 b dia_4 44
## 9 c dia_1 5
## 10 c dia_2 4
## 11 c dia_3 1
## 12 c dia_4 22
Definiendo el factor
bacterias$Soluciones <- as.factor(bacterias$Soluciones)
#Bacterias$Dia <- as.factor(Bacterias$Dia)
# Resumen de los datos
str(bacterias)
## tibble [12 × 3] (S3: tbl_df/tbl/data.frame)
## $ Soluciones : Factor w/ 3 levels "a","b","c": 1 1 1 1 2 2 2 2 3 3 ...
## $ Dia : chr [1:12] "dia_1" "dia_2" "dia_3" "dia_4" ...
## $ Efectividad: int [1:12] 13 22 18 39 16 24 17 44 5 4 ...
summary(bacterias)
## Soluciones Dia Efectividad
## a:4 Length:12 Min. : 1.00
## b:4 Class :character 1st Qu.:11.00
## c:4 Mode :character Median :17.50
## Mean :18.75
## 3rd Qu.:22.50
## Max. :44.00
bxp_soluciones<- bacterias %>% ggplot(aes(x = Soluciones, y = Efectividad, fill = Soluciones)) +
geom_boxplot(position = position_dodge(width = 0.7), size = 1) +
labs(x = "Tipo de solución", y = "Efectividad en porcentaje", title = "Boxplot - Efectividad")
bxp_soluciones
Medición del efecto de los días en el crecimiento de bacterias
bxp_dias <- bacterias %>% ggplot(aes(x = Dia, y = Efectividad, fill = Dia)) +
geom_boxplot(position = position_dodge(width = 0.7), size = 1) +
labs(x = "Dias", y = "Efectividad (%)", title = "Boxplot - Dias")
bxp_dias
Veamos el efecto día a día
bxp_dia_a_dia <- bacterias %>% ggplot(aes(x = Dia, y = Efectividad, col = Dia)) +
facet_wrap(~Soluciones) +
geom_point() +
theme(axis.text.x = element_text(angle=45, vjust=1, hjust=1)) +
labs(x = NULL, y = "Porcentaje de efectividad", title = "Boxplot - Efecto día a día")
bxp_dia_a_dia
Vamos a hacer un análisis DBCA
modelo1 <- aov(Efectividad ~ Soluciones + Dia, data = bacterias)
summary(modelo1)
## Df Sum Sq Mean Sq F value Pr(>F)
## Soluciones 2 703.5 351.8 40.72 0.000323 ***
## Dia 3 1106.9 369.0 42.71 0.000192 ***
## Residuals 6 51.8 8.6
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Vamos a hacer la prueba para Soluciones
library(agricolae)
compara_solu<- HSD.test(modelo1,"Soluciones")
compara_solu$groups %>% rownames_to_column("Soluciones")
## Soluciones Efectividad groups
## 1 b 25.25 a
## 2 a 23.00 a
## 3 c 8.00 b
El análisis de los resultados de la prueba de Turkey muestra diferencias significativas en la efectividad de las soluciones de lavado de envases de leche. Según los resultados, la solución “b” muestra la mayor efectividad con una media de 25.25, seguida de la solución “a” con una media de 23.00, y finalmente la solución “c” con una media de 8.00.
Estos hallazgos coinciden con el análisis de varianza (ANOVA) previamente realizado, donde el factor “Soluciones” resultó altamente significativo (\(F = 40.72\), \(p < 0.001\)). Esto indica que existe al menos una diferencia significativa entre las medias de las soluciones de lavado de envases de leche en términos de su efectividad para retrasar el crecimiento de bacterias.
Es importante destacar que también se observó una significancia estadística para el factor “Día”, lo que sugiere que el día de la observación puede tener un efecto en la efectividad de las soluciones. Sin embargo, en este análisis específico de la prueba de Turkey, nos estamos centrando únicamente en las diferencias entre las soluciones de lavado, las cuales son claramente evidentes y significativas.
A continuación se presenta el análisis realizado en python
import pandas as pd
from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.stats.libqsturng import psturng
# Crear un DataFrame con los datos
data = {
'Solucion': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c'],
'Dia': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4],
'Efectividad': [13, 22, 18, 39, 16, 24, 17, 44, 5, 4, 1, 22]
}
df = pd.DataFrame(data)
# Realizar prueba de Tukey
tukey_result = pairwise_tukeyhsd(df['Efectividad'], df['Solucion'])
# Imprimir resultados
print(tukey_result)
## Multiple Comparison of Means - Tukey HSD, FWER=0.05
## =====================================================
## group1 group2 meandiff p-adj lower upper reject
## -----------------------------------------------------
## a b 2.25 0.9578 -20.1514 24.6514 False
## a c -15.0 0.2028 -37.4014 7.4014 False
## b c -17.25 0.1343 -39.6514 5.1514 False
## -----------------------------------------------------
El resultado obtenido de la prueba de Tukey en Python indica que no hay diferencias significativas entre las medias de efectividad de las soluciones. Esto se refleja en la columna “reject”, donde todos los valores son “False”, lo que significa que no se rechaza la hipótesis nula de que las medias son iguales.
Ahora, vamos a comparar estos resultados con los obtenidos en Rstudio:
Aquí podemos observar que la diferencia de medias entre las soluciones “a” y “b” es de 2.25, mientras que en Rstudio la diferencia entre estas dos soluciones es de 25.25 - 23.00 = 2.25. Además, en ambos casos se concluye que no hay diferencias significativas entre las soluciones.
En resumen, aunque los valores numéricos pueden variar ligeramente debido a diferencias en los cálculos o en la precisión de los resultados, la conclusión general de ambos análisis es consistente: no hay diferencias significativas entre las soluciones en términos de efectividad.
import matplotlib.pyplot as plt
import seaborn as sns # Para mejorar la apariencia del gráfico
# Datos
soluciones = ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c']
efectividad = [13, 22, 18, 39, 16, 24, 17, 44, 5, 4, 1, 22]
# Crear DataFrame
df = pd.DataFrame({'Solucion': soluciones, 'Efectividad': efectividad})
# Asignar colores a cada solución y a cada día
colores_soluciones = {'a': 'blue', 'b': 'green', 'c': 'red'}
colores_dias = {1: 'orange', 2: 'purple', 3: 'brown', 4: 'pink'}
# Boxplot
plt.figure(figsize=(10, 6))
sns.boxplot(x='Solucion', y='Efectividad', data=df )
plt.title('Boxplot de Efectividad por Solución')
plt.xlabel('Tipo de solución')
plt.ylabel('Efectividad')
plt.show()