6 Annexe
6.1 Annexe 1 : Importation des données brutes
> library(tidyr) # pivot longer & pivot_wider
> # Importation des donnees SPIR Global ####
> data_SPIR_Ed <- read.table(file = "SPIR_Global.csv",
+ header = T, sep = ";", stringsAsFactors = T, row.names = 1,
+ na.strings = c("", "NA"), dec = ",")
> # Creation des colonne 'code' de data_SPIR_Ed
> code_labo <- rownames(data_SPIR_Ed)
> names(data_SPIR_Ed)[1] = c("code_variete")
> names(data_SPIR_Ed)[2] = c("code_agri")
> data_SPIR_Ed$code_nbr_rep <- factor(substr(code_labo,
+ 8, 8))
> data_SPIR_Ed$code_ech_arbre <- factor(substr(code_labo,
+ 1, 2))
> data_SPIR_Ed$code_ech_feuille <- factor(substr(code_labo,
+ 1, 3))
> data_SPIR_Ed$code_rep_feuille <- factor(paste(data_SPIR_Ed$code_ech_feuille,
+ data_SPIR_Ed$code_nbr_rep, sep = ""))
> rm(code_labo)
> data_SPIR_Ed <- data_SPIR_Ed[!is.na(data_SPIR_Ed$X350),
+ ]
> # Importation et preparation des resultats de la
> # Qpcr Globaux ####
> data_Qpcr_Ed <- read.table(file = "qPCR_global_Ed.csv",
+ header = T, sep = ";", stringsAsFactors = T, row.names = 1,
+ na.strings = c("", "NA"), dec = ",")
> # on stocke les noms d'echantillons positifs selon
> # nos 2 seuils de Ct (cycle de qPCR ), a savoir
> # moins de 32 cyclces et moins de 36 cycles qPCR
> seuils <- c(32, 36)
> trueP <- lapply(seuils, function(x) unique(data_Qpcr_Ed$Sample.Name[which(data_Qpcr_Ed$C..Mean <
+ x & data_Qpcr_Ed$C..SD < 1)]))
> names(trueP) <- paste("seuil", seuils, sep = ".")
> data_SPIR_Ed[paste("qPCR", seuils, sep = "_")] <- lapply(trueP,
+ function(x) as.numeric(data_SPIR_Ed$code_ech_arbre %in%
+ x))
> # on cherche quels sont les code_ech_arbre qui se
> # trouvent dans le vecteur x x reprenant
> # automatiquement les noms des arbres positifs
> # selon le seuil choisi
> select.lambda <- grep("^X", names(data_SPIR_Ed))
> data_SPIR_Ed <- data_SPIR_Ed[, c(names(data_SPIR_Ed)[-select.lambda],
+ names(data_SPIR_Ed)[select.lambda])]
> rm(data_Qpcr_Ed, select.lambda, seuils)
> data_SPIR_Ed[c("qPCR_32", "qPCR_36")] <- lapply(data_SPIR_Ed[c("qPCR_32",
+ "qPCR_36")], factor)
> # Format_long ####
> select.lambda <- grep("^X", names(data_SPIR_Ed))
> data_long_Ed <- pivot_longer(data = data_SPIR_Ed, cols = select.lambda,
+ values_to = "reflectance", names_to = "lambda")
> data_long_Ed$lambda <- as.numeric(gsub("X", "", data_long_Ed$lambda))
> data_long_Ed <- data_long_Ed[!is.na(data_long_Ed$reflectance),
+ ]
6.2 Annexe 2 : Fonction Matrice de confusion
> fct_ConfusionMatrix <- function(nb.rep, seuil.ct, list.feuilles) {
+ maliste <- lapply(list.feuilles, function(feuille) {
+ list_svm <- feuille[sample(1:length(feuille$code_ech_feuille),
+ nb.rep), ]
+ # on fait ça pour tte les feuilles mais tjrs en
+ # choisissant le nombre de rep tire aleatoirement
+ code <- grep("^code_ech", names(list_svm))
+ qPCR <- grep("^qPCR_", names(list_svm))
+ sortie <- cbind.data.frame(unique(list_svm[c(code,
+ qPCR)]), matrix(apply(list_svm[-(which(colnames(list_svm) ==
+ "code_variete"):which(colnames(list_svm) ==
+ "qPCR_36"))], 2, mean), nr = 1, dimnames = list(NULL,
+ names(list_svm)[-(which(colnames(list_svm) ==
+ "code_variete"):which(colnames(list_svm) ==
+ "qPCR_36"))])))
+ sortie
+ })
+ test_ed <- do.call(rbind, maliste) # on colle toute les listes créées précédement
+ test_ed <- test_ed[-(which(colnames(test_ed) ==
+ "qPCR_32"))]
+ test_ed[[paste0("qPCR_", seuil.ct)]] <- as.numeric(as.character(test_ed[[paste0("qPCR_",
+ seuil.ct)]]))
+ decoup <- sample.split(test_ed[, paste0("qPCR_",
+ seuil.ct)], SplitRatio = 0.5) # on decoupe le jeu de donné en training set et test set
+ training_set <- test_ed[decoup, ]
+ test_set <- test_ed[!decoup, ]
+ # Criteres choisi pour la separation des donnees
+ crit.pos <- 0.4
+ crit.neg <- 0.35
+ trueP$seuil.32 <- NULL
+ # Prediction RF ####
+ model_rf_36 <- randomForest(x = training_set[,
+ grep("^X", names(training_set))], y = training_set[[paste0("qPCR_",
+ seuil.ct)]], ntree = 100)
+ # Prediction sur les feuilles de la base
+ # d'apprentissage
+ rf_pred <- test_set
+ rf_pred$rf_pred_36 <- predict(model_rf_36, newdata = test_set,
+ decision.values = T)
+ # Conversion des resultats de la prediction en
+ # numerique
+ rf_pred$rf_pred_36 = as.numeric(as.character(rf_pred$rf_pred_36))
+ # Moyennage des resultats de la prediction pour
+ # chaque arbres
+ rf_pred_arbres_36 = aggregate(rf_pred_36 ~ code_ech_arbre,
+ data = rf_pred, mean, na.rm = T)
+ rf_pred_arbres_36$crit <- 0.5
+ rf_pred_arbres_36$crit[rf_pred_arbres_36$rf_pred_36 >=
+ crit.pos] <- 1
+ rf_pred_arbres_36$crit[rf_pred_arbres_36$rf_pred_36 <=
+ crit.neg] <- 0
+ # Creation d'une nouvelle colonne des resulats issu
+ # de la qPCR, pour comparer à la valeurs predite
+ rf_pred_arbres_36[paste("qPCR", seuil.ct, sep = "_")] <- lapply(trueP,
+ function(x) as.numeric(rf_pred_arbres_36$code_ech_arbre %in%
+ x))
+ # Résultats de la prédiction sous forme de matrice
+ # de confusion
+ rf_pred_arbres_36$crit <- factor(rf_pred_arbres_36$crit,
+ levels = c(0, 1))
+ rf_confusion_matrix_36 <- ftable(qPCR_36 ~ crit,
+ data = rf_pred_arbres_36)
+ rf_confusion_matrix_36 <- as.matrix(rf_confusion_matrix_36)
+ TP_rf <- rf_confusion_matrix_36[1, 1]
+ TN_rf <- rf_confusion_matrix_36[2, 2]
+ FN_rf <- rf_confusion_matrix_36[2, 1]
+ FP_rf <- rf_confusion_matrix_36[1, 2]
+ # Calcul des parametres rf de la matrice de
+ # confusion
+ Accuracy_rf36 <- ((TP_rf + TN_rf)/(TP_rf + TN_rf +
+ FN_rf + FP_rf) * 100)
+ Precision_rf36 <- ((TP_rf/(TP_rf + FP_rf) * 100))
+ Sensitivity_rf36 <- ((TP_rf/(TP_rf + FN_rf) * 100))
+ Parametre_rf_36 <- rbind(Accuracy_rf36, Precision_rf36,
+ Sensitivity_rf36)
+ # Prediction SVM ####
+ model_SVM_36 <- svm(y = training_set[, paste0("qPCR_",
+ seuil.ct)], x = training_set[, grep("^X", names(training_set))],
+ type = "C-classification", kernel = "linear")
+ # Prediction sur le test_set
+ svm_pred <- test_set
+ svm_pred$svm_pred_36 <- predict(model_SVM_36, newdata = test_set[,
+ grep("^X", names(test_set))], decision.values = T)
+ # Conversion des resultats de la prediction en
+ # numerique
+ svm_pred$svm_pred_36 = as.numeric(as.character(svm_pred$svm_pred_36))
+ # Moyennage des resultats de la prediction pour
+ # chaque arbres
+ svm_pred_arbres_36 = aggregate(svm_pred_36 ~ code_ech_arbre,
+ data = svm_pred, mean, na.rm = T)
+ # Critere choisi sur les observations graphiques
+ svm_pred_arbres_36$crit <- 0.5
+ svm_pred_arbres_36$crit[svm_pred_arbres_36$svm_pred_36 >=
+ crit.pos] <- 1
+ svm_pred_arbres_36$crit[svm_pred_arbres_36$svm_pred_36 <=
+ crit.neg] <- 0
+ # Creation d'une nouvelle colonne des resulats issu
+ # de la qPCR, pour comparer à la valeurs predite
+ svm_pred_arbres_36[paste("qPCR", seuil.ct, sep = "_")] <- lapply(trueP,
+ function(x) as.numeric(svm_pred_arbres_36$code_ech_arbre %in%
+ x))
+ # Résultats de la prédiction sous forme de matrice
+ # de confusion
+ svm_pred_arbres_36$crit <- factor(svm_pred_arbres_36$crit,
+ levels = c(0, 1))
+ svm_confusion_matrix_36 <- ftable(qPCR_36 ~ crit,
+ data = svm_pred_arbres_36)
+ svm_confusion_matrix_36 <- as.matrix(svm_confusion_matrix_36)
+ TP_svm <- svm_confusion_matrix_36[1, 1]
+ TN_svm <- svm_confusion_matrix_36[2, 2]
+ FN_svm <- svm_confusion_matrix_36[2, 1]
+ FP_svm <- svm_confusion_matrix_36[1, 2]
+ # Calcul des parametres svm de la matrice de
+ # confusion
+ Accuracy_svm36 <- ((TP_svm + TN_svm)/(TP_svm +
+ TN_svm + FN_svm + FP_svm) * 100)
+ Precision_svm36 <- ((TP_svm/(TP_svm + FP_svm) *
+ 100))
+ Sensitivity_svm36 <- ((TP_svm/(TP_svm + FN_svm) *
+ 100))
+ Parametre_svm_36 <- rbind(Accuracy_svm36, Precision_svm36,
+ Sensitivity_svm36)
+ # Prediction PLS ####
+ model_pls_36 <- plsr(training_set[[paste0("qPCR_",
+ seuil.ct)]] ~ ., data = training_set[, grep("^X",
+ names(training_set))], scale = TRUE, validation = "CV")
+ # Prediction
+ pls_pred <- test_set
+ # Prediction sur les feuilles de la base
+ # d'apprentissage
+ pls_pred$pls_pred_36 <- predict(model_pls_36, newdata = test_set[,
+ grep("^X", names(test_set))], decision.values = T,
+ ncomp = 100)
+ # Conversion des resultats de la prediction en
+ # numerique
+ pls_pred$pls_pred_36 = as.numeric(as.character(pls_pred$pls_pred_36))
+ # Moyennage des resultats de la prediction pour
+ # chaque arbres
+ pls_pred_arbres_36 = aggregate(pls_pred_36 ~ code_ech_arbre,
+ data = pls_pred, mean, na.rm = T)
+ # Parametrage pour presentation graphique et la
+ # matrice de confusion
+ pls_pred_arbres_36$crit <- 0.5
+ pls_pred_arbres_36$crit[pls_pred_arbres_36$pls_pred_36 >=
+ crit.pos] <- 1
+ pls_pred_arbres_36$crit[pls_pred_arbres_36$pls_pred_36 <=
+ crit.neg] <- 0
+ # Creation d'une nouvelle colonne des resulats issu
+ # de la qPCR, pour comparer à la valeurs predite
+ pls_pred_arbres_36[paste("qPCR", seuil.ct, sep = "_")] <- lapply(trueP,
+ function(x) as.numeric(pls_pred_arbres_36$code_ech_arbre %in%
+ x))
+ # Résultats de la prédiction sous forme de matrice
+ # de confusion
+ pls_pred_arbres_36$crit <- factor(pls_pred_arbres_36$crit,
+ levels = c(0, 1))
+ pls_confusion_matrix_36 <- ftable(qPCR_36 ~ crit,
+ data = pls_pred_arbres_36)
+ pls_confusion_matrix_36 <- as.matrix(pls_confusion_matrix_36)
+ TP_pls <- pls_confusion_matrix_36[1, 1]
+ TN_pls <- pls_confusion_matrix_36[2, 2]
+ FN_pls <- pls_confusion_matrix_36[2, 1]
+ FP_pls <- pls_confusion_matrix_36[1, 2]
+ # Calcul des parametres pls de la matrice de
+ # confusion
+ Accuracy_pls36 <- ((TP_pls + TN_pls)/(TP_pls +
+ TN_pls + FN_pls + FP_pls) * 100)
+ Precision_pls36 <- ((TP_pls/(TP_pls + FP_pls) *
+ 100))
+ Sensitivity_pls36 <- ((TP_pls/(TP_pls + FN_pls) *
+ 100))
+ Parametre_pls_36 <- rbind(Accuracy_pls36, Precision_pls36,
+ Sensitivity_pls36)
+ parametre_36 <- rbind(Parametre_rf_36, Parametre_svm_36,
+ Parametre_pls_36)
+ All_parametre_36 <- as.vector(parametre_36)
+ names(All_parametre_36) <- c(rownames(parametre_36))
+ All_parametre_36
+ }
6.3 Annexe 3 : Matrice de confusion des 3 méthodes de machin learning
> # Library ####
> library(pls) # package pls
> library(randomForest) # package RF
> library(e1071) # package SVM
> library(tidyr) # pivot longer & pivot wider
> library(snowfall) # Utilisation du calcul paralell pour optimiser la vitesse de calcul
> # Importation des fonctions utiles
> source(file = "Fct_ConfusionMatrix_ct36.R") # Annex 2
> nb.simu <- 100 # Minimu 1000 simu
> rep.max <- 6 # nombre de repetition SPIR sur les feuilles , maximum 6
> Tirage <- split(data_SPIR_Ed, data_SPIR_Ed$code_ech_feuille,
+ drop = T) # drop = T pour enlever les tiroirs vides !!
> # Calcul parralelle
> sfInit(parallel = T, cpus = 4) # optimisation des processeurs sur les 4 coeurs
> sfLibrary(caTools) # la library des packages utilisés
> sfLibrary(pls)
> sfLibrary(randomForest)
> sfLibrary(e1071)
> sfLibrary(caret)
> sfExport("fct_ConfusionMatrix", "Tirage", "rep.max",
+ "nb.simu", "trueP") # les éléments extérieur à la fonction
> T1 <- Sys.time() # information sur le temps que met l'operation a se realiser
> # res.svm.36 <- sfClusterApplySR(rep(1:rep.max,
> # each = nb.simu), fct_svm , seuil.ct = 36 ,
> # list.feuilles= Tirage , restore = F, perUpdate =
> # 6 ) # restore = T seulement si ça plante !
> res.ML.36 <- sfClusterApplyLB(rep(rep.max, each = nb.simu),
+ fct_ConfusionMatrix, seuil.ct = 36, list.feuilles = Tirage)
> # fct_svm on remplsis les 3 arguments qui sont :
> # nb.rep, seuil.ct, list.feuilles
> T2 <- Sys.time()
> sfStop() # stop l'utilisation du sfInit aux autres lignes de codes
> difftime(T2, T1) # information sur le temps qu'à mis l'operation
> intermed.36 <- as.data.frame(do.call(rbind, res.ML.36))
> # permet de basculer de la liste à la data.frame
> # pour le resultat issu de sfClusterApplyLB
> ML_global.36 <- pivot_longer((intermed.36), cols = 1:9,
+ names_to = "critere", values_to = "valeurs")
> # On moyenne tout les parametres pour chaque type
> # de machin learning
> ML.36 <- aggregate(valeurs ~ critere, ML_global.36,
+ mean)
> names(ML.36)[2] <- "Moyenne"
> # Meme chose avec l'ecart type
> ML.36$et <- aggregate(valeurs ~ critere, ML_global.36,
+ sd)$valeurs
> ML.36
6.4 Annexe 4 : Fonction nombre de feuille
> fct_feuille <- function(nb.feuille, seuil.ct, list.arbres) {
+ maliste <- lapply(list.arbres, function(arbre) {
+ if (nb.feuille < nrow(arbre))
+ list_svm <- arbre[sample(1:length(arbre$code_ech_arbre),
+ nb.feuille), ] else list_svm <- arbre
+ # on fait ça pour tte les feuilles mais tjrs en
+ # choisissant le nombre de rep tire aleatoirement
+ code <- grep("^code_ech", names(list_svm))
+ qPCR <- grep("^qPCR_", names(list_svm))
+ sortie <- cbind.data.frame(unique(list_svm[c(code,
+ qPCR)]), matrix(apply(list_svm[-(which(colnames(list_svm) ==
+ "code_ech_feuille"):which(colnames(list_svm) ==
+ "qPCR_36"))], 2, mean), nr = 1, dimnames = list(NULL,
+ names(list_svm)[-(which(colnames(list_svm) ==
+ "code_ech_feuille"):which(colnames(list_svm) ==
+ "qPCR_36"))])))
+ sortie
+ })
+ test_ed <- do.call(rbind, maliste) # on colle toute les listes créées précédement
+ decoup <- sample.split(test_ed[, paste0("qPCR_",
+ seuil.ct)], SplitRatio = 0.75) # on decoupe le jeu de donné en training set et test set
+ training_set <- test_ed[decoup, ]
+ test_set <- test_ed[!decoup, ]
+ res.svm <- svm(y = training_set[, paste0("qPCR_",
+ seuil.ct)] # ici on prend les seuil donc sois 32 sois 36 , avec 'paste0' colle sans separateurs
+ ,
+ x = training_set[, grep("^X", names(training_set))] # ici on prend ttes les longueurs d'ondes
+ ,
+ type = "C-classification", kernel = "linear")
+ svm_pred <- predict(res.svm, newdata = test_set[,
+ grep("^X", names(test_set))])
+ svm.confusion <- confusionMatrix(data = svm_pred,
+ reference = test_set[, paste0("qPCR_", seuil.ct)])
+ sortie <- c(svm.confusion$overall[1], svm.confusion$byClass[1],
+ svm.confusion$byClass[3]) # combine les 3 parametres recherches
+ names(sortie) <- c("Accuracy", "Sensitivity", "Precision") # renomer
+ sortie
+ }
6.5 Annexe 5 : Prédiction du nombre optimal de feuille
> rm(list = ls()) # nettoyage des listes de l'environnement de travail
> # Library ####
> library(pls) # PLS
> library(ggplot2) # Package ggplot pour graphiques
> library(ggdark) # Met un style de graphique ggplot en noir
> library(ggpubr) # Utilisation de la fonction ggarrange qui permet de coller 2 graphiques
> library(caTools) # sample.split
> library(tidyr) # pivot longer & pivot wider
> library(snowfall) # Utilisation du calcul paralell pour optimiser la vitesse de calcul
> # Importation des fonctions utiles
> source(file = "Scripts/Prediction/Fct_Feuilles.R") # fonction feuille avec SVM
> # Importation du jeu de donnee Global
> load("Sauvegardes_objet_R.data/Jeux de donnee/data_SPIR_Ed.Rdata")
> # I) Parametres SVM Ct<36 ####
> nb.simu <- 1 # Minimu 1000 simu Time difference of 15.39098 hours pour 1000 simu
> nb.feuille <- 10 # nombre de feuilles echantillonees par arbre , maximum 10
> seuil.ct <- 36
> intermed.arbre <- aggregate(reflectance ~ code_ech_feuille +
+ code_ech_arbre + qPCR_32 + qPCR_36 + lambda, data = data_long_Ed,
+ mean)
> mean.arbre <- pivot_wider(intermed.arbre, names_from = "lambda",
+ values_from = "reflectance", names_prefix = "X")
> Tirage <- split(mean.arbre, mean.arbre$code_ech_arbre,
+ drop = T) # drop = T pour enlever les tiroirs vide
> ## I.a) Calcul parallele ####
> sfInit(parallel = T, cpus = 4) # optimisation des processeurs sur les 4 coeurs
> sfLibrary(caTools) # la library des packages utilisés
> sfLibrary(e1071)
> sfLibrary(pls)
> sfLibrary(caret)
> sfExport("fct_feuille", "Tirage", "nb.feuille", "nb.simu") # les elements exterieur a la fonction
> T1 <- Sys.time() # information sur le temps que met l'operation a se realiser
> # res.svm.36 <- sfClusterApplySR(rep(1:rep.max,
> # each = nb.simu), fct_svm , seuil.ct = 36 ,
> # list.feuilles= Tirage , restore = F, perUpdate =
> # 6 ) # restore = T seulement si ça plante !
> res.svm.36 <- sfClusterApplyLB(rep(1:nb.feuille, each = nb.simu),
+ fct_feuille, seuil.ct = 36, list.arbres = Tirage)
> # fct_svm on remplsis les 3 arguments qui sont :
> # nb.rep, seuil.ct, list.feuilles
> T2 <- Sys.time()
> sfStop() # stop l'utilisation du sfInit aux autres lignes de codes
> difftime(T2, T1) # information sur le temps qu'a mis l'operation
> ## I.b) Enregistrement des criteres de precision
> ## ####
> # load('Sauvegardes_objet_R.data/SVM_ct36_6rep_100simu_3cpu_sfClusterApplyLB.Rdata')
> intermed.36 <- as.data.frame(do.call(rbind, res.svm.36))
> # permet de basculer de la liste à la data.frame
> # pour le resultat issu de sfClusterApplyLB
> data_global.36 <- pivot_longer((intermed.36), cols = 1:3,
+ names_to = "critere", values_to = "valeurs")
> data_global.36$nb.rep <- rep(1:nb.feuille, each = (nb.simu *
+ 3))
6.6 Annexe 6 : Fonction nombre de répétition SPIR par feuille
> fct_svm <- function(nb.rep, seuil.ct, list.feuilles) {
+ maliste <- lapply(list.feuilles, function(feuille) {
+ # On cree une list qui piochera au hazard 1 feuille
+ # avec le nombre de rep correspondant
+ if (nb.rep < nrow(feuille))
+ list_svm <- feuille[sample(1:length(feuille$code_ech_feuille),
+ nb.rep), ] else list_svm <- feuille
+ # on fait ça pour tte les feuilles mais tjrs en
+ # choisissant le nombre de rep tire aleatoirement
+ code <- grep("^code_ech", names(list_svm))
+ qPCR <- grep("^qPCR_", names(list_svm))
+ sortie <- cbind.data.frame(unique(list_svm[c(code,
+ qPCR)]), matrix(apply(list_svm[-(which(colnames(list_svm) ==
+ "code_nbr_rep"):which(colnames(list_svm) ==
+ "qPCR_36"))], 2, mean) # on moyenne la valeur des rep pour chaque feuille
+ ,
+ nr = 1, dimnames = list(NULL, names(list_svm)[-(which(colnames(list_svm) ==
+ "code_nbr_rep"):which(colnames(list_svm) ==
+ "qPCR_36"))])))
+ sortie
+ })
+ test_ed <- do.call(rbind, maliste) # on colle toute les listes créées précédement
+ decoup <- sample.split(test_ed[, paste0("qPCR_",
+ seuil.ct)], SplitRatio = 0.75) # on decoupe le jeu de donné en training set et test set
+ training_set <- test_ed[decoup, ]
+ test_set <- test_ed[!decoup, ]
+ res.svm <- svm(y = training_set[, paste0("qPCR_",
+ seuil.ct)] # ici on prend les seuil donc sois 32 sois 36 , avec 'paste0' colle sans separateurs
+ ,
+ x = training_set[, grep("^X", names(training_set))] # ici on prend ttes les longueurs d'ondes
+ ,
+ type = "C-classification", kernel = "linear")
+ svm_pred <- predict(res.svm, newdata = test_set[,
+ grep("^X", names(test_set))])
+ svm.confusion <- confusionMatrix(data = svm_pred,
+ reference = test_set[, paste0("qPCR_", seuil.ct)])
+ sortie <- c(svm.confusion$overall[1], svm.confusion$byClass[1],
+ svm.confusion$byClass[3]) # combine les 3 parametres recherches
+ names(sortie) <- c("Accuracy", "Sensitivity", "Precision")
+ sortie
+ }
6.7 Annexe 7 : Prédiction du nombre de répétition optimal
> # Library ####
> library(e1071) # SVM
> library(pls) # PLS
> library(ggplot2) # Package ggplot pour graphiques
> library(ggdark) # Met un style de graphique ggplot en noir
> library(ggpubr) # Utilisation de la fonction ggarrange qui permet de coller 2 graphiques
> library(caTools) # sample.split
> library(tidyr) # pivot longer & pivot wider
> library(caret) # fonction confusionMatrix
> library(snowfall) # Utilisation du calcul paralell pour optimiser la vitesse de calcul
> # Importation des fonctions utiles
> source(file = "Scripts/Prediction/Fct_SVM.R") # pour calculer avec fonction svm
> # source(file = 'Scripts/Prediction/Fct_PLS.R') #
> # pour calculer avec fonction pls
> # Importation du jeu de donnee Global
> load("Sauvegardes_objet_R.data/Jeux de donnee/data_SPIR_Ed.Rdata")
> # I) Parametres SVM Ct<36 ####
> nb.simu <- 100 # nombre de simulation
> rep.max <- 6 # nombre de repetition SPIR sur les feuilles , maximum 6
> Tirage <- split(data_SPIR_Ed[, -c(1:2)], data_SPIR_Ed$code_ech_feuille,
+ drop = T) # drop = T pour enlever les tiroirs vides !
> ## I.a) Calcul parallele ####
> sfInit(parallel = T, cpus = 4) # optimisation des processeurs sur les 4 coeurs
> sfLibrary(caTools) # la library des packages utilisés
> sfLibrary(e1071) # pour fct_svm
> sfLibrary(pls) # pour fct_pls
> sfLibrary(caret)
> sfExport("fct_svm", "Tirage", "rep.max", "nb.simu") # les elements exterieur a la fonction
> T1 <- Sys.time() # information sur le temps que met l'operation a se realiser
> res.svm.36 <- sfClusterApplyLB(rep(1:rep.max, each = nb.simu),
+ fct_svm, seuil.ct = 36, list.feuilles = Tirage)
> # fct_svm on remplsis les 3 arguments qui sont :
> # nb.rep, seuil.ct, list.feuilles
> T2 <- Sys.time()
> sfStop() # stop l'utilisation du sfInit aux autres lignes de codes
> difftime(T2, T1) # information sur le temps qu'a mis l'operation
> ## I.b) Enregistrement des criteres de precision
> ## ####
> # load('Sauvegardes_objet_R.data/SVM_ct36_6rep_100simu_3cpu_sfClusterApplyLB.Rdata')
> intermed.36 <- as.data.frame(do.call(rbind, res.svm.36))
> # permet de basculer de la liste à la data.frame
> # pour le resultat issu de sfClusterApplyLB
> data_global.36 <- pivot_longer((intermed.36), cols = 1:3,
+ names_to = "critere", values_to = "valeurs")
> data_global.36$nb.rep <- rep(1:rep.max, each = (rep.max *
+ nb.simu/2))