Modalités manquantes

From: Daniel Chessel (chessel@biomserv.univ-lyon1.fr)
Date: Thu May 15 2003 - 15:18:48 MEST


At 17:28 14/05/2003 +0000, Raphaëlle Pin wrote:
>Bonjour,
>tout d'abord, merci pour votre aide sur inertia.dudi, ca va mieux!
>ensuite, je voulais vous signaler (toujours en tant que débutante sous R!!) un petit problème que j'ai eu, qui vous intéressera peut-être:
>dans mon tableau factoriel trp, j'ai une variable TYPEM avec 4 modalités "TYPM", "TYPM2", '"TYPM3", "TYPMP".
>
>M'étant rendue compte que ma modalité "TYPMP" étant rare, j'ai enlevé les 3 individus qui la présentaient en faisant:
>trp2 <- trp[!is.element(trp$TYPEM, "TYPMP"),]
>
>Or le logiciel enlève bien les 3 individus mais garde en mémoire la modalité "TYPMP", avec 0 occurence, ce qui pose ensuite un problème lorsque je lance la fonction dudi.acm.
>du coup, j'ai été obligée de passer la variable TYPEM en caractères:
>trp2$TYPEM <- factor(as.character(trp2$TYPEM))
>et là ca marche. mais peut-être celà vaut-il le coup de prendre ces modalités d'occurence nulle en compte dans la fonction dudi.acm?

C'est un problème assez général rencontré avec les facteurs dans R.

Il se pose dans toute sélection de modalités en particulier dans le modèle linéaire.
Il n'y a pas de raison de réduire cette difficulté dans une fonction particulière, le problème étant très général.

La solution apportée est très bonne et resservira dans d'autres circonstances.

Il vaut mieux comprendre le mécanisme pour s'en servir (si c'était une difficulté inutile, elle aurait disparu depuis longtemps).

 a <- factor(rep(letters[1:4],c(8,5,6,1)))
 a
 [1] a a a a a a a a b b b b b c c c c c c d
Levels: a b c d

a est un facteur quand il a deux attributs : les niveaux et la classe
attributes(a)
$levels
[1] "a" "b" "c" "d"

$class
[1] "factor"

Si on enlève les attributs on a un vecteur numérique codé 1,2, ..., m (comme dans ade-4)
 attributes(a) = NULL
 a
 [1] 1 1 1 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3 4

On peut donc manipuler directement les niveaux et c'est assez utile

a <- factor(rep(letters[1:4],c(8,5,6,1)))
a
 [1] a a a a a a a a b b b b b c c c c c c d
Levels: a b c d
on enlève la dernière valeur
 a <- a[-20]
 a
 [1] a a a a a a a a b b b b b c c c c c c
Levels: a b c d
 
Le niveau d n'est pas représenté.

Pour changer les niveaux, il faut utiliser la fonction levels
avec la syntaxe imposée :
 levels(a) = list(a="a",b="b",c="c")
  a
 [1] a a a a a a a a b b b b b c c c c c c
Levels: a b c
 
l'intérêt est de recoder comme on veut :
 a <- factor(rep(letters[1:4],c(8,5,6,1)))
 a <- a[-20]
 levels(a) = list(B="a",B="b",C="c")
 a
 [1] B B B B B B B B B B B B B C C C C C C
Levels: B C

ça vaut le coup de maîtriser ça :

 x=runif(250)
un tirage uniforme sur 0-1
  x.cut =cut(x,br=seq(0,1,le=21))
  levels(x.cut)
 [1] "(0,0.05]" "(0.05,0.1]" "(0.1,0.15]" "(0.15,0.2]" "(0.2,0.25]"
 [6] "(0.25,0.3]" "(0.3,0.35]" "(0.35,0.4]" "(0.4,0.45]" "(0.45,0.5]"
[11] "(0.5,0.55]" "(0.55,0.6]" "(0.6,0.65]" "(0.65,0.7]" "(0.7,0.75]"
[16] "(0.75,0.8]" "(0.8,0.85]" "(0.85,0.9]" "(0.9,0.95]" "(0.95,1]"
variable découpée en 20 classes.

Pour simplifier les noms des niveaux
w=as.list(levels(x.cut))
names(w)=letters[1:20]
levels(x.cut)=w
summary(x.cut)
 a b c d e f g h i j k l m n o p q r s t
21 13 18 18 16 10 13 13 12 10 11 9 9 9 11 10 12 10 10 15
w = as.list(levels(x.cut))
names(w)=rev(LETTERS[1:20])
levels(x.cut)=w
summary(x.cut)
 T S R Q P O N M L K J I H G F E D C B A
21 13 18 18 16 10 13 13 12 10 11 9 9 9 11 10 12 10 10 15
w = as.list(levels(x.cut))
names(w)=rep(1:10,rep(2,10))
levels(x.cut)=w
summary(x.cut)
 1 2 3 4 5 6 7 8 9 10
34 36 26 26 22 20 18 21 22 25
...
La fonction levels permet toute manipulation sur le codage des variables qualitatives

 



This archive was generated by hypermail 2b30 : Tue Sep 07 2004 - 13:45:21 MEST