Respuesta en un vector
En esta sección vamos a aprender algunos conceptos previos del diseños experimental necesario para no solo entender la tabla del análisis de varianza sino tambien del modelo lineal asociado a cada diseño. En principio crearemos un vector de datos recolectados de un ensayo donde todas las unidades experimentales fueron sometidoas al mismo tratamiento. Se denota con \(y_i\) al vector que contiene todos los datos de una respuesta asociada al rendimiento de un cultivo. Se denotará la media del vector como \(\bar{y}\) y como \(\epsilon_{i}\) al vector de residuales o efectos individuales. Este vector es simplemente cada uno de los desvíos de la respuesta respecto de la media global, es decir
\[\epsilon_{i}=y_i-\bar{y}\]
# Generar un vector de datos
set.seed(2024)
datos <- round(rnorm(120,3,0.3),2)
# Calcular la media del vector
media <- mean(datos)
# Restar la media de cada elemento del vector para obtener el vector de efectos individuales
vector_efectos <- datos - media
# Crear un data table con los datos originales y el vector de efectos individuales
tabla_datos <- data.table(
Datos_Originales = datos,
Efectos_Individuales = round(vector_efectos,2)
)
# Mostrar la tabla interactiva utilizando la librería DT con el color azul marino claro
datatable(tabla_datos, options = list(pageLength = 5, autoWidth = TRUE ))
Efectos Individuales:
Según la definción, como la causa es común en el sentido que todas las observaciones fueron sometidas al mismo tratamiento, el vector de efectos representa los efectos individuales que tuvo el tratamiento sobre cada observación.
colors=ifelse(tabla_datos$Efectos_Individuales>0, "darkgreen", "darkred")
dotplot(tabla_datos$Efectos_Individuales, main = "Dotplot de Efectos Individuales", xlab = "Efectos Individuales", col = colors, pch = 19)
densityplot(~ Efectos_Individuales, data = tabla_datos, main = "Gráfico de Densidad de Efectos Individuales", xlab = "Efectos Individuales", col = "blue", plot.points = FALSE)
Efectos de Tratamientos-Un Factor:
En el ejemplo anterior, solo se tenía un tratamiento, ahora, imaginemos que tenemos un FACTOR asoaciado a la fertilización , donde tenemos dos niveles, el primero, aplicación de Biochar y el segundo aplicación de 15:15:15. Ahora es necesario calcular el efecto de cada uno de los tratamientos, y los efectos individuales dentro de cada tratamiento. Las observaciones se la respuesta ahora tienen dos subíndices, uno para identificar las observaciones dentro de cada tratamiento y otro para identificar el tratamiento, de modo que ahora la respuesta se denora como \(y_{ij}\), con \(i=1,\cdots,60\) y \(j=1,\cdots,2\), lo que genera \(n=60*2=120\) observaciones.
De este modo
tabla_datos$tratamientos=gl(2,60,120, labels = c("Biochar","15:15:15"))
bwplot(tabla_datos$Efectos_Individuales~tabla_datos$tratamientos , main = "Distribución de los desvíos de tratamientos", ylab = "Efecto", pch = 19,
panel = function(...) {
panel.bwplot(...)
panel.abline(h = 0, col = "red", lwd = 2, lty = 2)
},
col = c("orange", "lightgreen"))
Lo que perciben en el diagrama de caja es la distribución de los desvíos
de cada tratamientos, pues recuerde que al existir solo dos tratamientos
en nuestro caso , solo existen dos efectos de tratamiento, esto se puede
ilustrar en la siguiente imagen:
tabla_datos$tratamientos=gl(2,60,120, labels = c("Biochar","15:15:15"))
medias=c(tapply(tabla_datos$Datos_Originales,tabla_datos$tratamientos,mean))
medias_efectos=medias-media
bwplot(tabla_datos$Datos_Originales ~tabla_datos$tratamientos , main = "Distribución de los desvíos de tratamientos", ylab = "Efecto", pch = 19,
panel = function(...) {
panel.bwplot(...)
panel.abline(h = mean(tabla_datos$Datos_Originales), col = "blue", lwd = 2, lty = 2)
panel.points(x = rep(1, length(medias)), y = medias["Biochar"], col = "black", pch = 3, cex = 1.5)
panel.points(x = rep(2, length(medias)), y = medias["15:15:15"], col = "black", pch = 3, cex = 1.5)
panel.text(x =1:2, y = medias+0.5, labels=round(medias_efectos,4),cex = 0.95)
},
col = c("red", "lightgreen"))
No olviden que los puntos representan las medianas y las cruces los promedios. Los efectos positivo y negativos para que su suma sea cero.
Efectos de Tratamientos-Dos Factores:
Aparte de la fertilización, utilizaremos un nuevo factor que es la densidad de siembra, con tres niveles: con separación entre plantas e hileras de 30 cm, D30, con separación entre plantas e hileras de 35 cm, D35 y de 40 cm, D40. Esa la agregamos en el data.frame() como:
tabla_datos$Densidad=gl(3,20,120, labels = c("D30","D35","D40"))
Ahora los tratamientos no se conforman por un solo factor como en el caso anterior, ahora es necesario combinar todos los niveles de los dos factores para tener los tratamientos, que en nuestro caso ahora son 6, por lo que ahora el vector de respuestas se etiqueta como \(y_{ikj}\), donde \((i=1,\cdots,r);i=1,\cdots,20\) porque nos quedan solo 20 observaciones por cada tratamiento.
En los que respecta a promedios, tenemos:
La siguiente tabla presenta las medias de cada tratamiento:
tabla_datos$fertiliz=gl(2,60,120, labels = c("Biochar","15:15:15"))
tapply(tabla_datos$Datos_Originales, list(tabla_datos$fertiliz,tabla_datos$Densidad),mean)
## D30 D35 D40
## Biochar 2.9115 2.9710 3.0095
## 15:15:15 3.0455 2.9355 3.0280
tbl=tapply(tabla_datos$Datos_Originales, list(tabla_datos$fertiliz,tabla_datos$Densidad),mean)
tblm=addmargins(tbl,FUN = mean)
## Margins computed over dimensions
## in the following order:
## 1:
## 2:
tblm=round(tblm,3)
datatable(tblm, options = list(pageLength = 5, autoWidth = TRUE))
media_global <- tblm[nrow(tblm), ncol(tblm)]
# Restar la media global de cada valor en la tabla
tbl_ajustada <- round(tblm - media_global,6) # Mostrar la tabla ajustada utilizando la librería DT
datatable(tbl_ajustada, options = list(pageLength = 5, autoWidth = TRUE))
Como pueden ver en la tabla de medias, los promedios marginales de la Fertlización generan una mayor respuesta media para la aplicación de 15:15:15, y en el caso de la densidad de siembra, el mayor promedio se corresponde con D40, sin embargo, los promedios bivariados, el mayor promedio se corresponde con D30 y 15:15:15, esto sugiere que existe interacción entre la fertilización y la densidad de siembra, de ahi la ventaja de distinguir los promedios marginales de promedios conjuntos.
mf=tapply(tabla_datos$Datos_Originales, tabla_datos$fertiliz,mean)
md=tapply(tabla_datos$Datos_Originales, tabla_datos$Densidad,mean)
tabla_datos$trt=interaction(tabla_datos$fertiliz,tabla_datos$Densidad)
bwplot(tabla_datos$Datos_Originales ~tabla_datos$fertiliz|tabla_datos$Densidad , main = "Distribución bivariada de la respuesta", ylab = "Respuesta ", pch = 19,
panel = function(...) {
panel.bwplot(...)
panel.abline(h = mean(tabla_datos$Datos_Originales), col = "blue", lwd = 2, lty = 2)
},
col = c("red", "lightgreen"))