diff --git a/Module_correlation.Rmd b/Module_correlation.Rmd index ca567c15fb330d5b087c47a6ab572e2e37a2eca6..6527a97617ef00604e9c1fee61020403726aa772 100644 --- a/Module_correlation.Rmd +++ b/Module_correlation.Rmd @@ -21,6 +21,7 @@ if(!require(DT)) install.packages("DT") if(!require(plotly)) install.packages("plotly") if(!require(lsr)) install.packages("lsr") if(!require(knitr)) install.packages("knitr") +if(!require(knitr)) install.packages("circlize") library(GGally) library(readr) @@ -34,6 +35,7 @@ library(DT) library(plotly) library(lsr) library(knitr) +library(circlize) ``` ```{r setup, include=FALSE} @@ -44,97 +46,220 @@ knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE) ``` -## 1. Data Import and Interactive Overview + + +## 1- Data Overview {.tabset} ```{r data_import, echo=FALSE} # Import the design file (CSV) using the path specified in the input parameters. -annotations <- read.csv(design_file, sep = ",", stringsAsFactors = FALSE) +annotations <- read.csv("C:/Users/User/Desktop/projet_visualisation/visu_cor/design_WS3.csv", sep = ",", stringsAsFactors = FALSE) # Display an interactive table to review all variables in the dataset. DT::datatable(annotations, options = list(pageLength = 10, autoWidth = TRUE), caption = "Interactive Data Table: Review the design file") +``` +## Missing Values Table +```{r data_import, echo=FALSE} +# Calculate missing values for each column. +missing_values <- data.frame( + Variable = names(annotations), + Missing_Count = colSums(is.na(annotations)) +) +rownames(missing_values) <- NULL -``` +# Display an interactive table of missing values. +DT::datatable(missing_values, + options = list(pageLength = nrow(missing_values), autoWidth = TRUE), + caption = "Missing Values in the Design File") -### Manual Data Classification and Modification +``` + -## 2. Manual Data Classification and Modification +Manual Data Classification and Modification ```{r data_classification, echo=TRUE} # After reviewing the dataset via the interactive table, you can decide which variables # should be treated as categorical, which as quantitative, and which ones to display # in the advanced pairs plot. +# manually modify the classification lists below: + categorical_vars <- c("sample", "condition", "animal", "experiment", "extraction") + quantitative_vars <- c("volume", "quantity") + display_vars <- c("condition", "animal", "experiment", "extraction") -# Print the default classification lists defined in the input parameters: -cat("Default Categorical Variables: ", paste(categorical_vars, collapse = ", "), "\n") -cat("Default Quantitative Variables: ", paste(quantitative_vars, collapse = ", "), "\n") -cat("Default Variables for Advanced Pairs Plot: ", paste(display_vars, collapse = ", "), "\n") - -# If needed, manually modify the classification lists below: -# categorical_vars <- c("sample", "condition", "animal", "experiment", "extraction") -# quantitative_vars <- c("volume", "quantity") -# display_vars <- c("condition", "animal", "experiment", "extraction") ``` + 2. Association Matrix +`## 4. Association Matrix (Matrice des liaisons) +```{r association_matrix, echo=FALSE, fig.width=8, fig.height=6} +# Fonction pour calculer le coefficient de corrélation ratio (η) entre une variable numérique et une variable catégorielle. +correlationRatio <- function(x, group) { + df <- data.frame(x = x, group = group) + df <- df[complete.cases(df), ] + grandMean <- mean(df$x) + ssBetween <- sum(tapply(df$x, df$group, function(xg) length(xg) * (mean(xg) - grandMean)^2)) + ssWithin <- sum(tapply(df$x, df$group, function(xg) sum((xg - mean(xg))^2))) + eta2 <- ssBetween / (ssBetween + ssWithin) + return(sqrt(eta2)) # mesure brute +} +# Fonction pour calculer le V de Cramér à partir d'un tableau de contingence. +computeCramersV <- function(tab) { + chi2 <- suppressWarnings(chisq.test(tab, correct = FALSE)$statistic) + n <- sum(tab) + phi2 <- chi2 / n + r <- nrow(tab) + c <- ncol(tab) + phi2corr <- max(0, phi2 - ((c - 1) * (r - 1))/(n - 1)) + rcorr <- r - ((r - 1)^2)/(n - 1) + ccorr <- c - ((c - 1)^2)/(n - 1) + return(sqrt(phi2corr / min((ccorr - 1), (rcorr - 1)))) +} -2.1 Automated Conversion for Correlation Analysis +# Fonction pour calculer l'association entre deux variables (mesure au carré) : +# - Si les deux variables sont numériques : retourne (corrélation de Pearson)^2. +# - Si les deux variables sont catégorielles : retourne (V de Cramér)^2. +# - Si l'une est numérique et l'autre catégorielle : retourne (corrélation ratio)^2. +computeAssociation <- function(x, y) { + if (is.numeric(x) && is.numeric(y)) { + return(cor(x, y, use = "complete.obs")^2) + } else if (is.factor(x) && is.factor(y)) { + return(computeCramersV(table(x, y))^2) + } else if (is.numeric(x) && is.factor(y)) { + return(correlationRatio(x, y)^2) + } else if (is.factor(x) && is.numeric(y)) { + return(correlationRatio(y, x)^2) + } else { + return(NA) + } +} -```{r} -data_numeric <- annotations %>% - mutate( - condition = as.numeric(factor(condition)), # Conversion de 'condition' - animal = as.numeric(factor(animal)) # Conversion de 'animal' - - # 'sample' sera exclue du calcul - ) %>% - select(-sample, -experiment, -extraction) -``` -3. Visualizations of Correlations and Distributions -3.1 Correlation Matrix with corrplot -Figure: Correlation matrix showing pairwise Pearson correlations among quantitative variables. -```{r} -if(ncol(data_numeric) > 1){ - cor_matrix <- cor(data_numeric, use = "complete.obs", method = "pearson") - corrplot(cor_matrix, method = "circle", type = "lower", - tl.col = "black", tl.cex = 0.8, - col = colorRampPalette(c("blue", "white", "red"))(200)) -} else { - cat("Not enough numeric columns to compute a correlation matrix.\n") +# Fonction pour calculer l'association brute (non élevée au carré) entre deux variables. +computeAssociationRaw <- function(x, y) { + if (is.numeric(x) && is.numeric(y)) { + return(cor(x, y, use = "complete.obs")) + } else if (is.factor(x) && is.factor(y)) { + return(computeCramersV(table(x, y))) + } else if (is.numeric(x) && is.factor(y)) { + return(correlationRatio(x, y)) + } else if (is.factor(x) && is.numeric(y)) { + return(correlationRatio(y, x)) + } else { + return(NA) + } +} + +# Fonction pour construire la matrice d'association (valeurs au carré) pour toutes les variables. +associationMatrix <- function(data) { + vars <- names(data) + nvar <- length(vars) + M <- matrix(NA, nrow = nvar, ncol = nvar, dimnames = list(vars, vars)) + for (i in seq_len(nvar)) { + for (j in seq_len(nvar)) { + M[i, j] <- computeAssociation(data[[i]], data[[j]]) + } + } + return(M) +} + +# Fonction pour construire la matrice d'association brute (non élevée au carré) pour toutes les variables. +associationMatrixRaw <- function(data) { + vars <- names(data) + nvar <- length(vars) + M <- matrix(NA, nrow = nvar, ncol = nvar, dimnames = list(vars, vars)) + for (i in seq_len(nvar)) { + for (j in seq_len(nvar)) { + M[i, j] <- computeAssociationRaw(data[[i]], data[[j]]) + } + } + return(M) } +# Préparation du jeu de données mixte : +# On utilise les variables quantitatives (quantitative_vars) et les variables catégorielles (display_vars) +# en excluant "sample" qui est un identifiant. +vars_to_use <- c(quantitative_vars, setdiff(display_vars, "sample")) +mixed_data <- annotations %>% select(all_of(vars_to_use)) + +# Conversion des variables catégorielles (définies dans display_vars) en facteurs. +mixed_data[display_vars] <- lapply(mixed_data[display_vars], as.factor) + +# Calcul de la matrice d'association (valeurs au carré). +assoc_mat <- associationMatrix(mixed_data) + +# Calcul de la matrice d'association brute (valeurs non élevées au carré), stockée pour une utilisation ultérieure. +assoc_mat_raw <- associationMatrixRaw(mixed_data) + +# Affichage de la matrice d'association au carré sous forme de tableau statique. +knitr::kable(assoc_mat, digits = 2, caption = "Matrice des liaisons (valeurs au carré)") + +# Vous pouvez utiliser 'assoc_mat_raw' dans un chunk ultérieur pour créer une figure de corrplot par exemple. ``` -3.2 Heatmap with ComplexHeatmap -Figure: Heatmap of the correlation matrix. -```{r} -if(ncol(data_numeric) > 1){ - Heatmap(cor_matrix, name = "Correlation", - col = colorRampPalette(brewer.pal(8, "RdYlBu"))(50), - column_title = "Heatmap of Correlation Matrix") -} else { - cat("Not enough numeric variables to generate a heatmap.\n") -} +## Visualisation +## 5. Visualisation de la Matrice des Liaisons (Valeurs Brutes) avec corrplot + +```{r assoc_corrplot_raw, echo=FALSE, fig.width=8, fig.height=8} +# Palette de couleurs allant de bleu (valeurs négatives) à blanc (0) puis à rouge (valeurs positives) +my_palette_raw <- colorRampPalette(c("blue", "white", "red"))(200) + +# Affichage de la matrice d'association brute (assoc_mat_raw) sous forme de cercles colorés. +# is.corr = FALSE car il ne s'agit pas de corrélations classiques (les mesures sont brutes). +# cl.lim = c(-1, 1) force l'échelle de couleur à varier de -1 à 1. +corrplot(assoc_mat_raw, + method = "circle", + type = "lower", + is.corr = FALSE, + col = my_palette_raw, + cl.lim = c(-1, 1), + tl.col = "black", + tl.cex = 0.8, + mar = c(0, 0, 2, 0), + title = "Matrice des liaisons (Valeurs Brutes)") + + +``` +## 6. Heatmap de la Matrice des Liaisons (Valeurs Brutes) + +```{r heatmap_raw, echo=FALSE, fig.width=8, fig.height=8} + + + +# Définition d'une palette de couleurs pour une échelle de -1 à 1. +col_fun <- colorRamp2(c(-1, 0, 1), c("blue", "white", "red")) + +# Création de la heatmap en utilisant la matrice des associations brutes. +Heatmap(assoc_mat_raw, + name = "Association", + col = col_fun, + column_title = "Heatmap de la Matrice des Liaisons (Valeurs Brutes)", + heatmap_legend_param = list(title = "Association", + at = c(-1, 0, 1), + labels = c("-1", "0", "1")) +) + ``` + + 3.3 Pairs Plot of Numeric Variables Figure: Pairs plot (scatterplot matrix) of quantitative variables. ```{r} + if(ncol(num_data) > 1){ ggpairs(num_data, title = "Pairs Plot of Numeric Variables", progress = FALSE) } else { @@ -334,96 +459,3 @@ balanced_annotations <- annotations %>% cat("Subsampled to", min_count, "samples per condition.\n") ``` - - -## 4. Association Matrix: Matrice des liaisons - -```{r association_matrix, echo=FALSE, fig.width=8, fig.height=6} -# --- Définition des fonctions d'association --- - -# 1. Fonction pour calculer le coefficient de corrélation ratio (η) entre une variable numérique et une variable catégorielle -correlationRatio <- function(x, group) { - df <- data.frame(x, group) - df <- df[complete.cases(df), ] - x <- df$x - group <- df$group - grandMean <- mean(x) - # Somme des carrés entre les groupes - ssBetween <- tapply(x, group, function(xg) length(xg) * (mean(xg) - grandMean)^2) - ssBetween <- sum(ssBetween) - # Somme des carrés dans les groupes - ssWithin <- tapply(x, group, function(xg) sum((xg - mean(xg))^2)) - ssWithin <- sum(ssWithin) - eta2 <- ssBetween / (ssBetween + ssWithin) - return(sqrt(eta2)) -} - -# 2. Fonction pour calculer le V de Cramér à partir d'un tableau de contingence -computeCramersV <- function(tab) { - # Calcul du chi2 sans correction de continuité - chi2 <- suppressWarnings(chisq.test(tab, correct = FALSE)$statistic) - n <- sum(tab) - phi2 <- chi2 / n - r <- nrow(tab) - c <- ncol(tab) - # Correction pour éviter des valeurs négatives - phi2corr <- max(0, phi2 - ((c - 1) * (r - 1)) / (n - 1)) - rcorr <- r - ((r - 1)^2) / (n - 1) - ccorr <- c - ((c - 1)^2) / (n - 1) - return(sqrt(phi2corr / min((ccorr - 1), (rcorr - 1)))) -} - -# 3. Fonction pour calculer l'association entre deux variables : -# - Si les deux variables sont numériques : corrélation de Pearson. -# - Si les deux variables sont catégorielles : V de Cramér (via computeCramersV). -# - Si l'une est numérique et l'autre catégorielle : corrélation ratio (η). -computeAssociation <- function(x, y) { - if (is.numeric(x) && is.numeric(y)) { - return(cor(x, y, use = "complete.obs")) - } else if (is.factor(x) && is.factor(y)) { - tab <- table(x, y) - return(computeCramersV(tab)) - } else if (is.numeric(x) && is.factor(y)) { - return(correlationRatio(x, y)) - } else if (is.factor(x) && is.numeric(y)) { - return(correlationRatio(y, x)) - } else { - return(NA) - } -} - -# 4. Fonction pour construire la matrice des liaisons pour toutes les variables d'un jeu de données -associationMatrix <- function(data) { - vars <- names(data) - nvar <- length(vars) - M <- matrix(NA, nrow = nvar, ncol = nvar, dimnames = list(vars, vars)) - for (i in seq_len(nvar)) { - for (j in seq_len(nvar)) { - M[i, j] <- computeAssociation(data[[i]], data[[j]]) - } - } - return(M) -} - -# --- Préparation du jeu de données pour la matrice d'association --- -# On utilise les variables quantitatives (par exemple, "volume", "quantity") et -# les variables catégorielles définies dans display_vars (excluant "sample"). -mixed_vars <- c(quantitative_vars, setdiff(display_vars, "sample")) -mixed_data <- annotations %>% select(all_of(mixed_vars)) - -# S'assurer que les variables catégorielles sont bien de type factor -for (var in display_vars) { - if (var %in% names(mixed_data)) { - mixed_data[[var]] <- as.factor(mixed_data[[var]]) - } -} - -# Calcul de la matrice des liaisons -assoc_mat <- associationMatrix(mixed_data) - -# Affichage de la matrice sous forme de tableau -knitr::kable(assoc_mat, digits = 2, caption = "Association Matrix (Matrice des liaisons)") - - - -```