| This post was kindly contributed by Alea - R - go there to comment and to read the full post. |
Dichotomiquoi ?
Dichotomiser une variable revient à transformer chaque modalité de réponse à cette variable en une nouvelle variable indiquant si la modalité en question correspond ou non à l'individu correspondant.
Ainsi, si j'ai la variable «genre» suivante :
d <- data.frame(genre=c("Femme", "Homme", "Homme", "Femme")) d
genre 1 Femme 2 Homme 3 Homme 4 Femme
Alors on peut la dichotomiser en deux nouvelles variables Homme et Femme de la manière suivante :
genre Homme Femme 1 Femme 0 1 2 Homme 1 0 3 Homme 1 0 4 Femme 0 1
Dans ce qui suit on partira du tableau de données suivant :
d <- data.frame(genre=c("Femme", "Homme", "Homme", "Femme"), couleur=c("rouge", "bleu", "vert", "rouge"), age=c(20,25,30,35)) d
genre couleur age 1 Femme rouge 20 2 Homme bleu 25 3 Homme vert 30 4 Femme rouge 35
Cas général
Le cas général correspond à la transformation d'une variable de type factor en une série de variables de type indicatrices. On peut utiliser pour cela plusieurs fonctions disponibles dans R.
Avec model.matrix
model.matrix, qui a pour fonction principale de générer des matrices représentant des modèles de régression, permet aussi de dichotomiser des variables de type factor. Pour cela on doit lui passer en argument le tableau de données d'entrée et la liste des variables à dichotomiser sous forme de formule :
data.frame(model.matrix( ~ genre + couleur - 1, data=d))
genreFemme genreHomme couleurrouge couleurvert 1 1 0 1 0 2 0 1 0 0 3 0 1 0 1 4 1 0 1 0
Le -1 dans la formule indique qu'on ne souhaite pas de terme constant (car model.matrix est à la base conçue pour traiter des modèles de régression).
Avec acm.disjonctif
La fonction acm.disjonctif fait partie de l'extension ade4 disponible sur le CRAN, et qu'on charge avec :
On peut alors appliquer la fonction acm.disjonctif à un tableau ne contenant que des variables de type factor :
acm.disjonctif(subset(d, select=c("genre", "couleur")))
genre.Femme genre.Homme couleur.bleu couleur.rouge couleur.vert 1 1 0 0 1 0 2 0 1 1 0 0 3 0 1 0 0 1 4 1 0 0 1 0
Récupérer les nouvelles variables
On peut importer ces nouvelles variables dans le tableau de données d'origine très simplement en utilisant la fonction cbind, qui permet de "lier" des tableaux de données par colonne :
dichot <- acm.disjonctif(subset(d, select=c("genre", "couleur"))) cbind(d, dichot)
genre couleur age genre.Femme genre.Homme couleur.bleu couleur.rouge 1 Femme rouge 20 1 0 0 1 2 Homme bleu 25 0 1 1 0 3 Homme vert 30 0 1 0 0 4 Femme rouge 35 1 0 0 1 couleur.vert 1 0 2 0 3 1 4 0
Cas de questions à réponses multiples
Lorsqu'on importe des données provenant du logiciel Modalisa, on se retrouve souvent avec des variables correspondant à des "questions à réponses multiples", c'est-à-dire des questions ou les répondants peuvent choisir plusieurs modalités de réponses. Ces variables sont exportées par Modalisa sous forme de chaînes de caractères avec les modalités concaténées et séparées par une barre oblique (/).
La fonction mls.eclate.multi de l'extension rgrs permet de transformer automatiquement ce type de questions en variables dichotomisées :
d <- data.frame(couleur=c("rouge/vert/bleu", "vert", "rouge/bleu", "vert/rouge")) d
couleur
1 rouge/vert/bleu
2 vert
3 rouge/bleu
4 vert/rouge
mls.eclate.multi(d$couleur, vname="couleur")
couleur.rouge couleur.bleu couleur.vert 1 O O O 2 N N O 3 O O N 4 O N O
Dans ce cas aussi on peut réimporter ces nouvelles variables dans notre tableau de données d'origine avec la fonction cbind :
dichot <- mls.eclate.multi(d$couleur, vname="couleur") cbind(d, dichot)
couleur couleur.rouge couleur.bleu couleur.vert
1 rouge/vert/bleu O O O
2 vert N N O
3 rouge/bleu O O N
4 vert/rouge O N O
Liens
On pourra se reporter à cette question sur stackoverflow (en anglais).