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.
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).
Visitas_efectivas_7dias).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.
# 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)
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
tabla_diseno <- with(datos, table(Bloque, Tratamiento))
kable(tabla_diseno, caption = "Participantes por bloque y tratamiento")
| Grupo_comparacion | Mamón_criollo | |
|---|---|---|
| Estreñimiento_severo_tipo_1 | 38 | 38 |
| Estreñimiento_severo_tipo_2 | 38 | 38 |
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")
| 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")
Tratamiento
Bloque
Se fija alpha = 0.05. Si el valor p es menor que 0.05,
se rechaza la hipótesis nula correspondiente.
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")
| 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 |
La normalidad se evalúa sobre los residuos del modelo, no sobre cada grupo de datos por separado.
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.
Se usa Levene para comparar varianzas entre las cuatro combinaciones bloque–tratamiento.
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.
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
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
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.
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()
| 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 |
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.