Advertencia: esta base y sus resultados son simulados exclusivamente para práctica académica. No representan evidencia clínica ni permiten afirmar que el mamón criollo sea eficaz.

1 1. Objetivo y diseño

Se ilustra la comparación de dos tratamientos —Mamón criollo y Grupo comparación— dentro de dos bloques (estreñimiento severo tipo 1 y tipo 2). Hay 38 participantes por combinación bloque–tratamiento (152 observaciones).

El DBA se analiza mediante un modelo aditivo de dos vías, sin interacción, porque hay una observación por participante y la estructura planteada es de bloques.

2 2. Preparación y paquetes

# Instalar una sola vez si hace falta:
# install.packages(c("readxl","dplyr","ggplot2","car","knitr","kableExtra"))

library(readxl)
library(dplyr)
library(ggplot2)
library(car)
library(knitr)
library(kableExtra)

set.seed(123)

2.1 2.1 Cargar la base

Coloque DataFrame_DBA_Mamon_Simulado.xlsx en la misma carpeta que este archivo Rmd.

datos <- read_excel("DataFrame_DBA_Mamon_Simulado.xlsx")

datos <- datos %>%
  mutate(
    ID = as.integer(ID),
    Bloque = factor(Bloque),
    Tratamiento = factor(Tratamiento,
      levels = c("Grupo_comparacion", "Mamón_criollo")),
    Ingesta_mamon_24h = as.numeric(Ingesta_mamon_24h),
    Visitas_efectivas_7dias = as.numeric(Visitas_efectivas_7dias)
  )

# Comprobar estructura, faltantes y tamaño
str(datos)
## tibble [152 × 6] (S3: tbl_df/tbl/data.frame)
##  $ ID                     : int [1:152] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Bloque                 : Factor w/ 2 levels "Estreñimiento_severo_tipo_1",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Tratamiento            : Factor w/ 2 levels "Grupo_comparacion",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ Replicacion            : num [1:152] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Ingesta_mamon_24h      : num [1:152] 1 21 8 6 24 25 13 23 8 5 ...
##  $ Visitas_efectivas_7dias: num [1:152] 0 0 0 2 2 1 2 2 1 0 ...
cat("Filas:", nrow(datos), "\\n")
## Filas: 152 \n
colSums(is.na(datos))
##                      ID                  Bloque             Tratamiento 
##                       0                       0                       0 
##             Replicacion       Ingesta_mamon_24h Visitas_efectivas_7dias 
##                       0                       0                       0

2.2 2.2 Distribución de participantes

tabla_diseno <- with(datos, table(Bloque, Tratamiento))
kable(tabla_diseno, caption = "Participantes por bloque y tratamiento")
Participantes por bloque y tratamiento
Grupo_comparacion Mamón_criollo
Estreñimiento_severo_tipo_1 38 38
Estreñimiento_severo_tipo_2 38 38

3 3. Descripción de los datos

descriptivos <- datos %>%
  group_by(Bloque, Tratamiento) %>%
  summarise(
    n = n(),
    media = mean(Visitas_efectivas_7dias, na.rm=TRUE),
    desviacion = sd(Visitas_efectivas_7dias, na.rm=TRUE),
    mediana = median(Visitas_efectivas_7dias, na.rm=TRUE),
    minimo = min(Visitas_efectivas_7dias, na.rm=TRUE),
    maximo = max(Visitas_efectivas_7dias, na.rm=TRUE),
    .groups="drop"
  )
kable(descriptivos, digits=2, caption="Resumen de visitas por bloque y tratamiento")
Resumen de visitas por bloque y tratamiento
Bloque Tratamiento n media desviacion mediana minimo maximo
Estreñimiento_severo_tipo_1 Grupo_comparacion 38 0.53 0.69 0 0 2
Estreñimiento_severo_tipo_1 Mamón_criollo 38 0.87 0.88 1 0 4
Estreñimiento_severo_tipo_2 Grupo_comparacion 38 0.79 0.74 1 0 3
Estreñimiento_severo_tipo_2 Mamón_criollo 38 1.13 1.12 1 0 4
ggplot(datos, aes(x=Tratamiento, y=Visitas_efectivas_7dias, fill=Tratamiento)) +
  geom_boxplot(alpha=.7, outlier.shape=NA) +
  geom_jitter(width=.12, alpha=.35, size=1.5) +
  facet_wrap(~Bloque) +
  labs(title="Visitas efectivas al excusado por tratamiento y bloque",
       x="Tratamiento", y="Visitas efectivas en 7 días") +
  theme_minimal() + theme(legend.position="none")

4 4. ANOVA de dos vías para el DBA

4.1 4.1 Hipótesis

Tratamiento

  • H0: las medias de visitas son iguales en ambos tratamientos, ajustando por bloque.
  • H1: las medias difieren entre tratamientos.

Bloque

  • H0: las medias de visitas son iguales entre bloques.
  • H1: las medias difieren entre bloques.

Se fija alpha = 0.05. Si el valor p es menor que 0.05, se rechaza la hipótesis nula correspondiente.

4.2 4.2 Ajuste del modelo

modelo <- aov(Visitas_efectivas_7dias ~ Tratamiento + Bloque, data=datos)
summary(modelo)
##              Df Sum Sq Mean Sq F value Pr(>F)  
## Tratamiento   1   4.45   4.447   5.892 0.0164 *
## Bloque        1   2.63   2.632   3.486 0.0638 .
## Residuals   149 112.47   0.755                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova_tabla <- as.data.frame(anova(modelo))
anova_tabla$Fuente <- rownames(anova_tabla)
rownames(anova_tabla) <- NULL
kable(anova_tabla, digits=4, caption="ANOVA: tratamiento y bloque")
ANOVA: tratamiento y bloque
Df Sum Sq Mean Sq F value Pr(>F) Fuente
1 4.4474 4.4474 5.8917 0.0164 Tratamiento
1 2.6316 2.6316 3.4862 0.0638 Bloque
149 112.4737 0.7549 NA NA Residuals

4.3 4.3 Validación de normalidad de residuos

La normalidad se evalúa sobre los residuos del modelo, no sobre cada grupo de datos por separado.

  • H0: los residuos siguen una distribución normal.
  • H1: los residuos no siguen una distribución normal.
  • Regla: p > 0.05 no aporta evidencia suficiente para rechazar normalidad; p ≤ 0.05 sugiere desviación.
res <- residuals(modelo)
shapiro.test(res)
## 
##  Shapiro-Wilk normality test
## 
## data:  res
## W = 0.91844, p-value = 1.443e-07
par(mfrow=c(1,2))
plot(modelo, which=1)  # residuos vs ajustados
plot(modelo, which=2)  # Q-Q plot

par(mfrow=c(1,1))

Interpretación: en el gráfico Q-Q, puntos cercanos a la línea apoyan visualmente la normalidad. En residuos vs ajustados no debería observarse un patrón sistemático.

4.4 4.4 Validación de homocedasticidad

Se usa Levene para comparar varianzas entre las cuatro combinaciones bloque–tratamiento.

  • H0: las varianzas son iguales.
  • H1: al menos una varianza difiere.
  • Regla: p > 0.05 = no se rechaza homogeneidad; p ≤ 0.05 = evidencia de heterogeneidad.
datos$Celda <- interaction(datos$Bloque, datos$Tratamiento, drop=TRUE)
leveneTest(Visitas_efectivas_7dias ~ Celda, data=datos, center=median)
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value Pr(>F)
## group   3  1.5997  0.192
##       148

La independencia no se prueba con Shapiro ni Levene: depende de la asignación aleatoria y de que cada persona contribuya una sola observación. Debe justificarse por el diseño.

4.5 4.5 Conclusión automática del ANOVA

p_trat <- anova(modelo)["Tratamiento","Pr(>F)"]
p_bloq <- anova(modelo)["Bloque","Pr(>F)"]

cat("Tratamiento: ",
    ifelse(p_trat < .05, "se rechaza H0; diferencia estadísticamente significativa.",
           "no se rechaza H0; no se detecta diferencia significativa."),
    "\\n")
## Tratamiento:  se rechaza H0; diferencia estadísticamente significativa. \n
cat("Bloque: ",
    ifelse(p_bloq < .05, "se rechaza H0; diferencia entre bloques.",
           "no se rechaza H0; no se detecta diferencia entre bloques."),
    "\\n")
## Bloque:  no se rechaza H0; no se detecta diferencia entre bloques. \n

5 5. Wilcoxon de rangos (Mann–Whitney)

Esta prueba compara dos grupos independientes. Se usa como análisis complementario sin ajustar por bloque; por ello no sustituye al ANOVA del DBA.

wilcox.test(Visitas_efectivas_7dias ~ Tratamiento, data=datos,
            exact=FALSE, conf.int=TRUE)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  Visitas_efectivas_7dias by Tratamiento
## W = 2383, p-value = 0.04487
## alternative hypothesis: true location shift is not equal to 0
## 95 percent confidence interval:
##  -9.999911e-01  3.810365e-05
## sample estimates:
## difference in location 
##            -3.4938e-05

Normalidad/homocedasticidad: no son requisitos de Wilcoxon. Puede mostrarse Shapiro por grupo como diagnóstico descriptivo, pero no como condición para aceptar la prueba:

by(datos$Visitas_efectivas_7dias, datos$Tratamiento, shapiro.test)
## datos$Tratamiento: Grupo_comparacion
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.77364, p-value = 1.8e-09
## 
## ------------------------------------------------------------ 
## datos$Tratamiento: Mamón_criollo
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.82461, p-value = 4.538e-08

6 6. Friedman: pertinencia y demostración

La prueba de Friedman requiere mediciones relacionadas/repetidas (por ejemplo, las mismas personas observadas en varios momentos o condiciones). En esta base cada participante tiene una sola medición y pertenece a un único tratamiento; por tanto, Friedman no es aplicable correctamente al diseño actual. Los bloques no son mediciones repetidas de las mismas personas.

No se ejecuta una prueba Friedman artificial. Para el DBA, el análisis principal adecuado es el ANOVA con bloque; para dos grupos independientes, Wilcoxon es complementario.

Si en otro taller se obtuvieran medidas repetidas (por ejemplo, visitas antes, durante y después en las mismas personas), se podría considerar Friedman y verificar la estructura de datos relacionada.

7 7. Chi-cuadrado de independencia

Para aplicar chi-cuadrado se categoriza la respuesta numérica: 0, 1, 2 y 3 o más visitas. Se contrasta asociación entre tratamiento y categoría de visitas.

datos <- datos %>%
  mutate(Categoria_visitas = factor(
    ifelse(Visitas_efectivas_7dias >= 3, "3 o más",
           as.character(Visitas_efectivas_7dias)),
    levels=c("0","1","2","3 o más")
  ))

tabla_chi <- table(datos$Tratamiento, datos$Categoria_visitas)
tabla_chi
##                    
##                      0  1  2 3 o más
##   Grupo_comparacion 36 31  8       1
##   Mamón_criollo     27 31 11       7
chi <- chisq.test(tabla_chi, correct=FALSE)
## Warning in chisq.test(tabla_chi, correct = FALSE): Chi-squared approximation
## may be incorrect
chi
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_chi
## X-squared = 6.2594, df = 3, p-value = 0.09965
chi$expected
##                    
##                        0  1   2 3 o más
##   Grupo_comparacion 31.5 31 9.5       4
##   Mamón_criollo     31.5 31 9.5       4
esperadas <- chi$expected
cat("Porcentaje de celdas con esperada < 5:",
    round(mean(esperadas < 5)*100, 1), "%\\n")
## Porcentaje de celdas con esperada < 5: 25 %\n
cat("Mínimo esperado:", min(esperadas), "\\n")
## Mínimo esperado: 4 \n
if(any(esperadas < 1) || mean(esperadas < 5) > .20){
  cat("Advertencia: el supuesto de frecuencias esperadas puede incumplirse. ",
      "Considere agrupar categorías con justificación o usar prueba exacta/Monte Carlo.\\n")
} else {
  cat("Las frecuencias esperadas cumplen la regla práctica indicada.\\n")
}
## Advertencia: el supuesto de frecuencias esperadas puede incumplirse.  Considere agrupar categorías con justificación o usar prueba exacta/Monte Carlo.\n
ggplot(datos, aes(x=Tratamiento, fill=Categoria_visitas)) +
  geom_bar(position="fill") +
  labs(title="Distribución porcentual de categorías de visitas",
       x="Tratamiento", y="Proporción", fill="Visitas") +
  theme_minimal()

8 8. Resumen de supuestos por prueba

Prueba Normalidad Homocedasticidad Comentario
ANOVA DBA Normalidad de residuos (Shapiro + Q-Q) Levene entre celdas Independencia se sustenta en diseño
Wilcoxon No requerida No requerida formalmente Dos grupos independientes; no ajusta bloques
Friedman No requiere normalidad No aplica como Levene clásico Requiere medidas relacionadas/repetidas; no aplicable aquí
Chi-cuadrado No requiere normalidad No aplica Requiere conteos, independencia y esperadas adecuadas

9 9. Conclusión para el taller

La conclusión debe redactarse usando los valores p y las comprobaciones que produzca la ejecución del documento. No se deben inventar conclusiones antes de ejecutar el análisis.

Reiteración: los datos son simulados para enseñanza. Una diferencia estadística en esta base ficticia no constituye evidencia médica ni recomendación de consumo.