Análisis de Varianza (ANOVA): Comparación de Tipos de Circuitos

Enunciado

Se determinó el tiempo de respuesta en milisegundos para tres diferentes tipos de circuitos que podrían usarse en un mecanismo de desconexión automática. Los resultados se muestran en la tabla:

Tipo de circuito Tiempos de respuesta (ms)
1 9, 12, 10, 8, 15
2 20, 21, 23, 17, 30
3 6, 5, 8, 16, 7

1. Se desea probar la hipótesis de que los tres tipos de circuitos tienen el mismo tiempo de respuesta utilizando un nivel de significancia \(\alpha = 0.01\).

Crear un dataframe con los datos de la tabla

datos <- data.frame(
  Tipo_de_circuito = rep(c(1, 2, 3), each = 5),
  Tiempo_de_respuesta = c(9, 12, 10, 8, 15, 20, 21, 23, 17, 30, 6, 5, 8, 16, 7)
)
 
print(datos)
##    Tipo_de_circuito Tiempo_de_respuesta
## 1                 1                   9
## 2                 1                  12
## 3                 1                  10
## 4                 1                   8
## 5                 1                  15
## 6                 2                  20
## 7                 2                  21
## 8                 2                  23
## 9                 2                  17
## 10                2                  30
## 11                3                   6
## 12                3                   5
## 13                3                   8
## 14                3                  16
## 15                3                   7

Planteamiento de hipótesis

\[ H_0: \mu_1 = \mu_2 = \mu_3 \]
(Los tiempos promedio de respuesta son iguales para todos los tipos de circuitos)

\[ H_a: \text{Al menos uno de los } \mu_i \text{ es diferente} \]
(Al menos un tipo de circuito tiene un tiempo promedio de respuesta diferente)

model <- aov(Tiempo_de_respuesta~factor(Tipo_de_circuito),data=datos)
summary(model)
##                          Df Sum Sq Mean Sq F value   Pr(>F)    
## factor(Tipo_de_circuito)  2  543.6   271.8   16.08 0.000402 ***
## Residuals                12  202.8    16.9                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • Decisión: Con pv= 0.000402 < 0.01 se rechaza la hipótesis nula.

  • Conclusión: Se puede concluir que existe una diferencia significativa entre los tres tipos de circuito.

Supuestos

1.1 Normalidad

residuos <- residuals(model)
hist(residuos,main="Histograma",col="pink")

qqnorm(residuos)

shapiro.test(residuos)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.87352, p-value = 0.03802
  • Decisión: Con un pv=0.03802 > 0.01 se acepta la hipótesis nula.

  • Conclusión: El modelo cumple con el supuesto de normalidad

1.2 Homocedasticidad

bartlett.test(Tiempo_de_respuesta~factor(Tipo_de_circuito),data=datos)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  Tiempo_de_respuesta by factor(Tipo_de_circuito)
## Bartlett's K-squared = 1.1345, df = 2, p-value = 0.5671
  • Decisión: Con pv= 0.5671 > 0.01 se acepta la hipótesis nula.

  • Conclusión: Se puede concluir que la varianza de los supuestos es constante para todas las combinaciones de niveles de factores.

1.3 Independencia

library(car)
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.2.3
durbinWatsonTest(model)
##  lag Autocorrelation D-W Statistic p-value
##    1      -0.4329389      2.840237   0.222
##  Alternative hypothesis: rho != 0
  • Decisión: Con pv= 0.24 > 0.01 se acepta la hipótesis nula.

  • Conclusión: Se puede concluir que los datos son independientes uno de otro y se cumple el supuesto de independencia.

2. Use la prueba de Tukey para camparar pares de medias de los tratamientos. Utilizar \(\alpha = 0.01\).

tukey <- TukeyHSD(model, conf.level = 0.99)
tukey
##   Tukey multiple comparisons of means
##     99% family-wise confidence level
## 
## Fit: aov(formula = Tiempo_de_respuesta ~ factor(Tipo_de_circuito), data = datos)
## 
## $`factor(Tipo_de_circuito)`
##      diff        lwr       upr     p adj
## 2-1  11.4   2.123163 20.676837 0.0023656
## 3-1  -2.4 -11.676837  6.876837 0.6367043
## 3-2 -13.8 -23.076837 -4.523163 0.0005042
plot(tukey)

  • Comparación 1 : Dado que el valor pv<0.01, la diferencia entre las medias del circuito 2 y el circuito 1 es significativamente diferente.

El circuito 2 tiene un tiempo de respuesta significativamente mayor que el circuito 1.

  • Comparación 2 : Dado que el valor pv> 0.01, no existe una diferencia significativa entre los tiempos de respuesta del circuito 3 y el circuito 1.

  • Comparación 3 : Dado que el valor pv<0.01, la diferencia entre las medias del circuito 3 y el circuito 2 es significativamente diferente.

El circuito 3 tiene un tiempo de respuesta significativamente menor que el circuito 2.

En terminos prácticos esto significa que, los tipos de circuito 3 y 1 tuvieron un mejor tiempo de respuesta (menor tiempo).

3. Si quiere detectarse una diferencia máxima en los tiempos de respuesta promedio de 10 milisegundos con una probabilidad de al menos 0.90 ¿qué tamaño de la muestra deberá usarse?¿Como se obtendrá una estimación puntual de \(\sigma^2\)

Definir función

sample_size <- function(alpha, sigma, dT, k, n0) {
  t_alpha_2 <- qt(1-alpha/2, df = k*(n0-1))
  n <- (2 * (t_alpha_2 ^ 2) * (sigma ^ 2)) / (dT ^2)
  return(ceiling(n))
  }

Probar la función con parámetros establecidos

sample_size(alpha=0.1,sigma=sqrt(16.9),dT=10,k=3,n0=5)
## [1] 2

¿Como se obtendrá una estimación puntual de \(\sigma^2\)

Por medio de la desviación estándar estimada a partir del ANOVA, que es \(\sqrt{16.9} \approx 4.11\).

Potencia de prueba

Fcrit <- function(alpha,nu1,nu2) stats::qf(1-alpha,nu1,nu2)
Fpower1<-function(alpha=NULL, nlev=NULL,nreps=NULL, Delta=NULL, sigma=NULL)
 {
 ##### Power Calculation for one way ANOVA ###########
 # Argument list
 # alpha: the significance level of the test
 # nlev: the number of levels of the factor
 # nreps: the number of replicates in each level of the factor
 # Delta: the size of a practical difference in two cell means
 # sigma: the standard deviation of the experimental error
 #####################################################
 if (is.null(alpha)|is.null(nlev)|is.null(nreps)|is.null(Delta)|is.null(sigma))
 stop("you must supply alpha, nlev, nreps, Delta and sigma")
 css<-(Delta^2)/2
 nc<- (nreps*css)/(sigma^2)
 df1<-nlev-1
 df2<-(nreps-1)*nlev
 power <- 1-stats::pf(Fcrit(alpha,df1,df2),df1,df2,nc)
 result <- cbind(alpha,nlev,nreps, Delta, sigma, power)
 return(result)
 }

Aplicación de función

rmin <-2 # menor número de réplicas que consideramos
rmax <-10 # mayor número de réplicas que consideramos
alpha=0.1
k=3
nreps=rmin:rmax
dT=10
sigma=sqrt(16.9)
power <- Fpower1(alpha,k,nreps,dT,sigma)
power
##       alpha nlev nreps Delta    sigma     power
##  [1,]   0.1    3     2    10 4.110961 0.4175364
##  [2,]   0.1    3     3    10 4.110961 0.6982921
##  [3,]   0.1    3     4    10 4.110961 0.8561776
##  [4,]   0.1    3     5    10 4.110961 0.9353690
##  [5,]   0.1    3     6    10 4.110961 0.9722735
##  [6,]   0.1    3     7    10 4.110961 0.9885480
##  [7,]   0.1    3     8    10 4.110961 0.9954177
##  [8,]   0.1    3     9    10 4.110961 0.9982154
##  [9,]   0.1    3    10    10 4.110961 0.9993211

Conclusión: Se concluyó que con un nivel de significancia de \(\alpha = 0.1\) y un número de niveles (tipos de circuito) \(k = 3\), que se necesita un tamaño de muestra mínimo de 2 para detectar diferencias significativas. Adicionalmente, para garantizar una alta probabilidad de detección de la diferencia (≥ 0.90), se recomienda un mínimo de 4 réplicas en cada nivel del factor.

Reto de Investigación

Un Diseño de Bloques Completamente al Azar (DBCA) es una técnica experimental donde los tratamientos se asignan al azar dentro de cada bloque. Los bloques son grupos de unidades experimentales que son homogéneos respecto a algún factor que podría influir en los resultados. El objetivo del DBCA es minimizar la variabilidad dentro de los bloques, separando los efectos debidos a variaciones entre ellos, lo que permite un análisis más preciso de los tratamientos.

Ejemplo: Si se esta probando diferentes fertilizantes en cultivos y las condiciones del suelo varían en diferentes áreas de la parcela, cada área sería un bloque. Dentro de cada bloque, se asignan los fertilizantes al azar (tratamientos).

Los factores de bloqueo son variables que pueden influir en la respuesta experimental pero no son de interés principal. Se usan para dividir las unidades experimentales en grupos (bloques) que son homogéneos en relación con el factor de bloqueo. Esto permite controlar la variabilidad debida a este factor, mejorando la precisión del experimento.

Ejemplo: En un estudio de productividad de plantas, el clima o el tipo de suelo podría ser un factor de bloqueo.

Un Diseño en Cuadro Latino (DCL) es un diseño experimental que organiza los tratamientos en una tabla cuadrada donde cada fila y cada columna representa un factor de control o de bloqueo. De esta manera, cada tratamiento aparece exactamente una vez en cada fila y cada columna, controlando la variabilidad en dos direcciones.

Ejemplo: Si se tiene 3 fertilizantes (A, B, C) y tres tipos de suelo, se puede organizar los fertilizantes de forma que cada uno aparezca una vez en cada tipo de suelo.

Implementación en R:

library(agricolae)
## Warning: package 'agricolae' was built under R version 4.2.3
# Definir tratamientos
tratamientos <- c("A", "B", "C")

# Crear cuadro latino
diseno <- design.lsd(tratamientos, serie = 1, seed = 123)

# Visualizar el diseño
print(diseno$sketch)
##      [,1] [,2] [,3]
## [1,] "C"  "A"  "B" 
## [2,] "A"  "B"  "C" 
## [3,] "B"  "C"  "A"

Un Diseño en Cuadro Greco-Latino es una extensión del diseño en cuadro latino. Aquí, además de tener filas y columnas, se introduce un tercer factor de control o bloqueo, que aparece una vez en cada fila y columna junto con los otros dos factores. Este diseño se utiliza cuando se *quiere controlar la variabilidad en tres direcciones.

Ejemplo: Si tienes 4 tipos de fertilizantes, 4 tipos de suelo y 4 tipos de riego, un diseño greco-latino podría ayudarte a controlar la variabilidad en los tres factores simultáneamente.

Implementación en R:

fertilizantes <- c("F1", "F2", "F3", "F4")
suelos <- c("S1", "S2", "S3", "S4")
riegos <- c("R1", "R2", "R3", "R4")

# Crear el diseño greco-latino
# Fertilizantes como tratamiento, suelos y riegos como filas y columnas
diseño <- design.graeco(fertilizantes, suelos, serie=1, seed=123)

# Visualizar el diseño (cuadro greco-latino)
print(diseño$sketch)
##      [,1]    [,2]    [,3]    [,4]   
## [1,] "F3 S1" "F1 S3" "F4 S2" "F2 S4"
## [2,] "F1 S2" "F3 S4" "F2 S1" "F4 S3"
## [3,] "F4 S4" "F2 S2" "F3 S3" "F1 S1"
## [4,] "F2 S3" "F4 S1" "F1 S4" "F3 S2"

El Diseño de Bloques Completamente al Azar (DBCA) se utiliza cuando se busca controlar la variabilidad causada por factores externos que no son de interés, pero que pueden afectar el resultado del experimento. Es ideal cuando las unidades experimentales pueden dividirse en grupos (bloques) que son homogéneos con respecto a algún factor que no está bajo estudio pero influye en la respuesta.

Los tratamientos son las condiciones o intervenciones que se desean comparar (por ejemplo, tipos de fertilizantes).

Los bloques son agrupaciones de unidades experimentales con características similares en relación con un factor de variabilidad (por ejemplo, parcelas con similares condiciones de suelo).

La diferencia es que en un Diseño de Bloques Completamente al Azar (DBCA), los bloques agrupan las unidades experimentales para controlar la variabilidad en una sola dirección, mientras que en un Diseño en Cuadro Latino, se controlan dos fuentes de variabilidad (por filas y columnas).

DBCA: Un solo factor de bloqueo. Cuadro Latino: Dos factores de bloqueo (filas y columnas).

En un Diseño en Bloques Completamente al Azar (DBCA), el error aleatorio se reduce porque se agrupan las unidades experimentales en bloques que son homogéneos respecto a algún factor externo que podría afectar la respuesta. Al hacerlo, se separa la variabilidad debida al factor de bloqueo, dejando una variabilidad menor para ser atribuida al azar dentro de cada bloque. Esto mejora la precisión de la comparación entre tratamientos.

Problema de Aplicación

Se hace un estudio sobre la efectividad de tres marcas de atomiza­dor para matar moscas. Para ello, cada producto se aplica a un grupo de 100 moscas, y se cuenta el número de moscas muertas expresado en porcentajes. Se hicieron seis réplicas, pero en días diferentes; por ello, se sospecha que puede haber algún efecto importante debido a esta fuente de variación. Los datos obtenidos se muestran a continuación:

Marca de Atomizador 1 2 3 4 5 6
1 72 65 67 76 68 58
2 55 59 68 70 73 50
3 64 74 61 58 51 69

\[ H_0: \mu_1 = \mu_2 = \mu_3 \]
(La efectividad promedio es igual para los tres tipos de atomizador)

\[ H_a: \text{Al menos uno de los } \mu_i \text{ es diferente} \]
(Al menos un tipo de atomizador tiene una efectividad promedio de respuesta diferente)

\[ Y_{ij} = \mu + \alpha_i + \beta_j + \varepsilon_{ij} \]

Donde:

Crear un dataframe con los datos de la tabla:

# Datos de efectividad de los atomizadores
datos <- data.frame(
  Atomizador = factor(rep(1:3, each = 6)),  # Marca de atomizador
  Dia = factor(rep(1:6, times = 3)),        # Días
  Efectividad = c(72, 65, 67, 75, 62, 73,   # Efectividad del atomizador 1
                  55, 59, 68, 70, 53, 50,   # Efectividad del atomizador 2
                  64, 74, 61, 58, 51, 69)   # Efectividad del atomizador 3
)

Modelo ANOVA

anova_model <- aov(Efectividad ~ Atomizador + Dia, data = datos)
summary(anova_model)
##             Df Sum Sq Mean Sq F value Pr(>F)
## Atomizador   2  296.3  148.17   2.881  0.103
## Dia          5  281.3   56.27   1.094  0.421
## Residuals   10  514.3   51.43

Decisión: Con pv= 0.103 > 0.05 no se rechaza la hipótesis nula.

Conclusión: Se puede concluir que no existe una diferencia significativa en la efectividad promedio de los atomizadores.

No existe evidencia significativa para afirmar que alguno es mejor que otro.

Decisión: Con pv= 0.421 > 0.05 no se rechaza la hipótesis nula.

Conclusión: Se puede concluir que no existe una diferencia significativa en los días que se realizó el experimento.

Supuestos

1.1 Normalidad

residuos <- residuals(anova_model)
hist(residuos,main="Histograma",col="lightblue")

qqnorm(residuos)

shapiro.test(residuos)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.9575, p-value = 0.5541
  • Decisión: Con un pv=0.5541 > 0.05 se acepta la hipótesis nula.

  • Conclusión: El modelo cumple con el supuesto de normalidad.

1.2 Homocedasticidad

  • Prueba de homocedasticidad para los tipos de atomizador.
# Prueba de Bartlett para el factor Atomizador
resultado_bartlett_atomizador <- bartlett.test(Efectividad ~ Atomizador, data = datos)

# Mostrar el resultado
print(resultado_bartlett_atomizador)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  Efectividad by Atomizador
## Bartlett's K-squared = 1.1889, df = 2, p-value = 0.5519
  • Decisión: Con pv= 0.5519 > 0.01 se acepta la hipótesis nula.

  • Conclusión: Se puede concluir que la varianza de los supuestos es constante para todas las combinaciones de niveles de factores.

  • Prueba de homocedasticidad para los días.

resultado_bartlett_dia <- bartlett.test(Efectividad ~ Dia, data = datos)

print(resultado_bartlett_dia)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  Efectividad by Dia
## Bartlett's K-squared = 2.348, df = 5, p-value = 0.7992
  • Decisión: Con pv= 0.7992 > 0.01 se acepta la hipótesis nula.

  • Conclusión: Se puede concluir que la varianza de los supuestos es constante para todas las combinaciones de niveles de factores.

1.3 Independencia

library(car)
durbinWatsonTest(anova_model)
##  lag Autocorrelation D-W Statistic p-value
##    1      0.06723914      1.781864    0.41
##  Alternative hypothesis: rho != 0
  • Decisión: Con pv= 0.41 > 0.01 se acepta la hipótesis nula.

  • Conclusión: Se puede concluir que los datos son independientes uno de otro y se cumple el supuesto de independencia.