setwd("~/Dropbox/ESTADISTICA/SERIES")
datos=read.csv(file="datosst.csv",sep=",",header=TRUE,dec = ".")
h3=datos %>%
select(ends_with("3"))
summary(pc.cr <- princomp(h3,cor=TRUE))
## Importance of components:
## Comp.1 Comp.2 Comp.3 Comp.4
## Standard deviation 1.9729199 0.29224287 0.147696343 1.915723e-02
## Proportion of Variance 0.9731032 0.02135147 0.005453552 9.174991e-05
## Cumulative Proportion 0.9731032 0.99445470 0.999908250 1.000000e+00
attributes(pc.cr)
## $names
## [1] "sdev" "loadings" "center" "scale" "n.obs" "scores" "call"
##
## $class
## [1] "princomp"
loadings(pc.cr)
##
## Loadings:
## Comp.1 Comp.2 Comp.3 Comp.4
## RMSE3 0.505 0.131 0.496 0.694
## sMAPE3 0.498 0.533 -0.684
## MASE3 0.505 0.146 0.454 -0.719
## OWA3 0.492 -0.824 -0.283
##
## Comp.1 Comp.2 Comp.3 Comp.4
## SS loadings 1.00 1.00 1.00 1.00
## Proportion Var 0.25 0.25 0.25 0.25
## Cumulative Var 0.25 0.50 0.75 1.00
plot(pc.cr)
#biplot(pc.cr)
#pc.cr$scores
dd=cbind(method=datos$method,id=datos$id,h3,score=pc.cr$scores[,1])
# asignamos el orden para cada uno de los criterios de error (menor a mayor)
ddd=dd %>%
arrange(RMSE3) %>%
mutate(oRMSE=order(RMSE3))%>%
arrange(sMAPE3) %>%
mutate(osMAPE=order(sMAPE3))%>%
arrange(MASE3) %>%
mutate(oMASE=order(MASE3))%>%
arrange(OWA3) %>%
mutate(oOWA=order(OWA3))%>%
arrange(score) %>%
mutate(oscore=order(score))
ddo = ddd %>%
pivot_longer(cols=8:12,names_to="error",values_to="order")
Ordenación versus error criteria
# Ordenación versus error
g1=ggplot(ddo[ddo$error=="oRMSE",],aes(x=order,y=RMSE3))+
geom_point(size=0.5)+geom_line()
g2=ggplot(ddo[ddo$error=="osMAPE",],aes(x=order,y=sMAPE3))+
geom_point(size=0.5)+geom_line()
g3=ggplot(ddo[ddo$error=="oMASE",],aes(x=order,y=MASE3))+
geom_point(size=0.5)+geom_line()
g4=ggplot(ddo[ddo$error=="oOWA",],aes(x=order,y=OWA3))+
geom_point(size=0.5)+geom_line()
g5=ggplot(ddo[ddo$error=="oscore",],aes(x=order,y=score))+
geom_point(size=0.5)+geom_line()
grid.arrange(g1,g2,g3,g4,g5,ncol=3)
Representamos los métodos ordenados por el score(princomp)
ggplot(ddd,aes(x=fct_reorder(method,oscore),y=score))+
geom_point()+
geom_line()+
geom_vline(aes(xintercept = method[ddd$oscore==10]))+
labs(x="Ordered Method",y="Score")+
coord_flip()
## Warning: Use of `ddd$oscore` is discouraged. Use `oscore` instead.
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?
Score para los mejores 10 métodos (posicionados del 1 al 10)
ddd %>%
filter(oscore<11)%>%
ggplot(aes(x=fct_reorder(method,oscore),y=score))+
geom_point()+
geom_line()+
labs(x="Ordered Method",y="Score")+
coord_flip()
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?
Diversas propuestas de pesos para utilizar en la ponderación de los métodos, usando los scores, donde \(x_1,..., x_n\) son los scores ordenados y \(m\) es el número de métodos a combinar.
\[w_i=\frac{x_i}{\sum_{j=1}^m{x_j}}\] \[wi_i=\frac{1/x_i}{\sum_{j=1}^m{1/x_j}}\] \[d1_i=x_i-x_1\] \[d2_i=\frac{1-(x_i-x_1)}{m-\sum_{j=1}^m{(x_j-x_1)}}\]
pesosi=function(x,m){
v=rep(0,length(x))
for(i in 1:m)
v[i]=(1/x[i])/sum(1/x[1:m])
return(v)
}
pesos=function(x,m){
v=rep(0,length(x))
for(i in 1:m)
v[i]=(x[i])/sum(x[1:m])
return(v)
}
pesosd=function(x,m){
v=rep(0,length(x))
for(i in 1:m)
v[i]=(1-(x[i]-x[1]))/(m-sum(x[1:m]-x[1]))
return(v)
}
distancias=ddd %>%
filter(oscore<11)%>%
arrange(oscore)
m=2
cbind(score=distancias$score,oscore=distancias$oscore,w=pesos(distancias$score,m),
wi=pesosi(distancias$score,m),d1=distancias$score-distancias$score[1],
d2=pesosd(distancias$score,m))
## score oscore w wi d1 d2
## [1,] -1.517523 1 0.503591 0.496409 0.00000000 0.5054697
## [2,] -1.495881 2 0.496409 0.503591 0.02164205 0.4945303
## [3,] -1.201618 3 0.000000 0.000000 0.31590460 0.0000000
## [4,] -1.194922 4 0.000000 0.000000 0.32260130 0.0000000
## [5,] -1.163026 5 0.000000 0.000000 0.35449708 0.0000000
## [6,] -1.147547 6 0.000000 0.000000 0.36997566 0.0000000
## [7,] -1.141259 7 0.000000 0.000000 0.37626400 0.0000000
## [8,] -1.042830 8 0.000000 0.000000 0.47469293 0.0000000
## [9,] -1.042777 9 0.000000 0.000000 0.47474614 0.0000000
## [10,] -1.042777 10 0.000000 0.000000 0.47474614 0.0000000
obs=c(39,60,43)
p1=c(42.89707,54.67645,46.19981)
p2=c(44.02194,56.71832,47.55288)
p=0.5033591*p1+0.496409*p2
mean(abs(p-obs)/obs*100)
## [1] 9.193894
mean(abs(p1-obs)/obs*100)
## [1] 8.76883
mean(abs(p2-obs)/obs*100)
## [1] 9.644776
Calculamos los rangos de las ordenaciones en los 5 criterios. Calculamos el rango=max(order)-min(order) utilizando como datos las ordenaciones en los 5 criterios de error considerados, y lo representamos para cada método.
#Cálculo de los rangos de las posiciones en los 5 criterios
rango=function(x){
r=range(x)
return(r[2]-r[1])
}
ddd$rango=apply(ddd[8:12],1,rango)
ggplot(ddd,aes(x=fct_reorder(method,rango),y=rango))+
geom_point()+
geom_line()+
labs(x="Method",y="Range for orders")+
coord_flip()
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?
Seleccionamos los métodos con rango 0 en las ordenaciones y representamos sus ordenaciones en los 5 criterios.
ddd %>%
filter(rango==0) %>%
pivot_longer(cols=8:12,names_to="error",values_to="order") %>%
ggplot(aes(x=method,y=error))