##  https://cran.r-project.org/web/packages/SOMbrero/vignettes/doc-numericSOM.html
library(SOMbrero)

data(cars, package="datasets")
names(cars)
plot(cars$speed, cars$dist)
dim(cars)

auto<- trainSOM(cars[, c(1,2)],maxit=2000, nb.save=10, dimension=c(3,3), scaling="center")
names(auto)
summary(auto)
auto$clustering; auto$parameters

plot(auto, what="energy")  ## para controlar la convergencia del algoitmo
plot(auto, what="obs", type="hitmap") ## representa gráficamente el tamaño de cada "cluster"
table(auto$clustering) ## es equivalente al gráfico anterior

plot(cars$speed, cars$dist, col=auto$clustering) ## nube de puntos con el grupo asignado

par(mfrow=c(1,2)) ## gráficos de calor para estudiar las relaciones entre las variables
proto<- auto$prototypes ## los prototipos se "parecen" a las variables originales
plot(auto, what="prototypes", type="color", var=1, main="prototypes - speed")
plot(auto, what="prototypes", type="color", var=2, main="prototypes - dist")
par(mfrow=c(1,1))

plot(auto, what="obs", type="lines", print.title=TRUE) ## valor del prototipo en cada variable por neurona de salida
plot(auto, what="prototypes", type="barplot", print.title=TRUE)
plot(iris.som, what="obs", type="radar", key.loc=c(-0.5,5), mar=c(0,10,2,0))
plot(iris.som, what="obs", type="boxplot", print.title=TRUE)
plot(iris.som, what="obs", type="names", print.title=TRUE, scale=c(0.9,0.5))


## gráficos relacionados con distancias
 ## "poly.dist" distancias entre los prototipos "vecinos", mediante polígonos para cada celda del grid. El color representa el número de observaciones en la neurona.
   ## Las celdas más cercanas tienen el vértice del polígono más próximo al borde
 ## "umatrix" distancias de las neuronas a los prototipos vecinos
 ## "smooth.dist" distancias de las neuronas a los prototipos vecinos la gradación del color
 ##  mds plots Utiliza la técnica de Escalas Multidimensionales para representar las neuronas;
 ##  grid.dist representa en el plano cada pareja de prototipos. El eje x= distancia entre prototipos Y= distancia entre la neuronas correspondientes.

plot(iris.som, what="prototypes", type="poly.dist")
plot(iris.som, what="prototypes", type="umatrix")
plot(iris.som, what="prototypes", type="smooth.dist")
plot(auto$backup$prototypes[[10]])
dev.new();plot(auto$backup$prototypes[[1]])

## Gráficos Adicionales
cars$grupo<-  factor(rep(c(1,2,3), c(20,20,10)))
id<- 1:50
g<- table(id, cars$grupo); g[1:10,]
plot(auto, what="add", type="pie", variable=iris$Species) ## gráficos de sectores según una variable de clasificación
plot(auto, what="add", type="words", variable=g) ## g es una tabla de contingencia de individuo por grupo. Indica donde se concentra cada grupo
plot(auto, what="add", type="names", variable= auto$grupo) ## lo mismo que el gráfico anterior

## Ayuda para la clasificación
plot(superClass(auto))  ## dendograma jerárquico ascendente hecho sobre las neuronas
C3 <- superClass(auto, k=3)  ## se agrupan las neuronas de la capa de salida en 3 categorías
summary(C3)
plot(C3, plot.var=FALSE) ## Dendograma marcando que neuronas se han agrupado para formar las tres clases

plot(C3, type="grid", plot.legend=TRUE) ## gráfico de calor de las neuronas en las tres categorías
## se pueden hacer los gráficos anteriores sobre C3
plot(auto, what="add", type="names", variable=rownames(cars), scale=c(0.9,0.5)) ## pone en cada celda el nombre de las observaciones asociadas

par(mfrow=c(1,2)) ## gráfico de calor para estudiar las relaciones entre las variables
plot(auto, what="obs", type="color", var=1, main="valores - x1")
plot(auto, what="obs", type="color", var=2, main="valores - x2")
par(mfrow=c(1,1))

table(auto$clustering)

names(cars)


by(cars$speed, summary)
mean(proto[1:9,2])
summary(cars)
auto$backup

library(abind, pos=18)
library(e1071, pos=19)
numSummary(cars[,"dist"], statistics=c("mean", "sd", "IQR", "quantiles"), quantiles=c(0,.25,.5,.75,1))
numSummary(cars[,"speed"], statistics=c("mean", "sd", "IQR", "quantiles"), quantiles=c(0,.25,.5,.75,1))


pepe<- predict(auto, cars)
table(pepe, auto$clustering)