¡Buen día! Es un gusto saludarte.
Revisando el documento de Felipe de Mendiburu, he analizado la coherencia de las fórmulas. Puedes estar tranquilo: las fórmulas son matemáticamente coherentes y equivalentes, aunque utilizan enfoques distintos para llegar al mismo resultado.
A continuación, te presento el contenido estructurado en formato Markdown, ideal para que lo copies y pegues directamente en las celdas de texto de tus Notebooks de Google Colab. Está adaptado con ejemplos para tus estudiantes de Ingeniería Agrícola y Agroindustrial.
[cite_start]El Diseño de Bloques Completos al Azar (DBCA), también conocido como diseño de doble vía, se aplica cuando el material o ambiente experimental es heterogéneo[cite: 19]. [cite_start]Para controlar esta variabilidad, las unidades experimentales se agrupan formando grupos homogéneos llamados “bloques”[cite: 20].
Características Clave: * [cite_start]Las unidades experimentales dentro de cada bloque son homogéneas, pero hay heterogeneidad entre los bloques[cite: 35, 36]. * [cite_start]En cada bloque, el número de unidades experimentales es exactamente igual al número de tratamientos evaluados (por eso es un bloque “completo”)[cite: 37, 38]. * [cite_start]Los tratamientos se distribuyen al azar de forma independiente dentro de cada bloque[cite: 39].
Aplicaciones en Ingeniería Agrícola y Agroindustrial: * Agrícola: Evaluar el rendimiento de diferentes fertilizantes (tratamientos) en un terreno que tiene un gradiente de fertilidad o pendiente. Cada franja perpendicular al gradiente funciona como un bloque. * Agroindustrial: Comparar la eficiencia de diferentes métodos de extracción de aceite (tratamientos) utilizando lotes de materia prima que provienen de distintos proveedores (bloques), asumiendo que el proveedor introduce variabilidad.
[cite_start]Cada observación del experimento se expresa mediante el siguiente modelo lineal[cite: 43]:
[cite_start]\[Y_{ij} = \mu + \tau_i + \beta_j + \epsilon_{ij}\] [cite: 44]
Donde: * [cite_start]\(Y_{ij}\) = Observación en la unidad experimental del tratamiento \(i\) en el bloque \(j\)[cite: 51]. * [cite_start]\(\mu\) = Parámetro del efecto medio global[cite: 45]. * [cite_start]\(\tau_i\) = Efecto del tratamiento \(i\)[cite: 48]. * [cite_start]\(\beta_j\) = Efecto del bloque \(j\)[cite: 49]. * [cite_start]\(\epsilon_{ij}\) = Error experimental aleatorio asociado a esa unidad[cite: 50].
[cite_start]Para facilitar el cálculo a mano, se utiliza el Término de Corrección (TC)[cite: 68]:
Enunciado: Un ingeniero agrícola está realizando un estudio de variedades forrajeras de camote. [cite_start]Se evaluaron 4 nuevas variedades (V1, V2, V3, V4) y un testigo[cite: 70, 71]. [cite_start]Se conformaron 3 bloques homogéneos de parcelas[cite: 73]. [cite_start]La variable de respuesta es el peso del follaje fresco en kilos[cite: 74, 75].
[cite_start]Datos Recolectados (Totales de Tratamiento \(Y_{i.}\) y Bloque \(Y_{.j}\)): [cite: 75]
| Bloque | V1 | Testigo | V2 | V3 | V4 | Total Bloque (\(Y_{.j}\)) |
|---|---|---|---|---|---|---|
| I | 17.9 | 7.0 | 19.8 | 15.2 | 12.7 | 72.6 |
| II | 20.8 | 5.9 | 16.7 | 21.0 | 14.2 | 78.6 |
| III | 21.4 | 4.2 | 16.7 | 8.8 | 11.5 | 62.6 |
| Total Trat. (\(Y_{i.}\)) | 60.1 | 17.1 | 53.2 | 45.0 | 38.4 | Gran Total = 213.8 |
Paso a paso: 1. [cite_start]Calcular el TC: \[TC = \frac{(213.8)^2}{15} = 3047.36\] [cite: 79] 2. [cite_start]Calcular SC Variedades (Tratamientos): \[SC_{Var} = \frac{(60.1)^2 + (17.1)^2 + (53.2)^2 + (45.0)^2 + (38.4)^2}{3} - TC\] [cite: 80-83] [cite_start]\[SC_{Var} = \frac{10234.02}{3} - 3047.36 = 3411.34 - 3047.36 = 363.98\] (Nota: Por redondeo decimal en el apunte original resulta \(364.04\) [cite: 92]). 3. [cite_start]Calcular SC Bloques: \[SC_{Bloq} = \frac{(72.6)^2 + (78.6)^2 + (62.6)^2}{5} - TC\] [cite: 84-87] [cite_start]\[SC_{Bloq} = \frac{15366.68}{5} - 3047.36 = 3073.33 - 3047.36 = 25.97\] (En el apunte resulta \(26.13\) [cite: 92]). 4. Calcular SC Total: [cite_start]\[SC_{Total} = (17.9^2 + 7.0^2 + ... + 11.5^2) - TC = 3506.76 - 3047.36 = 459.4\] [cite: 89, 92] 5. Calcular SC Error: [cite_start]\[SC_{Error} = SC_{Total} - (SC_{Var} + SC_{Bloq}) = 459.4 - (363.98 + 25.97) = 69.45\] [cite: 90, 92]
import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols
# 1. Crear el DataFrame con los datos del ejercicio
data = {
'Rendimiento': [17.9, 20.8, 21.4, 7.0, 5.9, 4.2, 19.8, 16.7, 16.7, 15.2, 21.0, 8.8, 12.7, 14.2, 11.5],
'Variedad': ['V1', 'V1', 'V1', 'Testigo', 'Testigo', 'Testigo', 'V2', 'V2', 'V2', 'V3', 'V3', 'V3', 'V4', 'V4', 'V4'],
'Bloque': ['I', 'II', 'III', 'I', 'II', 'III', 'I', 'II', 'III', 'I', 'II', 'III', 'I', 'II', 'III']
}
df = pd.DataFrame(data)
# 2. Ajustar el modelo Lineal (ANOVA de dos vías)
# C() indica que la variable es categórica
modelo = ols('Rendimiento ~ C(Variedad) + C(Bloque)', data=df).fit()
# 3. Generar la Tabla ANOVA
tabla_anova = sm.stats.anova_lm(modelo, typ=2)
print("Tabla ANOVA - Python Statsmodels:")
print(tabla_anova)
# 1. Vectores de datos
rendimiento <- c(17.9, 20.8, 21.4, 7.0, 5.9, 4.2, 19.8, 16.7, 16.7, 15.2, 21.0, 8.8, 12.7, 14.2, 11.5)
variedad <- as.factor(rep(c("V1", "Testigo", "V2", "V3", "V4"), each=3))
bloque <- as.factor(rep(c("I", "II", "III"), times=5))
# 2. Modelo ANOVA
modelo_r <- aov(rendimiento ~ variedad + bloque)
# 3. Mostrar la tabla
cat("Tabla ANOVA - R Base:\n")
summary(modelo_r)
easyanova# Instalar el paquete si no está disponible: install.packages("easyanova")
library(easyanova)
# easyanova requiere un data.frame estructurado: columna 1 (Tratamiento), columna 2 (Bloque), columna 3 (Respuesta)
datos_ea <- data.frame(variedad, bloque, rendimiento)
# Ejecutar el análisis (design = 2 corresponde al Diseño de Bloques Completos al Azar)
resultado_ea <- ea1(datos_ea, design = 2)
cat("Tabla ANOVA - R easyanova:\n")
print(resultado_ea$`Analysis of variance`)
[cite_start]Independientemente del software que utilices (Python, R
Base, o easyanova), la tabla generará los mismos
estadísticos[cite: 92]. La clave para la interpretación recae en el
P-valor (Pr > F).
variedad, el \(Pr>F\) es aproximadamente \(0.0029\)[cite: 92]. Como \(0.0029 < 0.05\) (nuestro nivel de
significancia típico \(\alpha\)),
rechazamos \(H_0\).
Concluimos que existe una diferencia estadísticamente significativa en
el rendimiento del follaje entre al menos dos de las variedades
evaluadas.bloque, el \(Pr>F\)
es \(0.2785\)[cite:
92]. Como \(0.2785 > 0.05\),
no rechazamos \(H_0\).
[cite_start]Esto sugiere estadísticamente que la conformación de los
bloques no logró separar una fuente de variación significativa en este
experimento específico, aunque teóricamente era correcto agrupar las
parcelas [cite: 73] para proteger el experimento.Me parece una idea excelente. Completar la guía con la alternativa no paramétrica dejará a tus estudiantes preparados para enfrentarse a datos reales donde los supuestos de normalidad o varianza constante (homocedasticidad) no se cumplen.
A continuación, te presento el bloque en formato Markdown, listo para integrarse en tu cuaderno de Google Colab. He adaptado los datos genéricos del documento a un escenario agroindustrial para que resulte más significativo para los estudiantes.
[cite_start]La prueba de Friedman, propuesta en 1937, es la alternativa no paramétrica al ANOVA para un Diseño de Bloques Completos al Azar (DBCA)[cite: 111, 112]. Se aplica cuando: * [cite_start]Los datos no tienen una distribución normal conocida o violan los supuestos del ANOVA paramétrico[cite: 112]. * La variable de respuesta es de tipo ordinal (por ejemplo, escalas de severidad de enfermedades en plantas, o calificaciones hedónicas en evaluación sensorial de alimentos).
[cite_start]A diferencia del ANOVA que trabaja con las medias y varianzas de los datos originales, la prueba de Friedman transforma los datos en rangos (jerarquías)[cite: 113].
Pasos del procedimiento: 1. [cite_start]Asignar un rango a los tratamientos dentro de cada bloque, ordenándolos de menor a mayor[cite: 113]. (El valor más bajo recibe el rango 1, el siguiente el 2, etc.). 2. [cite_start]Obtener la suma de los rangos (\(R_i\)) para cada tratamiento a lo largo de todos los bloques[cite: 114, 134]. 3. [cite_start]Probar la hipótesis nula (\(H_0\)) de que las poblaciones dentro de un bloque son idénticas, contra la alternativa de que al menos un tratamiento proviene de una población con una ubicación diferente[cite: 115, 116].
Fórmula de cálculo (Sin empates): [cite_start]El estadístico de prueba Chi-cuadrado calculado (\(\chi^2_{cal}\)) se define como[cite: 118, 119]:
\[\chi^2_{cal} = \frac{12}{bt(t+1)} \sum_{i=1}^t R_i^2 - 3b(t+1)\]
Donde: * [cite_start]\(t\) = número de tratamientos[cite: 127]. * [cite_start]\(b\) = número de bloques[cite: 128]. * [cite_start]\(R_i\) = Suma de rangos del tratamiento \(i\)[cite: 134]. * [cite_start](Nota: los valores 12 y 3 son constantes de la fórmula y no dependen del tamaño del experimento [cite: 120])
[cite_start]Este valor se compara con un Chi-cuadrado tabular con \(t-1\) grados de libertad[cite: 126, 129].
Enunciado: Se evaluaron 6 formulaciones de recubrimientos comestibles (T1 a T6) para prolongar la vida útil de una fruta. Como el material de la fruta varía, se utilizaron 4 lotes distintos como bloques. [cite_start]Un panel evaluó la calidad general en una escala de 0 a 10. Al ser una escala ordinal, se procede con la Prueba de Friedman[cite: 138, 178].
[cite_start]Paso 1: Datos Observados [cite: 139]
| Bloques | T1 | T2 | T3 | T4 | T5 | T6 |
|---|---|---|---|---|---|---|
| 1 | 4.4 | 3.3 | 4.4 | 6.8 | 6.3 | 6.4 |
| 2 | 5.9 | 1.9 | 4.0 | 6.6 | 4.9 | 7.3 |
| 3 | 6.0 | 4.9 | 4.5 | 7.0 | 5.9 | 7.7 |
| 4 | 4.1 | 7.1 | 3.1 | 6.4 | 7.1 | 6.7 |
[cite_start]Paso 2: Transformación a Rangos por Bloque y Suma (\(R_i\)) [cite: 140, 141, 180] [cite_start](Nota: En caso de empates, como en el Bloque 1 para T1 y T3 (ambos 4.4), que ocuparían las posiciones 2 y 3, se asigna el promedio de los rangos: 2.5)[cite: 141].
| Bloques | T1 | T2 | T3 | T4 | T5 | T6 |
|---|---|---|---|---|---|---|
| 1 | 2.5 | 1 | 2.5 | 6 | 4 | 5 |
| 2 | 4 | 1 | 2 | 5 | 3 | 6 |
| 3 | 4 | 2 | 1 | 5 | 3 | 6 |
| 4 | 2 | 5.5 | 1 | 3 | 5.5 | 4 |
| Suma (\(R_i\)) | 12.5 | 9.5 | 6.5 | 19 | 15.5 | 21 |
[cite_start]Paso 3: Cálculo del Estadístico [cite: 142, 181] Tenemos \(t = 6\) tratamientos y \(b = 4\) bloques.
\[\chi^2_{cal} = \frac{12}{4 \times 6 \times 7} (12.5^2 + 9.5^2 + 6.5^2 + 19^2 + 15.5^2 + 21^2) - 3(4)(7)\] \[\chi^2_{cal} = \frac{12}{168} (1331) - 84\] \[\chi^2_{cal} = 11.07\]
[cite_start]El valor de Chi-cuadrado tabular para \(\alpha = 0.05\) con \(5\) grados de libertad es 11.1[cite: 142, 181].
import scipy.stats as stats
# 1. Ingresar los datos organizados por tratamientos (columnas en la tabla original)
# Cada lista representa las observaciones de un tratamiento en los 4 bloques
T1 = [4.4, 5.9, 6.0, 4.1]
T2 = [3.3, 1.9, 4.9, 7.1]
T3 = [4.4, 4.0, 4.5, 3.1]
T4 = [6.8, 6.6, 7.0, 6.4]
T5 = [6.3, 4.9, 5.9, 7.1]
T6 = [6.4, 7.3, 7.7, 6.7]
# 2. Ejecutar la prueba de Friedman
stat, p_valor = stats.friedmanchisquare(T1, T2, T3, T4, T5, T6)
print(f"Estadístico Chi-cuadrado: {stat:.2f}")
print(f"P-valor: {p_valor:.4f}")
# 1. Crear matriz de datos (filas = bloques, columnas = tratamientos)
datos_matriz <- matrix(c(
4.4, 3.3, 4.4, 6.8, 6.3, 6.4,
5.9, 1.9, 4.0, 6.6, 4.9, 7.3,
6.0, 4.9, 4.5, 7.0, 5.9, 7.7,
4.1, 7.1, 3.1, 6.4, 7.1, 6.7
), nrow = 4, byrow = TRUE)
colnames(datos_matriz) <- c("T1", "T2", "T3", "T4", "T5", "T6")
rownames(datos_matriz) <- c("B1", "B2", "B3", "B4")
# 2. Ejecutar la prueba
resultado_friedman <- friedman.test(datos_matriz)
print(resultado_friedman)
(Nota: Para R, el paquete easyanova también tiene la
función ea2 que permite realizar pruebas no paramétricas,
pero la función base de R es la forma más directa y estandarizada de
hacerlo).
[cite_start]La regla de decisión teórica indica que se acepta la hipótesis planteada si el valor de Chi-cuadrado calculado es menor que el valor tabular[cite: 129].
[cite_start]En nuestro cálculo manual obtenemos \(\chi^2_{cal} = 11.07\) frente a un tabular de \(11.1\)[cite: 142, 181]. Como \(11.07 < 11.1\), al límite, no tendríamos evidencia suficiente para rechazar de forma contundente la hipótesis nula al 5% de significancia, indicando que estadísticamente las formulaciones son estadísticamente similares en este nivel de prueba.
[cite_start]Al ejecutar el código en Python o R, obtendrás el P-valor exacto, que ronda el 0.066[cite: 147]. Como \(0.066 > 0.05\), confirmamos matemáticamente la decisión de no rechazar \(H_0\). Las diferencias observadas en los recubrimientos no son lo suficientemente grandes para considerarse significativas bajo esta prueba, considerando el tamaño de la muestra.
¡Perfecto! Completar la guía con las comparaciones múltiples es el paso lógico para cerrar el ciclo del análisis estadístico. De hecho, esto les enseñará a tus estudiantes qué hacer exactamente cuando descubren que sí hay diferencias significativas entre sus tratamientos y necesitan saber cuáles son distintos entre sí.
Aquí tienes la sección final en formato Markdown, lista para integrarse en tu cuaderno de Google Colab:
Si el estadístico Chi-cuadrado calculado en la Prueba de Friedman resulta significativo (es decir, se rechaza \(H_0\)), sabemos que al menos un tratamiento es diferente de los demás. [cite_start]Para identificar exactamente dónde están esas diferencias, realizamos una comparación por pares basada en la suma de los rangos[cite: 132, 133].
Las comparaciones se realizan evaluando la diferencia absoluta entre la suma de los rangos de cada par de tratamientos (\(R_i\) y \(R_j\)). [cite_start]Se considera que dos tratamientos son estadísticamente diferentes si esa diferencia es mayor que el valor de la Diferencia Mínima Significativa (LSD) calculada para rangos[cite: 135].
La condición teórica es: \[|R_i - R_j| > [cite_start]LSD\] [cite: 136]
La fórmula para calcular el valor LSD en este contexto no paramétrico es: [cite_start]\[LSD = t_{\alpha/2, (b-1)(t-1)} \sqrt{\frac{2(bA_1 - \sum R_i^2)}{(b-1)(t-1)}}\] [cite: 136]
Donde: * [cite_start]\(t_{\alpha/2, (b-1)(t-1)}\) = Valor crítico de la distribución t-Student con \((b-1)(t-1)\) grados de libertad[cite: 136]. * \(b\) = Número de bloques. * \(t\) = Número de tratamientos. * [cite_start]\(A_1 = \sum\sum r_{ij}^2\) = La suma de todos los rangos individuales elevados al cuadrado en todo el experimento[cite: 123]. * [cite_start]\(\sum R_i^2\) = La suma de los cuadrados de los rangos totales de cada tratamiento[cite: 136].
Supongamos que en nuestro ejercicio de las 6 formulaciones de recubrimientos comestibles (T1 a T6) el P-valor hubiera sido menor a \(0.05\) y necesitamos comparar los tratamientos.
Nuestros datos previos eran: * [cite_start]Suma de rangos (\(R_i\)): T1=12.5, T2=9.5, T3=6.5, T4=19, T5=15.5, T6=21[cite: 180]. * \(b = 4\) bloques, \(t = 6\) tratamientos. * [cite_start]Grados de libertad para t-Student = \((4-1)(6-1) = 15\)[cite: 137].
Paso 1: Calcular \(A_1\) y \(\sum R_i^2\) * [cite_start]\(A_1\) (Suma de cuadrados de rangos individuales): \(2.5^2 + 1^2 + 2.5^2 + ... + 4^2 = 363\)[cite: 182]. * [cite_start]\(\sum R_i^2\) (Suma de cuadrados de los \(R_i\) totales): \(12.5^2 + 9.5^2 + 6.5^2 + 19^2 + 15.5^2 + 21^2 = 1331\)[cite: 182].
Paso 2: Obtener t-Student y calcular LSD * [cite_start]El valor tabular \(t\) para \(\alpha=0.05\) y 15 gl es 2.1314[cite: 182]. * Sustituyendo en la fórmula: \[LSD = 2.1314 \times \sqrt{\frac{2(4 \times 363 - 1331)}{15}}\] \[LSD = 2.1314 \times \sqrt{\frac{2(1452 - 1331)}{15}}\] [cite_start]\[LSD = 2.1314 \times \sqrt{\frac{2(121)}{15}} = 2.1314 \times 4.016 = \mathbf{8.56}\] [cite: 182]
Paso 3: Comparar por pares Cualquier diferencia entre dos tratamientos que sea mayor a 8.56 se considera significativa. * Ejemplo de comparación extrema: T6 (\(R=21\)) vs T3 (\(R=6.5\)). * \(|21 - 6.5| = 14.5\). Como \(14.5 > 8.56\), podemos afirmar estadísticamente que la formulación T6 y la T3 generan respuestas significativamente distintas.
Puesto que las librerías base de Python (como scipy)
calculan Friedman pero no la prueba post-hoc exacta de Mendiburu,
podemos programar la fórmula directamente para que los estudiantes
entiendan el algoritmo:
import numpy as np
import scipy.stats as stats
# Datos de entrada (Suma de rangos, bloques, tratamientos)
Ri = np.array([12.5, 9.5, 6.5, 19.0, 15.5, 21.0])
b = 4
t = 6
A1 = 363 # Previamente calculado elevando al cuadrado cada rango de la matriz
# 1. Componentes de la fórmula
sum_Ri2 = np.sum(Ri**2)
gl_error = (b - 1) * (t - 1)
# 2. Obtener t-Student (dos colas, alpha=0.05)
t_student = stats.t.ppf(1 - 0.05/2, gl_error)
# 3. Calcular LSD
interior_raiz = (2 * (b * A1 - sum_Ri2)) / gl_error
lsd = t_student * np.sqrt(interior_raiz)
print(f"Suma de Ri^2: {sum_Ri2}")
print(f"t-Student: {t_student:.4f}")
print(f"Valor LSD calculado: {lsd:.4f}")
En R, el análisis de diseño experimental agrícola suele hacerse con
el paquete agricolae. (Dato curioso para la clase:
¡este paquete fue creado por Felipe de Mendiburu, el mismo autor de las
notas matemáticas que estamos usando!).
# Instalar si es necesario: install.packages("agricolae")
library(agricolae)
# Asumiendo que tenemos nuestros datos en vectores
tratamientos <- rep(c("T1", "T2", "T3", "T4", "T5", "T6"), each=4)
bloques <- rep(c("B1", "B2", "B3", "B4"), times=6)
respuesta <- c(4.4, 5.9, 6.0, 4.1, 3.3, 1.9, 4.9, 7.1, 4.4, 4.0, 4.5, 3.1, 6.8, 6.6, 7.0, 6.4, 6.3, 4.9, 5.9, 7.1, 6.4, 7.3, 7.7, 6.7)
# Ejecutar la prueba de Friedman con comparaciones post-hoc
# El parámetro "group=TRUE" agrupará los tratamientos con letras (a, ab, b, c) según el LSD
resultado <- friedman(bloques, tratamientos, respuesta, alpha=0.05, group=TRUE)
print(resultado$statistics)
print(resultado$groups)