# Cargar librerías necesarias
library(ggplot2)
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
# Crear el dataframe
datos <- data.frame(
A = rep(c(-1, 1), each = 4),
B = rep(c(-1, 1), times = 4),
C = c(-1, -1, 1, 1, -1, -1, 1, 1),
Rep1 = c(50, 44, 46, 42, 49, 48, 47, 56),
Rep2 = c(54, 42, 48, 43, 46, 45, 48, 54)
)
# Promedio de réplicas
datos$y <- rowMeans(datos[, c("Rep1", "Rep2")])
modelo <- lm(y ~ A + B + C, data = datos)
step(modelo)
## Start: AIC=28.01
## y ~ A + B + C
##
## Df Sum of Sq RSS AIC
## - C 1 1.125 98.750 26.105
## - B 1 6.125 103.750 26.500
## - A 1 18.000 115.625 27.367
## <none> 97.625 28.014
##
## Step: AIC=26.11
## y ~ A + B
##
## Df Sum of Sq RSS AIC
## - B 1 6.125 104.88 24.587
## - A 1 18.000 116.75 25.445
## <none> 98.75 26.105
##
## Step: AIC=24.59
## y ~ A
##
## Df Sum of Sq RSS AIC
## - A 1 18 122.88 23.854
## <none> 104.88 24.587
##
## Step: AIC=23.85
## y ~ 1
##
## Call:
## lm(formula = y ~ 1, data = datos)
##
## Coefficients:
## (Intercept)
## 47.62
anova(modelo)
## Analysis of Variance Table
##
## Response: y
## Df Sum Sq Mean Sq F value Pr(>F)
## A 1 18.000 18.000 0.7375 0.4389
## B 1 6.125 6.125 0.2510 0.6427
## C 1 1.125 1.125 0.0461 0.8405
## Residuals 4 97.625 24.406
summary(modelo)
##
## Call:
## lm(formula = y ~ A + B + C, data = datos)
##
## Residuals:
## 1 2 3 4 5 6 7 8
## 5.375 -1.875 -0.375 -3.125 -2.125 -1.375 -2.875 6.375
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 47.625 1.747 27.267 1.08e-05 ***
## A 1.500 1.747 0.859 0.439
## B -0.875 1.747 -0.501 0.643
## C 0.375 1.747 0.215 0.841
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.94 on 4 degrees of freedom
## Multiple R-squared: 0.2055, Adjusted R-squared: -0.3904
## F-statistic: 0.3449 on 3 and 4 DF, p-value: 0.7958
# Reordenar para gráficos
datos_largo <- datos %>%
pivot_longer(cols = c("Rep1", "Rep2"), names_to = "Rep", values_to = "Valor")
# Efectos principales
ggplot(datos_largo, aes(x = factor(A), y = Valor)) +
stat_summary(fun = mean, geom = "point") +
stat_summary(fun = mean, geom = "line", aes(group = 1)) +
labs(x = "Factor A", y = "Número de órdenes", title = "Efecto principal de A")

ggplot(datos_largo, aes(x = factor(B), y = Valor)) +
stat_summary(fun = mean, geom = "point") +
stat_summary(fun = mean, geom = "line", aes(group = 1)) +
labs(x = "Factor B", y = "Número de órdenes", title = "Efecto principal de B")

ggplot(datos_largo, aes(x = factor(C), y = Valor)) +
stat_summary(fun = mean, geom = "point") +
stat_summary(fun = mean, geom = "line", aes(group = 1)) +
labs(x = "Factor C", y = "Número de órdenes", title = "Efecto principal de C")

ggplot(datos_largo, aes(x = factor(A), y = Valor, color = factor(B), group = factor(B))) +
stat_summary(fun = mean, geom = "point") +
stat_summary(fun = mean, geom = "line") +
labs(x = "Factor A", y = "Número de órdenes", color = "B", title = "Interacción A:B")

library(ggplot2)
library(dplyr)
library(tidyr)
datos <- data.frame(
Run = 1:8,
A = c("-", "+", "-", "+", "-", "+", "-", "+"),
B = c("-", "-", "+", "+", "-", "-", "+", "+"),
C = c("-", "-", "-", "-", "+", "+", "+", "+"),
Rep1 = c(50, 44, 46, 42, 49, 48, 47, 56),
Rep2 = c(54, 42, 48, 43, 46, 45, 48, 54)
)
datos_largo <- datos %>%
mutate(
Clase = ifelse(A == "-", "3rd", "1st"),
Folleto = ifelse(B == "-", "BW", "Color"),
Precio = ifelse(C == "-", "$19.95", "$24.95")
) %>%
select(Run, Clase, Folleto, Precio, Rep1, Rep2) %>%
pivot_longer(cols = c(Rep1, Rep2), names_to = "Replica", values_to = "Ordenes")
modelo <- aov(Ordenes ~ Clase * Folleto * Precio, data = datos_largo)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## Clase 1 12.25 12.25 4.083 0.077971 .
## Folleto 1 2.25 2.25 0.750 0.411694
## Precio 1 36.00 36.00 12.000 0.008516 **
## Clase:Folleto 1 42.25 42.25 14.083 0.005602 **
## Clase:Precio 1 100.00 100.00 33.333 0.000418 ***
## Folleto:Precio 1 49.00 49.00 16.333 0.003728 **
## Clase:Folleto:Precio 1 4.00 4.00 1.333 0.281537
## Residuals 8 24.00 3.00
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggplot(datos_largo, aes(x = Clase, y = Ordenes, color = Folleto, shape = Precio, group = interaction(Folleto, Precio))) +
stat_summary(fun = mean, geom = "point", size = 3) +
stat_summary(fun = mean, geom = "line") +
theme_minimal() +
labs(title = "Interacciones entre factores", y = "Número de órdenes", x = "Tipo de correo") +
theme(legend.position = "bottom")

# Crear los factores codificados (A y B)
A <- rep(c(-1, -1, 1, 1), each = 6) # Medio de cultivo
B <- rep(c(-1, 1, -1, 1), each = 6) # Tiempo
# Respuesta: crecimiento bacteriano (24 observaciones = 4 condiciones * 6 réplicas)
y <- c(
23, 26, 22, 29, 38, 36, # A = -1, B = -1
28, 29, 25, 27, 38, 30, # A = -1, B = +1
20, 25, 21, 24, 38, 35, # A = +1, B = -1
26, 33, 25, 20, 33, 34 # A = +1, B = +1
)
# Crear data frame
datos <- data.frame(A = factor(A), B = factor(B), y = y)
modelo <- aov(y ~ A * B, data = datos)
summary(modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## A 1 12.0 12.04 0.313 0.582
## B 1 5.0 5.04 0.131 0.721
## A:B 1 1.0 1.04 0.027 0.871
## Residuals 20 769.8 38.49
# Ajustar el modelo
modelo <- lm(y ~ A * B, data = datos)
# Obtener los residuos
res <- resid(modelo)
# 1. Gráfico de residuos vs valores ajustados
plot(fitted(modelo), res,
main = "Residuos vs Valores Ajustados",
xlab = "Valores Ajustados",
ylab = "Residuos")
abline(h = 0, col = "red")

# 2. Gráfico Q-Q para evaluar normalidad
qqnorm(res)
qqline(res, col = "blue")

# 3. Prueba de normalidad (Shapiro-Wilk)
shapiro.test(res)
##
## Shapiro-Wilk normality test
##
## data: res
## W = 0.9301, p-value = 0.09801
# Supongamos que ya tienes el diseño codificado con las columnas A, B, C, D, Bloque y respuesta
# Creamos las variables cuadráticas manualmente para simular curvatura (aunque no hay punto central real)
# 4. Prueba de homocedasticidad (Breusch-Pagan)
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.4.3
## Cargando paquete requerido: zoo
##
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
bptest(modelo)
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 3.2541, df = 3, p-value = 0.3541
# ------------------------------
# Cargar paquetes necesarios
# ------------------------------
library(FrF2)
## Warning: package 'FrF2' was built under R version 4.4.3
## Cargando paquete requerido: DoE.base
## Warning: package 'DoE.base' was built under R version 4.4.3
## Cargando paquete requerido: grid
## Cargando paquete requerido: conf.design
## Registered S3 method overwritten by 'DoE.base':
## method from
## factorize.factor conf.design
##
## Adjuntando el paquete: 'DoE.base'
## The following objects are masked from 'package:stats':
##
## aov, lm
## The following object is masked from 'package:graphics':
##
## plot.design
## The following object is masked from 'package:base':
##
## lengths
library(ggplot2)
library(car)
## Warning: package 'car' was built under R version 4.4.3
## Cargando paquete requerido: carData
##
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
# ------------------------------
# Crear data frame con factores codificados y respuesta
# ------------------------------
factores <- expand.grid(
A = c(-1, 1),
B = c(-1, 1),
C = c(-1, 1),
D = c(-1, 1),
E = c(-1, 1)
)
# Respuesta (rendimiento) del enunciado
respuesta <- c(7,8,8,6,9,10,12,10,34,32,35,30,55,50,52,53,
16,18,15,15,20,21,22,20,40,44,45,41,60,61,65,63)
datos <- cbind(factores, Rendimiento = respuesta)
datos <- as.data.frame(datos)
# Supongamos que ya tienes el diseño codificado con las columnas A, B, C, D, Bloque y respuesta
# Creamos las variables cuadráticas manualmente para simular curvatura (aunque no hay punto central real)
datos$A2 <- as.numeric(as.character(datos$A))^2
datos$B2 <- as.numeric(as.character(datos$B))^2
datos$C2 <- as.numeric(as.character(datos$C))^2
datos$D2 <- as.numeric(as.character(datos$D))^2
# ------------------------------
# (a) Gráfico de probabilidad normal de efectos
# ------------------------------
modelo_full <- lm(Rendimiento ~ (A + B + C + D + E)^5, data = datos)
efectos <- coef(modelo_full)[-1] # quitar el intercepto
qqnorm(efectos, main = "QQ Plot de los efectos")

#qqline(efectos)
df <- data.frame(efectos = efectos)
ggplot(df, aes(x = efectos)) +
geom_histogram(aes(y = ..density..), fill = "blue", color = "black", bins = 15, alpha = 0.6) +
geom_density(color = "red", size = 1) +
labs(title = "Histograma de efectos con densidad ajustada",
x = "Efectos", y = "Densidad") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# ------------------------------
# (b) ANOVA para confirmar significancia
# ------------------------------
anova_modelo <- aov(Rendimiento ~ (A + B + C + D + E)^2, data = datos)
summary(anova_modelo)
## Df Sum Sq Mean Sq F value Pr(>F)
## A 1 5 5 2.126 0.164
## B 1 2 2 0.616 0.444
## C 1 1116 1116 449.321 3.90e-13 ***
## D 1 9214 9214 3708.792 < 2e-16 ***
## E 1 751 751 302.201 8.21e-12 ***
## A:B 1 11 11 4.541 0.049 *
## A:C 1 0 0 0.013 0.912
## A:D 1 4 4 1.522 0.235
## A:E 1 5 5 2.126 0.164
## B:C 1 7 7 2.830 0.112
## B:D 1 3 3 1.019 0.328
## B:E 1 1 1 0.314 0.583
## C:D 1 504 504 202.881 1.66e-10 ***
## C:E 1 2 2 0.616 0.444
## D:E 1 0 0 0.013 0.912
## Residuals 16 40 2
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ------------------------------
# (c) Modelo con efectos significativos
# Supongamos que A, B y C son significativos
# Asegurarse de que las variables sean factores
datos
## A B C D E Rendimiento A2 B2 C2 D2
## 1 -1 -1 -1 -1 -1 7 1 1 1 1
## 2 1 -1 -1 -1 -1 8 1 1 1 1
## 3 -1 1 -1 -1 -1 8 1 1 1 1
## 4 1 1 -1 -1 -1 6 1 1 1 1
## 5 -1 -1 1 -1 -1 9 1 1 1 1
## 6 1 -1 1 -1 -1 10 1 1 1 1
## 7 -1 1 1 -1 -1 12 1 1 1 1
## 8 1 1 1 -1 -1 10 1 1 1 1
## 9 -1 -1 -1 1 -1 34 1 1 1 1
## 10 1 -1 -1 1 -1 32 1 1 1 1
## 11 -1 1 -1 1 -1 35 1 1 1 1
## 12 1 1 -1 1 -1 30 1 1 1 1
## 13 -1 -1 1 1 -1 55 1 1 1 1
## 14 1 -1 1 1 -1 50 1 1 1 1
## 15 -1 1 1 1 -1 52 1 1 1 1
## 16 1 1 1 1 -1 53 1 1 1 1
## 17 -1 -1 -1 -1 1 16 1 1 1 1
## 18 1 -1 -1 -1 1 18 1 1 1 1
## 19 -1 1 -1 -1 1 15 1 1 1 1
## 20 1 1 -1 -1 1 15 1 1 1 1
## 21 -1 -1 1 -1 1 20 1 1 1 1
## 22 1 -1 1 -1 1 21 1 1 1 1
## 23 -1 1 1 -1 1 22 1 1 1 1
## 24 1 1 1 -1 1 20 1 1 1 1
## 25 -1 -1 -1 1 1 40 1 1 1 1
## 26 1 -1 -1 1 1 44 1 1 1 1
## 27 -1 1 -1 1 1 45 1 1 1 1
## 28 1 1 -1 1 1 41 1 1 1 1
## 29 -1 -1 1 1 1 60 1 1 1 1
## 30 1 -1 1 1 1 61 1 1 1 1
## 31 -1 1 1 1 1 65 1 1 1 1
## 32 1 1 1 1 1 63 1 1 1 1
datos$A <- factor(datos$A)
datos$B <- factor(datos$B)
datos$C <- factor(datos$C)
datos$D <- factor(datos$D)
datos$E <- factor(datos$E)
# Modelo con efectos principales y solo las interacciones significativas
modelo_sig <- aov(respuesta ~ C + D + E + A:B + C:D, data = datos)
# Ver resumen si deseas
summary(modelo_sig)
## Df Sum Sq Mean Sq F value Pr(>F)
## C 1 1116 1116 441.000 < 2e-16 ***
## D 1 9214 9214 3640.111 < 2e-16 ***
## E 1 751 751 296.605 5.17e-15 ***
## A:B 3 18 6 2.383 0.0944 .
## C:D 1 504 504 199.123 4.07e-13 ***
## Residuals 24 61 3
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ------------------------------
# (d) Gráfico normal de residuos
# ------------------------------
# Extraer los residuos
residuos <- residuals(modelo_sig)
# Ver los residuos
print(residuos)
## 1 2 3 4 5
## 6.250000e-01 1.250000e+00 1.115774e-14 -7.993606e-15 -1.250000e+00
## 6 7 8 9 10
## -6.250000e-01 1.250000e-01 1.250000e-01 1.625000e+00 -7.500000e-01
## 11 12 13 14 15
## 1.000000e+00 -2.000000e+00 2.875000e+00 -2.500000e+00 -1.750000e+00
## 16 17 18 19 20
## 1.250000e+00 -6.250000e-02 1.562500e+00 -2.687500e+00 -6.875000e-01
## 21 22 23 24 25
## 6.250000e-02 6.875000e-01 4.375000e-01 4.375000e-01 -2.062500e+00
## 26 27 28 29 30
## 1.562500e+00 1.312500e+00 -6.875000e-01 -1.812500e+00 -1.187500e+00
## 31 32
## 1.562500e+00 1.562500e+00
# Opción base R
qqnorm(residuos, main = "QQ Plot de los residuos")

#qqline(residuos, col = "red", lwd = 2)
# ------------------------------
# (e) Gráficos de residuos
# ------------------------------
# Supongamos que ya ajustaste el modelo significativo:
modelo_sig <- aov(respuesta ~ C + D + E + A:B + C:D, data = datos)
# Extraer residuos y valores ajustados
residuos <- residuals(modelo_sig)
predichos <- fitted(modelo_sig)
# Graficar residuos vs valores predichos
plot(predichos, residuos,
main = "Residuos vs Valores Predichos",
xlab = "Valores Predichos",
ylab = "Residuos",
pch = 19, col = "blue")
abline(h = 0, col = "red", lty = 2)

# Graficar residuos vs cada factor
par(mfrow = c(2, 3)) # Mostrar varios gráficos juntos
for (factor in c("A", "B", "C", "D", "E")) {
plot(datos[[factor]], residuos,
main = paste("Residuos vs", factor),
xlab = factor,
ylab = "Residuos",
pch = 19, col = "darkgreen")
abline(h = 0, col = "red", lty = 2)
}
par(mfrow = c(1, 1)) # Restaurar layout

# ------------------------------
# (f) Interpretación de interacciones (ver summary)
# ------------------------------
# Ya incluido en summary(modelo_reducido)
# ------------------------------
# (g) Recomendaciones operativas
# ------------------------------
# Se pueden usar predicciones para identificar configuraciones óptimas
#datos$Predicho <- predict(modelo_reducido)
#datos[order(-datos$Predicho), ][1:5, ] # top 5 combinaciones
# ------------------------------
# (h) Proyección a diseño 2^k y resumen por combinación significativa
# Supongamos que A, B, y C son importantes
datos$ABC <- interaction(datos$A, datos$B, datos$C)
agregado <- aggregate(Rendimiento ~ ABC, data = datos, FUN = function(x) c(prom = mean(x), rango = max(x) - min(x)))
print(agregado)
## ABC Rendimiento.prom Rendimiento.rango
## 1 -1.-1.-1 24.25 33.00
## 2 1.-1.-1 25.50 36.00
## 3 -1.1.-1 25.75 37.00
## 4 1.1.-1 23.00 35.00
## 5 -1.-1.1 36.00 51.00
## 6 1.-1.1 35.50 51.00
## 7 -1.1.1 37.75 53.00
## 8 1.1.1 36.50 53.00
# -------------------------
# Preparar los datos
# -------------------------
tratamientos <- c("(1)", "a", "b", "ab", "c", "ac", "bc", "abc",
"d", "ad", "bd", "abd", "cd", "acd", "bcd", "abcd")
# Codificación de los factores en niveles -1 / +1
factores <- expand.grid(
A = c(-1,1),
B = c(-1,1),
C = c(-1,1),
D = c(-1,1)
)
# Agregar nombre de tratamientos en el mismo orden
factores$Tratamiento <- tratamientos
# Agregar la respuesta de la primera réplica (como pide el ejercicio)
respuesta_I <- c(90, 74, 81, 83, 77, 81, 88, 73,
98, 72, 87, 85, 99, 79, 87, 80)
# -------------------------
# Crear el data frame completo
# -------------------------
datos <- cbind(factores, Y = respuesta_I)
# -------------------------
# Confundir ABCD con bloques
# -------------------------
# ABCD = producto de A*B*C*D: +1 o -1 → define bloque
datos$Bloque <- ifelse(datos$A * datos$B * datos$C * datos$D == 1, "Bloque1", "Bloque2")
datos$Bloque <- as.factor(datos$Bloque)
# Cargar paquetes necesarios
library(dplyr)
# Crear data frame con réplicas
tratamientos <- c("(1)", "a", "b", "ab", "c", "ac", "bc", "abc",
"d", "ad", "bd", "abd", "cd", "acd", "bcd", "abcd")
rep1 <- c(90, 74, 81, 83, 77, 81, 88, 73, 98, 72, 87, 85, 99, 79, 87, 80)
rep2 <- c(93, 78, 85, 80, 78, 80, 82, 70, 95, 76, 83, 86, 90, 75, 84, 80)
# Calcular promedio de ambas réplicas
y <- (rep1 + rep2) / 2
# Crear diseño codificado (4 factores)
diseño <- expand.grid(A = c(-1, 1), B = c(-1, 1),
C = c(-1, 1), D = c(-1, 1))
# Agregar la respuesta
datos <- cbind(diseño, y = y)
# Crear variable de curvatura: número de factores en +1 (nivel alto)
datos$curvatura <- apply(datos[, 1:4], 1, function(x) sum(x == 1))
# Modelo factorial completo (sin curvatura)
modelo_lineal <- lm(y ~ A * B * C * D, data = datos)
# Modelo incluyendo curvatura como covariable
modelo_con_curva <- lm(y ~ A * B * C * D + curvatura, data = datos)
# Ver resúmenes
summary(modelo_con_curva)
##
## Call:
## lm.default(formula = y ~ A * B * C * D + curvatura, data = datos)
##
## Residuals:
## ALL 16 residuals are 0: no residual degrees of freedom!
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 82.78125 NaN NaN NaN
## A -4.53125 NaN NaN NaN
## B -0.65625 NaN NaN NaN
## C -1.34375 NaN NaN NaN
## D 1.96875 NaN NaN NaN
## curvatura NA NA NA NA
## A:B 2.03125 NaN NaN NaN
## A:C 0.34375 NaN NaN NaN
## B:C -0.28125 NaN NaN NaN
## A:D -1.09375 NaN NaN NaN
## B:D -0.09375 NaN NaN NaN
## C:D 0.84375 NaN NaN NaN
## A:B:C -2.59375 NaN NaN NaN
## A:B:D 2.34375 NaN NaN NaN
## A:C:D -0.46875 NaN NaN NaN
## B:C:D -0.46875 NaN NaN NaN
## A:B:C:D 1.21875 NaN NaN NaN
##
## Residual standard error: NaN on 0 degrees of freedom
## Multiple R-squared: 1, Adjusted R-squared: NaN
## F-statistic: NaN on 15 and 0 DF, p-value: NA
# Comparar modelos
anova(modelo_lineal, modelo_con_curva)
## Analysis of Variance Table
##
## Model 1: y ~ A * B * C * D
## Model 2: y ~ A * B * C * D + curvatura
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 0 0
## 2 0 0 0 0
# Diseño factorial 2^5 sin replicación con tres respuestas simuladas
# Cargar paquetes necesarios
library(FrF2) # Para generar el diseño
library(ggplot2) # Para visualización
library(car) # Para ANOVA
# Factores y niveles
factors <- c("SiH2Cl2", "GeH4", "HCl", "B2H6", "Temp")
levels_list <- list(
SiH2Cl2 = c(8.0, 12.0),
GeH4 = c(7.2, 10.8),
HCl = c(3.2, 4.8),
B2H6 = c(4.4, 6.6),
Temp = c(740, 760)
)
# Crear diseño factorial 2^5
set.seed(123)
design <- FrF2(nruns = 32, nfactors = 5, factor.names = factors)
## creating full factorial with 32 runs ...
# Convertir niveles codificados (-1, 1) a niveles reales
for (f in factors) {
low <- levels_list[[f]][1]
high <- levels_list[[f]][2]
design[[f]] <- ifelse(design[[f]] == -1, low, high)
}
# Simular respuestas (sustituye por tus datos reales si los tienes)
design$y1 <- 50 + 5*design$SiH2Cl2 - 2*design$Temp + rnorm(32, 0, 2)
design$y2 <- 100 - 3*design$GeH4 + 1.5*design$B2H6 + rnorm(32, 0, 2)
design$y3 <- 30 + 2*design$HCl + 3*design$Temp + rnorm(32, 0, 2)
# Ajustar modelos lineales para cada respuesta
mod1 <- lm(y1 ~ . -y2 -y3, data = design)
mod2 <- lm(y2 ~ . -y1 -y3, data = design)
mod3 <- lm(y3 ~ . -y1 -y2, data = design)
# ANOVA
summary(aov(mod1))
## Df Sum Sq Mean Sq F value Pr(>F)
## SiH2Cl2 1 3569 3569 966.630 <2e-16 ***
## GeH4 1 0 0 0.042 0.839
## HCl 1 3 3 0.683 0.416
## B2H6 1 12 12 3.122 0.089 .
## Temp 1 12502 12502 3385.712 <2e-16 ***
## Residuals 26 96 4
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(aov(mod2))
## Df Sum Sq Mean Sq F value Pr(>F)
## SiH2Cl2 1 8.7 8.7 2.968 0.0968 .
## GeH4 1 852.4 852.4 291.211 1.22e-15 ***
## HCl 1 13.6 13.6 4.637 0.0407 *
## B2H6 1 100.2 100.2 34.233 3.62e-06 ***
## Temp 1 0.2 0.2 0.072 0.7901
## Residuals 26 76.1 2.9
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(aov(mod3))
## Df Sum Sq Mean Sq F value Pr(>F)
## SiH2Cl2 1 1 1 0.213 0.649
## GeH4 1 0 0 0.010 0.922
## HCl 1 99 99 35.139 2.97e-06 ***
## B2H6 1 0 0 0.045 0.833
## Temp 1 28864 28864 10230.176 < 2e-16 ***
## Residuals 26 73 3
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Opcional: gráfico de efectos para cada respuesta
library(DoE.base)
eff1 <- DanielPlot(mod1, main = "Daniel Plot - y1")
## simulated critical values not available for all requests, used conservative ones

eff2 <- DanielPlot(mod2, main = "Daniel Plot - y2")
## simulated critical values not available for all requests, used conservative ones

eff3 <- DanielPlot(mod3, main = "Daniel Plot - y3")
## simulated critical values not available for all requests, used conservative ones

library(FrF2)
# Crear diseño 2^4 con codificación estándar y orden aleatorio (como en tabla)
design <- FrF2(nruns = 16, nfactors = 4, factor.names = c("A", "B", "C", "D"), randomize = FALSE)
## creating full factorial with 16 runs ...
#actorial completo 2^4 sin aleatorización
design <- FrF2(nruns = 16, nfactors = 4, factor.names = c("A", "B", "C", "D"), randomize = FALSE)
## creating full factorial with 16 runs ...
# Vector de rendimientos (respuesta)
yield <- c(12, 18, 13, 16, 17, 15, 20, 15, 10, 25, 13, 24, 19, 21, 17, 23)
# Agregar la respuesta al diseño
design$Yield <- yield
# Ajustar modelo con interacciones completas hasta el orden 4
modelo <- lm(Yield ~ A*B*C*D, data = design)
# Graficar efectos estimados en gráfico de Daniel (normal probability plot)
par(mfrow=c(1,1))
DanielPlot(modelo, alpha = 0.05, main = "Gráfico de probabilidad normal de los efectos")

library(FrF2)
library(daewr)
## Warning: package 'daewr' was built under R version 4.4.3
design <- FrF2(nruns = 16, nfactors = 4, factor.names = c("A", "B", "C", "D"), randomize = FALSE)
## creating full factorial with 16 runs ...
design$Yield <- c(12, 18, 13, 16, 17, 15, 20, 15, 10, 25, 13, 24, 19, 21, 17, 23)
modelo <- lm(Yield ~ A*B*C*D, data = design)
DanielPlot(modelo, alpha = 0.05)

modelo_reducido <- lm(Yield ~ A + B + D + B:D, data = design)
summary(modelo_reducido)
##
## Call:
## lm.default(formula = Yield ~ A + B + D + B:D, data = design)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.500 -2.375 0.000 2.500 6.250
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.738e+01 9.756e-01 17.810 1.85e-09 ***
## A1 2.250e+00 9.756e-01 2.306 0.0416 *
## B1 2.500e-01 9.756e-01 0.256 0.8025
## D1 1.625e+00 9.756e-01 1.666 0.1240
## B1:D1 4.441e-16 9.756e-01 0.000 1.0000
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.902 on 11 degrees of freedom
## Multiple R-squared: 0.4259, Adjusted R-squared: 0.2171
## F-statistic: 2.04 on 4 and 11 DF, p-value: 0.158
anova(modelo_reducido)
## Analysis of Variance Table
##
## Response: Yield
## Df Sum Sq Mean Sq F value Pr(>F)
## A 1 81.00 81.000 5.3194 0.04156 *
## B 1 1.00 1.000 0.0657 0.80248
## D 1 42.25 42.250 2.7746 0.12396
## B:D 1 0.00 0.000 0.0000 1.00000
## Residuals 11 167.50 15.227
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# 1. Gráfico de residuos vs valores ajustados
plot(modelo_reducido$fitted.values, resid(modelo_reducido),
main = "Residuos vs Valores Ajustados",
xlab = "Valores ajustados", ylab = "Residuos")

#abline(h = 0, col = "red", lty = 2)
# 2. Normal Q-Q plot (residuos)
qqnorm(resid(modelo_reducido), main = "Q-Q Plot de los residuos")

#qqline(resid(modelo_reducido), col = "red")
# 3. Histograma de residuos
hist(resid(modelo_reducido), main = "Histograma de residuos", xlab = "Residuos")

# 4. Prueba de normalidad de Shapiro-Wilk
shapiro.test(resid(modelo_reducido))
##
## Shapiro-Wilk normality test
##
## data: resid(modelo_reducido)
## W = 0.99104, p-value = 0.9996
# 5. Prueba de homocedasticidad (Breusch-Pagan)
library(lmtest)
bptest(modelo_reducido)
##
## studentized Breusch-Pagan test
##
## data: modelo_reducido
## BP = 4.1382, df = 4, p-value = 0.3876
#9.11
# Cargar paquetes si es necesario
# install.packages("dplyr")
library(dplyr)
# Definir los niveles de los factores
botella <- rep(c("Plástico", "28mm", "38mm"), times = 3*3*2)
estante <- rep(c("Permanente", "Pasillo", "Enfriador"), each = 3, times = 6)
trabajador <- rep(c("1", "2", "3"), each = 9, times = 2)
replica <- rep(c("I", "II"), each = 27)
# Datos de tiempo (en minutos)
tiempo <- c(
# Réplica I
3.45, 4.14, 5.80, 4.07, 4.38, 5.48, 4.20, 4.26, 5.67,
4.80, 5.22, 6.21, 4.52, 5.15, 6.25, 4.96, 5.17, 6.03,
4.08, 3.94, 5.14, 4.30, 4.53, 4.99, 4.17, 4.86, 4.85,
# Réplica II
3.36, 4.19, 5.23, 3.52, 4.26, 4.85, 3.68, 4.37, 5.58,
4.40, 4.70, 5.88, 4.44, 4.65, 6.20, 4.39, 4.75, 6.38,
3.65, 4.08, 4.49, 4.04, 4.08, 4.59, 3.88, 4.48, 4.90
)
# Crear el data frame
datos <- data.frame(
Replica = as.factor(replica),
Trabajador = as.factor(trabajador),
Botella = as.factor(botella),
Estante = as.factor(estante),
Tiempo = tiempo
)
# Ajustar modelo factorial con bloques (réplica)
modelo <- aov(Tiempo ~ Botella * Estante * Trabajador + Error(Replica), data = datos)
# Resumen del modelo
summary(modelo)
##
## Error: Replica
## Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 1 1.07 1.07
##
## Error: Within
## Df Sum Sq Mean Sq F value Pr(>F)
## Botella 2 17.751 8.876 241.549 < 2e-16 ***
## Estante 2 0.410 0.205 5.585 0.0096 **
## Trabajador 2 7.663 3.832 104.274 3.82e-13 ***
## Botella:Estante 4 0.116 0.029 0.789 0.5429
## Botella:Trabajador 4 1.679 0.420 11.423 1.74e-05 ***
## Estante:Trabajador 4 0.109 0.027 0.743 0.5712
## Botella:Estante:Trabajador 8 0.553 0.069 1.881 0.1068
## Residuals 26 0.955 0.037
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1