library(tidyverse)
library(rstatix)
library(flextable)
library(car)Aplicación de Programas Informáticos 2026
Diseño de Experimentos Monofactoriales
Introducción
En reiteradas ocasiones el objetivo que se sigue es cómo una variable o varias afectan la variabilidad de una característica en estudio. Generalmente los datos para este tipo de análisis son experimentales, donde se controlan las variables externas y las condiciones del experimento, pero hay veces que esos datos son observacionales y el análisis es similar. El análisis de estos datos se realiza con el ADEVA (ANOVA en inglés), a fin de realizar la comparación de las respuestas medias correspondiente a los tratamientos aplicados, ya sean simples o compuestos.
Nos puede interesa examinar el efecto que se produce en la respuesta al aplicar simultáneamente un factor sobre una misma unidad experimental, en este caso hablamos experimento monofactorial. En otros casos si se investiga el efecto de dos o más factores, no es apropiado analizar la variación que provoca en una respuesta cada uno de ellos por separado, dado que puede suceder que los efectos medidos en la variable respuesta se deban a la acción de los factores que actúan como variables independientes entre sí o que interactúen de modo no independiente. En consecuencia, para medir su eficacia hay que experimentar con ellos en forma simultánea, aplicándolos sobre una misma unidad experimental. Hay que llevar a cabo lo que se conoce como un experimento polifactorial o multifactorial o simplemente factorial. Genéricamente se trata de experimentos en los cuales se investiga la acción de dos o más factores, y donde los tratamientos responden a arreglos combinados de tratamientos simples (tratamientos combinados).
Experimentos monofactoriales
Ejemplo con Diseño Completamente Aleatorizado
Nothofagus glauca es endémica de la cordillera austral y está sujeta a intensa presión antrópica. Para conocer los factores que inciden en su propagación vegetativa se estudió el efecto del ácido indolbutílico (AIB) la capacidad de arraigamiento.
Se colectaron 18 estacas de tallo de árboles de más de 20 años de edad que se pusieron a enraizar en macetas individuales con un mismo sustrato. Cada maceta reicibó de menera aleatoria e independiente una de las 3 dosis de AIB estudiadas: 0, 0.5 y 1.5%. Así cada dosis fue repetida 6 veces.
Al cabo de tres meses se midió la longitud de la raíz (en cm).
aib <- read.csv("~/Cátedra/API 2025/AIB.csv", sep=";")Verificar y/o convertir tipos de datos
tail(aib) dosis long_mm
13 1.5 6.46
14 1.5 5.43
15 1.5 5.27
16 1.5 5.31
17 1.5 6.11
18 1.5 6.39
Vemos que ambas variables son numéricas, para poder realizar los análisis debemos definir a dosis como factor.
aib$dosis = as.factor(aib$dosis)
tail(aib) dosis long_mm
13 1.5 6.46
14 1.5 5.43
15 1.5 5.27
16 1.5 5.31
17 1.5 6.11
18 1.5 6.39
Análisis Exploratorio
Descripción numérica
En la descripción numérica, por factor, armamos un resumen de las medidas que nos interesan:
flextable(aib |>
group_by(dosis) |>
get_summary_stats(long_mm, type = "common")
)dosis | variable | n | min | max | median | iqr | mean | sd | se | ci |
|---|---|---|---|---|---|---|---|---|---|---|
0 | long_mm | 6 | 0.40 | 2.47 | 1.49 | 0.910 | 1.498 | 0.751 | 0.307 | 0.789 |
0.5 | long_mm | 6 | 3.67 | 5.59 | 5.11 | 0.888 | 4.918 | 0.743 | 0.303 | 0.780 |
1.5 | long_mm | 6 | 5.27 | 6.46 | 5.77 | 0.980 | 5.828 | 0.554 | 0.226 | 0.581 |
Gráficos de puntos
ggplot(aib) +
aes(x = dosis, y = long_mm) +
geom_jitter(width = 0.2) +
stat_summary(fun.data = "mean_se", geom = "pointrange", color = "blue")+
labs(x="Dosis %", y="Longuitud mm")Gráficos boxplot
Hemos visto también que los diagramas de caja nos dan mayor información respecto a las medidas de posición y distribución de los datos.
ggplot(aib) +
aes(x = dosis, y = long_mm) +
geom_boxplot() +
geom_jitter(width = 0.2) +
stat_summary(fun = "mean",
geom = "point",
shape = 18,
size = 3,
color = "blue")+
labs(x="Dosis %", y="Longuitud mm")+
theme_light()Modelo lineal
El modelo que utilizaremos es de efectos fijos ya que hemos fijado los niveles del factor, en este caso es uno: “Dosis de AIB”, por lo tanto el modelo a comprobar es: \[Y_{ij} =\mu + \alpha_j +\varepsilon_{ij}\] Teniendo en cuenta que: \(Y_{ij}\) : es la respuesta de la i-ésima estaca que se le aplicó la j-ésima dosis de AIB.
\(\mu\): es la longitud promedio (mm) de las estacas
\(\alpha_j\): es el efecto producido por la j-ésima dosis de AIB sobre la longitud promedio (mm)
\(\varepsilon_{ij}\): es el efecto del error aleatorio sobre la i-ésima estaca a la que se le aplicó la j-ésima dosis de AIB.
Para la prueba de hipótesis del modelo, se pone a prueba la variabilidad entre las dosis (el efecto).
\[H_0:\alpha_j = 0\forall j\] \[H_1:\alpha_j \neq 0 \text{ para algun j}\]
# modelo = VR ~ Factor
aib_aov <- aov(long_mm ~ dosis, aib)
aib_aovCall:
aov(formula = long_mm ~ dosis, data = aib)
Terms:
dosis Residuals
Sum of Squares 62.54680 7.11645
Deg. of Freedom 2 15
Residual standard error: 0.6887888
Estimated effects may be unbalanced
Resumen del modelo
summary(aib_aov) Df Sum Sq Mean Sq F value Pr(>F)
dosis 2 62.55 31.273 65.92 3.71e-08 ***
Residuals 15 7.12 0.474
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ADEVA
library(broom)
# Usa tidy() para convertir el resumen en un data frame
tabla_aov <- tidy(aib_aov)
flextable(tabla_aov)term | df | sumsq | meansq | statistic | p.value |
|---|---|---|---|---|---|
dosis | 2 | 62.54680 | 31.27340 | 65.91784 | 0.00000003710629 |
Residuals | 15 | 7.11645 | 0.47443 |
Supuestos
Residuos y predichos
Combinar en el set de datos todos los residuos
aib <- aib |>
mutate(est = fitted(aib_aov),
res_ord = resid(aib_aov),
res_std = rstandard(aib_aov))
aib dosis long_mm est res_ord res_std
1 0 0.40 1.498333 -1.09833333 -1.7467820
2 0 1.32 1.498333 -0.17833333 -0.2836201
3 0 1.02 1.498333 -0.47833333 -0.7607382
4 0 2.47 1.498333 0.97166667 1.5453322
5 0 2.12 1.498333 0.62166667 0.9886945
6 0 1.66 1.498333 0.16166667 0.2571136
7 0.5 5.40 4.918333 0.48166667 0.7660395
8 0.5 5.59 4.918333 0.67166667 1.0682142
9 0.5 4.82 4.918333 -0.09833333 -0.1563887
10 0.5 3.67 4.918333 -1.24833333 -1.9853410
11 0.5 5.51 4.918333 0.59166667 0.9409827
12 0.5 4.52 4.918333 -0.39833333 -0.6335067
13 1.5 6.46 5.828333 0.63166667 1.0045985
14 1.5 5.43 5.828333 -0.39833333 -0.6335067
15 1.5 5.27 5.828333 -0.55833333 -0.8879696
16 1.5 5.31 5.828333 -0.51833333 -0.8243539
17 1.5 6.11 5.828333 0.28166667 0.4479608
18 1.5 6.39 5.828333 0.56166667 0.8932709
Análisis de suspuestos
Gráficos de diagnóstico
Si queremos obtener los gráficos del análisis para el diagnóstico utilizamos del paquete base o los construimos con ggplot
Comprobación de la Normalidad
plot(aib_aov,
which = 2)# estraemos los residuos creando un data frame
res_df <- data.frame(res_ord = residuals(aib_aov))
ggplot(res_df) +
aes(sample = res_ord) +
geom_qq() +
geom_qq_line() +
labs(x = "Cuantiles teóricos normales",
y = "Cuantiles de residuos ordinarios")Recordemos la prueba de hipótesis de Shapiro Wilks de bondad de ajuste a la normalidad:
shapiro.test(resid(aib_aov))
Shapiro-Wilk normality test
data: resid(aib_aov)
W = 0.93609, p-value = 0.2481
Homogeneidad
Apliquemos lo aprendido anteriormente:
plot(aib_aov, which = 1)ggplot(aib) +
aes(x = est, y = res_ord) +
geom_point() +
labs(x = "Predichos", y = "Residuos")leveneTest(long_mm ~ dosis,
data = aib)Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 2 0.1383 0.8719
15
Comparaciones múltiples
Utilizaremos la librería agricolae
library(agricolae)TukeyHSD
HSD.test(aib_aov,
trt = "dosis",
console = T)
Study: aib_aov ~ "dosis"
HSD Test for long_mm
Mean Square Error: 0.47443
dosis, means
long_mm std r se Min Max Q25 Q50 Q75
0 1.498333 0.7514896 6 0.2811968 0.40 2.47 1.095 1.49 2.0050
0.5 4.918333 0.7429513 6 0.2811968 3.67 5.59 4.595 5.11 5.4825
1.5 5.828333 0.5536937 6 0.2811968 5.27 6.46 5.340 5.77 6.3200
Alpha: 0.05 ; DF Error: 15
Critical Value of Studentized Range: 3.673378
Minimun Significant Difference: 1.032942
Treatments with the same letter are not significantly different.
long_mm groups
1.5 5.828333 a
0.5 4.918333 a
0 1.498333 b
Ejemplo con Diseño con Bloques
En un proyecto de restauración ecológica en la precordillera de Mendoza, se buscan métodos eficaces para recuperar la cobertura vegetal en zonas afectadas por erosión hídrica. Se ensayan cuatro métodos de revegetación: Hidrosiembra, Siembra directa, Mulching orgánico con siembra, y Control (sin intervención). El experimento se instala en cuatro microcuencas diferentes, seleccionadas por tener características ambientales similares (pendiente, exposición solar), pero se sabe que la altitud relativa y la compactación inicial del suelo pueden generar diferencias entre ellas. En 4 microcuencas se delimita 1 parcela de 2 ha de superficie donde se asignan aleatoriamente los métodos. Se mide el porcentaje de cobertura vegetal al cabo de 6 meses.
library(readxl)
veg <- read_excel("cobertura.xlsx")Análisis Exploratorio
veg$métodos = as.factor(veg$métodos)
tail(veg)# A tibble: 6 × 3
microcuenca métodos cobertura
<chr> <fct> <dbl>
1 III Mulching orgánico 61.4
2 IV Mulching orgánico 59.7
3 I Control 48.5
4 II Control 49.1
5 III Control 47.8
6 IV Control 50.3
Numérico
Realiza el análisis descriptivo numérico tomando como referencia lo visto anteriormente.
Gráfico
Realiza el análisis descriptivo gráfico tomando como referencia lo visto anteriormente.
Modelo lineal
\[Y_{ij} =𝜇 + 𝛼_i +𝛽_j +𝜀_{ij}\] Teniendo en cuenta que: \(Y_{ij}\) : es la cobertura vegetal (respuesta) de la j-ésima microcuenca que se le aplicó el i-ésimo métodos de revegetación.
\(𝜇\): es la cobertura vegetal promedio (%)
\(𝛼_i\): es el efecto producido por el i-ésimo método de revegetación sobre la cobertura vegetal promedio (%)
\(𝛽_j\): es el efecto producido por la j-ésima microcuenca sobre la cobertura vegetal promedio (%)
\(𝜀_{ij}\): es el efecto del error aleatorio sobre la j-ésima microcuenca que se le aplicó el i-ésimo métodos de revegetación.
Para la prueba de hipótesis del modelo, se pone a prueba la variabilidad entre los diferentes métodos de revegetación (el efecto) y para las diferentes microcuencas .
\[ H_c: \\ H_0:𝛼_i = 0\forall i \\ H_1:𝛼_i \neq 0 \text{ para algun i} \\ \\ H_c: \\ H_0:𝛽_j = 0\forall j \\ H_1:𝛽_j \neq 0 \text{ para algun j} \]
# Formula = VR ~ Factor + Bloque
veg_aov_b <- aov(cobertura ~ métodos + microcuenca, veg)
summary(veg_aov_b) Df Sum Sq Mean Sq F value Pr(>F)
métodos 3 557.3 185.77 123.431 1.25e-07 ***
microcuenca 3 1.5 0.50 0.332 0.803
Residuals 9 13.5 1.51
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Supuestos
Normalidad
Gráfico Quantil-Quantil
ggplot(augment(veg_aov_b )) +
aes(sample = .resid) + # usando broom para extraer los residuos
geom_qq() +
geom_qq_line() +
labs(x = "Cuantiles teóricos normales",
y = "Cuantiles de residuos ordinarios")Para probar los supuestos debemos correr ANOVA pero sin los bloques
veg_aov <- aov(cobertura~métodos,veg)
shapiro.test(resid(veg_aov))
Shapiro-Wilk normality test
data: resid(veg_aov)
W = 0.96647, p-value = 0.7787
Homoscedasticidad
plot(veg_aov)leveneTest(veg_aov)Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 3 0.0765 0.9715
12
TukeyHSD
tukey_veg<-HSD.test(veg_aov_b, trt = "métodos", console = F)
resultado <- data.frame(metodos = rownames(tukey_veg$groups),
tukey_veg$groups)
flextable(resultado)metodos | cobertura | groups |
|---|---|---|
Hidrosiembra | 64.925 | a |
Mulching orgánico | 60.975 | b |
Siembra directa | 59.000 | b |
Control | 48.925 | c |