The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
library(gridExtra)
Adjuntando el paquete: 'gridExtra'
The following object is masked from 'package:dplyr':
combine
library(lme4)
Cargando paquete requerido: Matrix
Artículo T.W. Simpson
Lectura de datos
# Lectura de los datosdatos1<-read.table('C:/Users/FBA/OneDrive - Acesco/0. Personales/2. Profesional/20240416 - Maestria en Analítica de Datos/20240726 Diseño de Experimentos/Proyecto Final/Datos_TWSimpson.txt', header =TRUE)datos1$Run<-as.character(datos1$Run)datos1$A<-as.factor(datos1$A)datos1$B<-as.factor(datos1$B)datos1$C<-as.factor(datos1$C)datos1$D<-as.factor(datos1$D)datos1$E<-as.factor(datos1$E)datos1$F<-as.factor(datos1$F)datos1$G<-as.factor(datos1$G)datos1
#Calculamos SN_N por factor por nivelAvgSN_A<-aggregate(SNL~A,data=datosT,mean)AvgSN_B<-aggregate(SNL~B,data=datosT,mean)AvgSN_C<-aggregate(SNL~C,data=datosT,mean)AvgSN_D<-aggregate(SNL~D,data=datosT,mean)AvgSN_A
A SNL
1 1 24.95353
2 2 26.04584
3 3 25.56407
AvgSN_B
B SNL
1 1 25.21347
2 2 25.74524
3 3 25.60474
AvgSN_C
C SNL
1 1 24.72627
2 2 25.85281
3 3 25.98437
AvgSN_D
D SNL
1 1 25.69553
2 2 25.51234
3 3 25.35557
#Calculamos Promedio de media por factor por nivelmedia_A<-aggregate(media~A,data=datosT,mean)media_B<-aggregate(media~B,data=datosT,mean)media_C<-aggregate(media~C,data=datosT,mean)media_D<-aggregate(media~D,data=datosT,mean)media_A
A media
1 1 18.65833
2 2 20.72500
3 3 19.78833
media_B
B media
1 1 19.16667
2 2 20.18750
3 3 19.81750
media_C
C media
1 1 18.35417
2 2 20.25083
3 3 20.56667
media_D
D media
1 1 20.51750
2 2 19.50000
3 3 19.15417
#Graficamos SNL ~ Factoresgg1<-ggplot(AvgSN_A, aes(x=A,y=SNL,group=1))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgSN_A %>%filter(A==which.max(AvgSN_A$SNL)),color="red")+geom_point(data = AvgSN_A %>%filter(A!=which.max(AvgSN_A$SNL)),color="black")+theme_classic()gg2<-ggplot(AvgSN_B, aes(x=B,y=SNL,group=1))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgSN_B %>%filter(B==which.max(AvgSN_B$SNL)),color="red")+geom_point(data = AvgSN_B %>%filter(B!=which.max(AvgSN_B$SNL)),color="black")+theme_classic()gg3<-ggplot(AvgSN_C, aes(x=C,y=SNL,group=1))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgSN_C %>%filter(C==which.max(AvgSN_C$SNL)),color="red")+geom_point(data = AvgSN_C %>%filter(C!=which.max(AvgSN_C$SNL)),color="black")+theme_classic()gg4<-ggplot(AvgSN_D, aes(x=D,y=SNL,group=1))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgSN_D %>%filter(D==which.max(AvgSN_D$SNL)),color="red")+geom_point(data = AvgSN_D %>%filter(D!=which.max(AvgSN_D$SNL)),color="black")+theme_classic()#Graficamos Media ~ Factoresggg1<-ggplot(media_A, aes(x=A,y=media,group=1))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = media_A %>%filter(A==which.max(media_A$media)),color="red")+geom_point(data = media_A %>%filter(A!=which.max(media_A$media)),color="black")+theme_classic()ggg2<-ggplot(media_B, aes(x=B,y=media,group=1))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = media_B %>%filter(B==which.max(media_B$media)),color="red")+geom_point(data = media_B %>%filter(B!=which.max(media_B$media)),color="black")+theme_classic()ggg3<-ggplot(media_C, aes(x=C,y=media,group=1))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = media_C %>%filter(C==which.max(media_C$media)),color="red")+geom_point(data = media_C %>%filter(C!=which.max(media_C$media)),color="black")+theme_classic()ggg4<-ggplot(media_D, aes(x=D,y=media,group=1))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = media_D %>%filter(D==which.max(media_D$media)),color="red")+geom_point(data = media_D %>%filter(D!=which.max(media_D$media)),color="black")+theme_classic()grid.arrange(gg1,gg2,gg3,gg4,ncol=2,nrow=2,bottom="SNL ~ Factores")
Por conclusión las combinaciones de los niveles, que ofrecen el mejor desempeño de Y, para cada factor son:\(A = Medio\),\(B = Medio\),\(C = Alto\) y \(D = Bajo\). Sin embargo de los resultados de la tabla Anova, podemos obtener que los factores con mayor significancia son A y C, para le Taguchi \(L_9\) y para de los factores del Taguchi E y F contemplado como bloques, E y F. Para un \(\alpha=0.05\)
Los datos resultantes del modelo computacional se encuentran en la Tabla 3 del artículo,los cuales se muestran a continuación:
# Lectura de los datosdatos<-read.table('C:/Users/FBA/OneDrive - Acesco/0. Personales/2. Profesional/20240416 - Maestria en Analítica de Datos/20240726 Diseño de Experimentos/Proyecto Final/Datos_Dominguez-Machado.txt', header =TRUE)# recodificamos con los rangos 1:3, según lo indicador en Tabla 2. del artículo.coded <-function(x) ifelse(x ==min(x), 1,ifelse(x ==max(x),3,2))datos <-within(datos, { coded_nBact =coded(nBact) coded_Nc =coded(Nc) coded_Nre =coded(Nre) coded_Ned =coded(Ned) coded_Pswarm =coded(Pswarm) coded_Pcross =coded(Pcross) coded_Pmut =coded(Pmut) })#Designamos factoresdatos$nBact<-as.factor(datos$nBact)datos$Nc<-as.factor(datos$Nc)datos$Nre<-as.factor(datos$Nre)datos$Ned<-as.factor(datos$Ned)datos$Pswarm<-as.factor(datos$Pswarm)datos$Pcross<-as.factor(datos$Pcross)datos$Pmut<-as.factor(datos$Pmut)print(datos)
Para identificar los factores claves. Construimos tabla anova para las variables recodificadas, sin interacción debido a que un diseño taguchi sólo se pueden tener los efectos principales de los factores analizados ver:
fitfn<-aov(AvgNPV ~ nBact + Nc + Nre + Ned + Pswarm + Pcross + Pmut,data=datos)fitpc<-summary(fitfn)# Extraer la tabla ANOVA del resumenaov_edit <- fitpc[[1]]# Calcular la suma total de cuadradostotal_sum_sq <-sum(aov_edit$`Sum Sq`)i<-1# Calcular la contribución porcentualaov_edit$"C(%)"<- aov_edit$`Sum Sq`/ total_sum_sq *100aov_edit$"Rank"<-rank(-aov_edit$"C(%)",ties.method ="min")print(aov_edit)
Residual standard error: 1.4017^{4} on 12 degrees of freedom Multiple R-squared: 0.7944, Adjusted R-squared: 0.5546 F-statistic: 3.313 on 14 and 12 DF, P-value: 0.0221223
Los valores encontrados concuerdan con la Tabla 4 del artículo analizados. Encontramos que los factores clave nBacty $N_ed$ tienen efectos significativos más altos en la variable de respuesta AvgNPV. Coincidiendo con el % de contribución a la explicación del error C(%) más altos y los Pr(>F) de cada factor son estadisticamente significativos para un \(\alpha=0.05\).
Sin embargo, para el estudio en particular, aún cuando los demás factores no son estadisticamente significativos, se incluyen dentro de modelo de predicción porque pueden introducir nueva información al algoritmo
“Although the other factors are not statistically significant, they were kept as they may introduce new information or variations to the colony”, Machado - Domínguez
Análizar datos y reproducir Figura 4
Cálculo de la Razón S/N para los datos del Artículo de Machado-Domínguez. Se utilizará la razón nominal \(SN_N\) teniendo presente que \(s^2 = MSE\). Lo deseable sería calcular el \(SN_L\) sin embargo se desconocen los resultados individuales de las corridas para cada combinación \((y_i)\)
Por lo cual la tabla de datos queda de la siguiente manera:
#Incorporar Columna SN_N en tabla de datosdatos$"SN_N"<-10*log(((datos$AvgNPV)^2)/(summary.lm(fitfn)$sigma^2))datos
Calculamos el \(SN_N\) promedio para cada factor para cada nivel. Por ejemplo, el promedio de \(SN_N\), para el factor \(nBact\) en el nivel 1 es igual a \(SN_N(Level=1)=\) (35.38+ 37.76+38.79+37.08+43.53+36.86+36.92+36.06+38.06)/9 = 37.83
De forma que tenemos los siguientes promedios para \(SN_N\) y \(AvgNPV\) por cada factor, por cada nivel:
#Calculamos SN_N por factor por nivelAvgSN_nBact<-aggregate(SN_N~coded_nBact,data=datos,mean)AvgSN_Nc<-aggregate(SN_N~coded_Nc,data=datos,mean)AvgSN_Nre<-aggregate(SN_N~coded_Nre,data=datos,mean)AvgSN_Ned<-aggregate(SN_N~coded_Ned,data=datos,mean)AvgSN_Pswarm<-aggregate(SN_N~coded_Pswarm,data=datos,mean)AvgSN_Pcross<-aggregate(SN_N~coded_Pcross,data=datos,mean)AvgSN_Pmut<-aggregate(SN_N~coded_Pmut,data=datos,mean)AvgSN_nBact
#Calculamos Promedio de AvgNPV por factor por nivelAvgNPV_nBact<-aggregate(AvgNPV~coded_nBact,data=datos,mean)AvgNPV_Nc<-aggregate(AvgNPV~coded_Nc,data=datos,mean)AvgNPV_Nre<-aggregate(AvgNPV~coded_Nre,data=datos,mean)AvgNPV_Ned<-aggregate(AvgNPV~coded_Ned,data=datos,mean)AvgNPV_Pswarm<-aggregate(AvgNPV~coded_Pswarm,data=datos,mean)AvgNPV_Pcross<-aggregate(AvgNPV~coded_Pcross,data=datos,mean)AvgNPV_Pmut<-aggregate(AvgNPV~coded_Pmut,data=datos,mean)AvgNPV_nBact
Debido a que no se puede utilizar \(SN_L\) para calcular estimar la combinación de niveles de factores que producen el máximo \(AvgNPV\), partiremos del \(SN_N\) para estimar los niveles de los factores que producen el máximo \(AvgNPV\). El cual se obtiene donde el promedio de los \(SN_N\) es el mínimo, en cada nivel por factor.
De manera similar se utiliza el promedio del \(AvgNPV\) para estimar la combinación de niveles de cada factor que producen el máximo de \(AvgNPV\). El cual se obtiene donde el promedio de los \(AvgNPV\) es el máximo, en cada nivel por factor.
Para efectos gráficos se idenficó con el color Rojo los puntos donde el \(SN_N\) es el mínimo G1 y \(AvgNPV\) es el máximo G2.
#Graficamos SN_N ~ Factoresg1<-ggplot(AvgSN_nBact, aes(x=coded_nBact,y=SN_N))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgSN_nBact %>%filter(coded_nBact==which.min(AvgSN_nBact$SN_N)),color="red")+geom_point(data = AvgSN_nBact %>%filter(coded_nBact!=which.min(AvgSN_nBact$SN_N)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgSN_nBact$coded_nBact))g2<-ggplot(AvgSN_Nc, aes(x=coded_Nc,y=SN_N))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgSN_Nc %>%filter(coded_Nc==which.min(AvgSN_Nc$SN_N)),color="red")+geom_point(data = AvgSN_Nc %>%filter(coded_Nc!=which.min(AvgSN_Nc$SN_N)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgSN_Nc$coded_Nc))g3<-ggplot(AvgSN_Nre, aes(x=coded_Nre,y=SN_N))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgSN_Nre %>%filter(coded_Nre==which.min(AvgSN_Nre$SN_N)),color="red")+geom_point(data = AvgSN_Nre %>%filter(coded_Nre!=which.min(AvgSN_Nre$SN_N)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgSN_Nre$coded_Nre))g4<-ggplot(AvgSN_Ned, aes(x=coded_Ned,y=SN_N))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgSN_Ned %>%filter(coded_Ned==which.min(AvgSN_Ned$SN_N)),color="red")+geom_point(data = AvgSN_Ned %>%filter(coded_Ned!=which.min(AvgSN_Ned$SN_N)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgSN_Ned$coded_Ned))g5<-ggplot(AvgSN_Pswarm, aes(x=coded_Pswarm,y=SN_N))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgSN_Pswarm %>%filter(coded_Pswarm==which.min(AvgSN_Pswarm$SN_N)),color="red")+geom_point(data = AvgSN_Pswarm %>%filter(coded_Pswarm!=which.min(AvgSN_Pswarm$SN_N)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgSN_Pswarm$coded_Pswarm))g6<-ggplot(AvgSN_Pcross, aes(x=coded_Pcross,y=SN_N))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgSN_Pcross %>%filter(coded_Pcross==which.min(AvgSN_Pcross$SN_N)),color="red")+geom_point(data = AvgSN_Pcross %>%filter(coded_Pcross!=which.min(AvgSN_Pcross$SN_N)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgSN_Pcross$coded_Pcross))g7<-ggplot(AvgSN_Pmut, aes(x=coded_Pmut,y=SN_N))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgSN_Pmut %>%filter(coded_Pmut==which.min(AvgSN_Pmut$SN_N)),color="red")+geom_point(data = AvgSN_Pmut %>%filter(coded_Pmut!=which.min(AvgSN_Pmut$SN_N)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgSN_Pmut$coded_Pmut))#Graficamos AvgNVP ~ Factoresgg1<-ggplot(AvgNPV_nBact, aes(x=coded_nBact,y=AvgNPV))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgNPV_nBact %>%filter(coded_nBact==which.max(AvgNPV_nBact$AvgNPV)),color="red")+geom_point(data = AvgNPV_nBact %>%filter(coded_nBact!=which.max(AvgNPV_nBact$AvgNPV)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgNPV_nBact$coded_nBact))gg2<-ggplot(AvgNPV_Nc, aes(x=coded_Nc,y=AvgNPV))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgNPV_Nc %>%filter(coded_Nc==which.max(AvgNPV_Nc$AvgNPV)),color="red")+geom_point(data = AvgNPV_Nc %>%filter(coded_Nc!=which.max(AvgNPV_Nc$AvgNPV)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgNPV_Nc$coded_Nc))gg3<-ggplot(AvgNPV_Nre, aes(x=coded_Nre,y=AvgNPV))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgNPV_Nre %>%filter(coded_Nre==which.max(AvgNPV_Nre$AvgNPV)),color="red")+geom_point(data = AvgNPV_Nre %>%filter(coded_Nre!=which.max(AvgNPV_Nre$AvgNPV)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgNPV_Nre$coded_Nre))gg4<-ggplot(AvgNPV_Ned, aes(x=coded_Ned,y=AvgNPV))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgNPV_Ned %>%filter(coded_Ned==which.max(AvgNPV_Ned$AvgNPV)),color="red")+geom_point(data = AvgNPV_Ned %>%filter(coded_Ned!=which.max(AvgNPV_Ned$AvgNPV)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgNPV_Ned$coded_Ned))gg5<-ggplot(AvgNPV_Pswarm, aes(x=coded_Pswarm,y=AvgNPV))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgNPV_Pswarm %>%filter(coded_Pswarm==which.max(AvgNPV_Pswarm$AvgNPV)),color="red")+geom_point(data = AvgNPV_Pswarm %>%filter(coded_Pswarm!=which.max(AvgNPV_Pswarm$AvgNPV)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgNPV_Pswarm$coded_Pswarm))gg6<-ggplot(AvgNPV_Pcross, aes(x=coded_Pcross,y=AvgNPV))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgNPV_Pcross %>%filter(coded_Pcross==which.max(AvgNPV_Pcross$AvgNPV)),color="red")+geom_point(data = AvgNPV_Pcross %>%filter(coded_Pcross!=which.max(AvgNPV_Pcross$AvgNPV)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgNPV_Pcross$coded_Pcross))gg7<-ggplot(AvgNPV_Pmut, aes(x=coded_Pmut,y=AvgNPV))+geom_smooth(method ="lm",formula = y ~ x +I(x^2),se=FALSE)+geom_point(data = AvgNPV_Pmut %>%filter(coded_Pmut==which.max(AvgNPV_Pmut$AvgNPV)),color="red")+geom_point(data = AvgNPV_Pmut %>%filter(coded_Pmut!=which.max(AvgNPV_Pmut$AvgNPV)),color="black")+theme_classic()+scale_x_continuous(breaks=unique(AvgNPV_Pmut$coded_Pmut))G1<-grid.arrange(g1,g2,g3,g4,g5,g6,g7,ncol=4,nrow=2,bottom="Efectos SN_N")
La fila “Delta” representa la diferencia máxima entre las respuestas de nivel. Estas diferencias se clasifican de 1 a 7, siendo 7 el rango para el valor máximo de AvgNPV. Puede ser consultado en la Tabla 5 ## Conclusiones
El método taguchi permite simplificar la cantidad de experimentos realizados. Logrando reducir significativamente el numero de combinaciones de factores a ejecutar. Adicionalmente, provee un método para determinar los parámetros preferidos mediante el signal-to-noiseo SNdonde los niveles de cada factor son optimos para maximizar la relación SN
También se puede percibir, que los niveles optimos para cada factor seleccionados, bajo la metodología de “Razón promedio” y a través de las gráficos de `SN~ Factor, coinciden entre sí.
Citas
Machado-Domínguez, L.F., Paternina-Arboleda, C.D., Vélez, J.I. et al. An adaptative bacterial foraging optimization algorithm for solving the MRCPSP with discounted cash flows. TOP 30, 221–248 (2022). Click