juba / explor

Interfaces for Multivariate Analysis in R
https://juba.github.io/explor/
193 stars 13 forks source link

missMDA/Explor #37

Closed dafdafdaf closed 3 years ago

dafdafdaf commented 3 years ago

Bonjour,

J'ai un problème avec l'utilisation de explor sur une ACM après avoir utilisé missMDA.

J'impute les données et je peux voir les résultats avec FactoMineR sans problème.

imp<-imputeMCA(d,ncp = 2, quali.sup = 2:3) dmca<-MCA(d,quali.sup = 2:3, tab.disj = imp$tab.disj)

Quand je cherche à visualiser avec Explor, le message d'erreur suivant s'affiche:

explor(dmca) Error in [.data.frame(counts.tab, , quali.mods, drop = FALSE) : undefined columns selected

J'ai essayé la chose suivante: imp<-imputeMCA(d,ncp = 2, quali.sup = 2:3) d<-imp$completeObs dmca<-MCA(d, quali.sup=2:3)

Cela fonctionne, mais les résultats de l'ACM avec tab.disj = imp$tab.disj et avec imp$completeObs donne des résultats différents, et selon les manuels que j'ai lu (Husson, Lê, Pagès), c'est l'option avec tab.disj = imp$tab.disj qui est correcte.

Mon code est-il incorrect ou bien est-ce explor qui ne permet pas de visualiser une ACM faite avec tab.disj = imp$tab.disj?

Merci d'avance!

juba commented 3 years ago

Bonjour,

Non ça ne vient pas de votre code, il est tout à fait correct. Effectivement explor ne fonctionne pas avec l'option tab.disj. De ce que je comprends, utiliser imp$completeObs calcule l'ACM en utilisant les données imputées "directement", c'est-à-dire pour lesquelles on a remplacé les NA par le modalité la plus problème, tandis qu'utiliser imp$tab.disj permet de prendre en compte plus finement les probabilités d'appartenance des NA à chaque modalité.

Le problème vient du fait que dans l'objet contenant les résultats de l'ACM, les noms de modalités ne sont pas gérés de la même manière par les deux méthodes, et celle utilisée avec tab.disj n'est pas compatible avec explor. Malheureusement je ne suis pas sûr de pouvoir y faire grand chose, il me semble qu'il faudrait plutôt que ça soit corrigé du côté de FactoMineR. Je vais quand même regarder un peu plus sérieusement, je vous tiens au courant.

Merci d'avoir pris le temps de signaler le problème !

juba commented 3 years ago

Bon finalement j'ai peut-être trouvé un workaround assez simple. Pouvez-vous juste m'indiquer si ça résoud le problème de votre côté ?

dafdafdaf commented 3 years ago

Merci d'avoir pris le temps de répondre!

Je vous avoue que du fait de mon niveau cela me dépasse largement...

J'ai fait l'imputation comme la dernière fois, puis introduit votre code (c'st ce que j'ai compris qu'il fallait faire non?):

names(counts.tab) <- make.unique(names(counts.tab)) counts <- sapply(counts.tab[, quali.mods, drop = FALSE], sum) vars$Count <- counts

Le résultats est un message d'erreur:

Error in make.unique(names(counts.tab)) : object 'counts.tab' not found

counts <- sapply(counts.tab[, quali.mods, drop = FALSE], sum) Error in lapply(X = X, FUN = FUN, ...) : object 'counts.tab' not found vars$Count <- counts Error: object 'counts' not found

Je constate par ailleurs(mais cela va au-delà de explor) que lorsqu'on réalise une ACP, on travaille directement avec les données complétées. Je suppose que c'est parce qu'en ACP les imputations sont plus précises qu'en ACM.

J'en profite pour vous féliciter pour la libraire explor (et manuel d'introduction à R avec lequel j'ai fait mes débuts). Non seulement les graphes sont très bon, mais en plus la facilité de faire des allers-retours entre les différentes représentations permet d'avancer dans l'analyse et l'interprétation très facilement.

juba commented 3 years ago

En fait pour tester si le correctif fonctionne il faut que vous installiez la version de développement d'explor :

install.packages("remotes")  # Si remotes n'est pas déjà installé
remotes::install_github("juba/explor")

Et qu'ensuite vous relanciez votre code, sans modification.

Je ne suis pas du tout spécialiste en imputation, mais ce que vous dites pour l'ACP est assez logique. Pour l'ACM, l'imputation de la valeur d'une modalité peut générer soit une seule valeur (la valeur imputée est "femme"), soit une probabilité d'appartenance à chaque modalité (27% de proba d'être "homme", 73% d'être "femme"). Si j'ai bien compris tab.disj avec MCA permet d'utiliser les informations plus détaillées de ce deuxième cas. Dans le cas d'une ACP, seul le premier cas est possible (on impute une seule valeur d'âge ou de revenu par exemple).

Merci pour votre retour sur explor et l'introduction à R. Très content si ces outils ont pu vous être utiles !

dafdafdaf commented 3 years ago

Oui, cela a fonctionné, merci! Le seul problème est que pour certaines variables le nom a été remplacé par le numéro. Il me faut donc utiliser "prebend" pour avoir le nom, ce qui surcharge un peu car on a alors nom +numéro. Seules ont été remplacées par des numéros les variables dont les modalités sont A,B,C,D,E.

Captura de Pantalla 2021-04-25 a la(s) 12 29 56 Captura de Pantalla 2021-04-25 a la(s) 12 30 07
juba commented 3 years ago

Oui, c'est le problème dont je parlais : quand on n'utilise pas tab.disj, MCA différencie les modalités identiques en les préfixant par le nom de la variable ("Oui" devient "bricol_Oui" et "cinema_Oui", etc.). Avec tab.disj ce n'est pas fait, du coup en cas de modalités identiques on se retouve avec des "Oui.1", "Oui.2"...

C'est un problème du coup lié à FactoMineR et pas à explor. Normalement si vous faites un graphique de l'ACM avec les fonctions de FactoMineR vous retrouverez les mêmes libellés peu lisibles.

dafdafdaf commented 3 years ago

C'est exact, le graphique avec FactoMineR donne aussi ces libellés peu lisibles mais bon, c'st un moindre mal (ce ne sera pas esthétique mais au moins ce sera rigoureux).

Je profite de notre échange pour vous suggérer un idée: il serait très utile de pouvoir choisir les couleurs que l'on veut pour chaque variable et de pouvoir en choisir plusieurs lorsque l'on veut les faire ressortir sur le graphe. Cela serait très utile par exemple lorsque plusieurs variables correspondent à une même rubrique: on pourrait alors faire un graphe par rubrique avec les différentes variables correspondantes.

Merci beaucoup!!!

juba commented 3 years ago

Oui, je vois tout à fait l'intérêt de la suggestion pour les couleurs, et j'en prends note, malheureusement je ne pense pas pouvoir intégrer ça à l'interface d'explor (qui est déjà très chargée).

Il y a une possibilité pas très pratique, qui consiste à exporter le code R du graphique souhaité et à personnaliser les couleurs avec l'argument colors :

library(questionr)
library(FactoMineR)
library(dplyr)
library(explor)

data(hdv2003)

d <- hdv2003 %>% 
  select(sexe, nivetud, qualif, clso, relig, cuisine, bricol)
acm <- MCA(d, graph = FALSE)
explor(acm)

# Code du graphique 
res <- explor::prepare_results(acm)
explor::MCA_var_plot(res, xax = 1, yax = 2, var_sup = FALSE, var_sup_choice = ,
    var_lab_min_contrib = 0, col_var = "Variable", symbol_var = NULL, size_var = NULL,
    size_range = c(10, 300), labels_size = 10, point_size = 56, transitions = TRUE,
    labels_positions = NULL, labels_prepend_var = FALSE, 
    colors = c(
      "bricol" = "#ECD078", 
      "clso" = "#ECD078", 
      "relig" = "#ECD078", 
      "cuisine" = "#C02942", 
      "qualif" = "#C02942", 
      "sexe" = "#53777A",
      "nivetud" = "#53777A"
    )
)

Par contre je ne pense pas que ça marchera pour le code du biplot.

dafdafdaf commented 3 years ago

Merci beaucoup pour la suggestion!