#---------------------------------------------------------------#
# Leer los datos

data <- read.csv("datatest1.csv", 
               sep=";", 
               dec=",", 
               na.strings=c(".", "NA", "", "?"), 
               strip.white=TRUE, 
               encoding="UTF-8")

data$clase=as.factor(data$clase) # es correcto transformar
                                   # los valeures discretos 
                                   # en factores

#---------------------------------------------------------------#
set.seed(1)
library(caret)
p          <- createDataPartition(y=data$clase,
                                  p= 60/100,list=FALSE)
training   <- data[p,]  
desconocido    <- data[-p,]
q          <- createDataPartition(y=desconocido$clase,
                                  p= 50/100,list=FALSE)
test       <- desconocido[q,]
validation <- desconocido[-q,]


# tipos de variables y lista

# features  predictores all
X_all     <- c("v1", "v2", "v3", "v4",
               "v5", "v6", "v7", "v8","v9", 
                "v10", "v11", "v12")

num_all   <- c("v1", "v2", "v3", "v4", 
               "v5", "v6", "v7", "v8","v9", 
              "v10", "v11", "v12")

y         <- "clase"                   # nuestro destino

#---------------------------------------------------------------#

X_4     <- c("v1", "v2", "v3", "v4")
plot(training[c(X_4, y)], 
     col = training$clase) # vistazo general

#---------------------------------------------------------------#

categorie <- NULL
risk      <- NULL
id        <- NULL
ignore    <- NULL
weights   <- NULL


#---------------------------------------------------------------#
## ANÁLISIS RESUMEN DE FRATURES ##
source("pair_panels.R") # funciones paramétricas de la función de pares
require(stats) # estadísticas básicas
require(graphics) # gráficos básicos
require(dplyr) # librería de manipulación de datos
require(caret) # para predicciones y transformación.
#---------------------------------------------------------------#
pairs(training[c(X_4, y)], # vista de correlaciones
      diag.panel = panel.hist, 
      upper.panel = panel.cor,
      lower.panel = panel.smooth,
      main = "RELATIONS 2 A 2 ENTRE LES FEATURES")

#---------------------------------------------------------------#
pairs(training[c(X_all, y)], # vista de correlaciones
      diag.panel = panel.hist, 
      upper.panel = panel.cor,
      lower.panel = panel.smooth,
      main = "RELACIONES 2 A 2 ENTRE LAS FEATURES")

#---------------------------------------------------------------#

if(require("mRMRe")==FALSE) install.packages("mRMRe")
library(mRMRe) #mRMRe permite paralelizar mRMR
set.thread.count(4) # nivel de paralización

df <- data.frame(data) # el paquete necesita los data frames


df$clase=as.ordered(df$clase) # mRMR solo trata 
                                # factores ordenados

dd <- mRMR.data(df)

#---------------------------------------------------------------#

# usando la función de acceso a la información del paquete
# podemos obtener la matriz de información mutua entre
# variables numéricas

M <-matrix(mim(subsetData(dd, 1:12, 1:12)),nrow = 12, ncol =12)
print(M)
diag(M) <- 0
diag(M) <- max(c(M))
print(M)

heatmap(M, Rowv = NA, Colv = NA) # heatmap

#---------------------------------------------------------------#

num_sol <- 6
num_feature <- 3
conjunto <- mRMR.conjunto(data = dd, 
                          target_indices = c(13),
                          solution_count = num_sol,
                          feature_count = num_feature)

solutions(conjunto)


net         <- new("mRMRe.Network", 
               data = dd, 
               target_indices = c(13),
               levels = c(2, 1), 
               layers = 3)

visualize(net)

#---------------------------------------------------------------#

library(randomForest)
fitControl <- trainControl( ## 10-fold CV
  method = "repeatedcv",
  number = 10,
  ## 10 veces
  repeats = 10)
#---------------------------------------------------------------#

set.seed(1)
modelFit <- randomForest(clase ~ ., 
                         data = training, 
                         importance=TRUE, 
                         cv = fitControl )
predictions <- predict(modelFit,newdata = test)

c <- confusionMatrix(predictions,# cualifación de la predicción
                      test$clase)
print(c[[3]][1]) # extrae accuracy de la matriz de confusión

round(sort(importance(modelFit)[,"MeanDecreaseGini"],decreasing = TRUE),2)

#---------------------------------------------------------------#

for (i in 1:num_sol) {
  set.seed(10)
  features_selection <- solutions(conjunto)[[1]]
  ft <- c(features_selection[,i],13)

  modelFit <- randomForest(clase ~ ., data = training[ft], 
                           importance=TRUE, cv = fitControl)
  pred_1 <- predict(modelFit,newdata = test[ft])
  c <- confusionMatrix(pred_1,# cualificación de la predicción
                     validation[ft]$clase)
  print(features_selection[,i])
  print(c[[3]][1]) # extrae accuracy de la matriz de confusión ]
  }
#---------------------------------------------------------------#


