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).