Evaluando Efectos

Efecto

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 el diccionario de la Real Acedmía Española:
    • Aquello que sigue por virtud de una causa

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

  • \(\bar{y}:\) representa la media global
  • \(\bar{y_{j}}:\) representa la media del j-ésimo tratamiento (j=1,,t) ((t=2) en nuestro caso)
  • \(\bar{y_{j}-\bar{y}}:\)representa el efecto de cada tratamiento
  • \(y_{ij}-\bar{y_{j}}:\)representa el efecto individual de cada tratamiento (i=1,,r) (n=rt=602=120))
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:

  • \(\bar{y}:\) representa la media global
  • \(\bar{y_{j}}:\) representa la media del j-ésimo nivel del factor del fertilizante \((j=1,\cdots,t)\) ((t=2) en nuestro caso)
  • \(\bar{y_{j}}-\bar{y}:\)representa el efecto del factor de fertilización
  • \(\bar{y_{k}}:\) representa la media del k-ésimo nivel del factor de la densidad \((k=1,\cdots,s)\) ((s=3) en nuestro caso)
  • \(\bar{y_{k}}-\bar{y}:\)representa el efecto del factor de la densidad de siembra
  • \(\bar{y_{jk}}\) la media de cada tratamiento
  • \(\bar{y_{jk}-\bar{y}}:\)representa el efecto de cada tratamiento (involucra ambos factores)
  • \(\bar{y_{ijk}-\bar{y_{jk}}}:\)representa el efecto individual de cada observación respecto a cada tratamiento.

La siguiente tabla presenta las medias de cada tratamiento:

Promedios de Tratamientos

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

Promedios de cada factor y tratamientos

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

Tabla de efectos

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

Entendiendo la posible interacción

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