¡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.

  • [cite_start]Tabla inicial (Pág. 1): Utiliza las fórmulas definicionales basadas en las medias de los tratamientos y bloques[cite: 7, 13, 16]. Son excelentes para entender el concepto de varianza, pero tediosas para calcular a mano.
  • [cite_start]Notas de Mendiburu (Págs. 3 y 4): Utiliza las fórmulas computacionales (o de trabajo) basadas en la suma de los datos totales elevados al cuadrado y un Término de Corrección (\(TC\)) [cite: 59, 62, 67-69]. Este es el método clásico y más eficiente para los cálculos manuales con lápiz y papel.

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.


Guía de Estudio: Diseño de Bloques Completos al Azar (DBCA)

1. Definición, Importancia y Aplicaciones

[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.

2. Fundamento Teórico y Fórmulas

[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].

Fórmulas para el Cálculo Manual (Método Computacional)

[cite_start]Para facilitar el cálculo a mano, se utiliza el Término de Corrección (TC)[cite: 68]:

  1. Término de Corrección: \[TC = \frac{Y_{..}^2}{rt}\] (Donde \(Y_{..}\) es la gran suma de todos los datos, \(r\) es el número de bloques y \(t\) el número de tratamientos).
  2. [cite_start]Suma de Cuadrados Total: \[SC_{Total} = \sum\sum Y_{ij}^2 - TC\] [cite: 69]
  3. Suma de Cuadrados de Tratamientos: \[SC_{Trat} = \frac{\sum Y_{i.}^2}{r} - TC\]
  4. Suma de Cuadrados de Bloques: \[SC_{Bloq} = \frac{\sum Y_{.j}^2}{t} - TC\]
  5. [cite_start]Suma de Cuadrados del Error: \[SC_{Error} = SC_{Total} - (SC_{Trat} + SC_{Bloq})\] [cite: 90]

3. Ejercicio Práctico (Cálculo Manual)

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]


4. Solución Computacional y Despliegue

A. Implementación en Python (Google Colab)

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)

B. Implementación en R Base

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

C. Implementación en R usando el paquete 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`)

5. Interpretación de las Salidas

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

  1. Hipótesis de los Tratamientos (Variedades):
    • \(H_0\): Todas las variedades de camote producen el mismo rendimiento medio de follaje.
    • [cite_start]Interpretación: Si observamos la fila de 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.
  2. Hipótesis de los Bloques:
    • \(H_0\): No hay efecto significativo del bloque en el rendimiento.
    • [cite_start]Interpretación: Si observamos la fila de 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.


Alternativa No Paramétrica: Prueba de Friedman para DBCA

1. ¿Cuándo y por qué usarla?

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

2. Fundamento Teórico y Fórmulas

[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].


3. Ejercicio Práctico (Cálculo Manual)

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].


4. Solución Computacional

A. Implementación en Python

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

B. Implementación en R Base

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


5. Interpretación de la Salida

[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:


6. Comparaciones Múltiples (Post-hoc para Friedman)

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].

Fundamento Teórico y Fórmulas

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].


Ejercicio Práctico (Cálculo Manual Continuación)

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.


Solución Computacional

A. Implementación en Python (Cálculo directo)

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

B. Implementación en R

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)