[Résolu] Schéma ou tableau des valeurs manquantes

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Stéphane Rapelli
Messages : 25
Enregistré le : 16 Juil 2009, 09:24
Contact :

[Résolu] Schéma ou tableau des valeurs manquantes

Messagepar Stéphane Rapelli » 27 Oct 2009, 09:24

Bonjour.

Existe-t-il une commande permettant de construire un tableau des valeurs manquantes contenant des informations de ce type* (ou approchant) :

Code : Tout sélectionner

Groupe | Var 1 | Var 2 | Var 3 |  Fréq  |   %   |
1      |   X   |   X   |   X   |   i1   |   p1  |
2      |   X   |   .   |   X   |   i2   |   p2  |
3      |   .   |   X   |   X   |   i3   |   p3  |
4      |   .   |   X   |   .   |   i4   |   p4  |
5      |   .   |   .   |   X   |   i5   |   p5  |
6      |   .   |   .   |   .   |   i6   |   p6  |


Les groupent comprennent les observations en fonction des variables manquantes (NA). Ainsi, pour le groupe 1, aucune valeur ne manque (pas de NA), alors que pour le groupe 4 les variables Var 1 et Var 2 sont manquantes.

Fréq donne les effectifs i (nombres d'observations/individus) faisant partie de ce groupe et % la part de i dans le nombre total d'observation/individus.

Naturellement, je pourrais le faire à la main, mais j'ai beaucoup plus de 3 variables.

Merci d'avance.

* Je me suis vilainement inspiré de l'exemple proposé par S. Tufféry (2007), Data mining et statistique décisionnelle, Technip.

Matthieu Stigler
Messages : 141
Enregistré le : 07 Sep 2007, 11:30

Messagepar Matthieu Stigler » 27 Oct 2009, 12:07

Veuillez donner un exemple reproductibe! Du genre

Code : Tout sélectionner

X<-freeny
X[1,2]<-NA
X[3,4]<-NA
X[1,4]<-NA
dum<-factor(rep(c("A","B"), length.out=nrow(freeny)))


Je proposerais pour votre tableau:

Code : Tout sélectionner

apply(X, 2, function(x) tapply(x, dum, function(x) sum(is.na(x))))


Qui donne:
y lag.quarterly.revenue price.index income.level market.potential
A 0 1 0 2 0
B 0 0 0 0 0

Stéphane Rapelli
Messages : 25
Enregistré le : 16 Juil 2009, 09:24
Contact :

Messagepar Stéphane Rapelli » 27 Oct 2009, 13:05

Avec toute mes excuses pour l'absence d'exemple reproductible. Or donc, mettons que j'ai une table composée avec les données suivantes :

Code : Tout sélectionner

Var1<-c(1:5,NA,6:8,NA,10)
Var2<-c(0,NA,1,NA,5:9,NA,11)
Var3<-c(NA,1:8,NA,10)


donnees<-data.frame(Var1,Var2,Var3)

donnees
   Var1 Var2 Var3
1     1    0   NA
2     2   NA    1
3     3    1    2
4     4   NA    3
5     5    5    4
6    NA    6    5
7     6    7    6
8     7    8    7
9     8    9    8
10   NA   NA   NA
11   10   11   10


Idéalement, le tableau que je souhaite comporterait les informations suivantes :

Code : Tout sélectionner

Groupe | Var 1 | Var 2 | Var 3 |  Fréq  |     %    |
1      |   X   |   X   |   X   |    6   |   54.54  |
2      |   X   |   .   |   X   |    2   |   18.18  |
3      |   .   |   X   |   X   |    1   |   9.09   |
4      |   X   |   X   |   .   |    1   |   9.09   |
5      |   .   |   .   |   .   |    1   |   9.09   |


Interprétation pour les Groupes 1 et 4 (par exemple) :

> Le Groupe 1 rassemble les 6 individus pour lesquels toutes les variables sont renseignées (situation symbolisée par un "X" dans les colonnes Var1, Var2 et Var3). Ces 6 individus représentent 54,54% de l'échantillon observé.

>Le Groupe 4 contient l'individu pour lequel seule la variable 3 n'est pas renseignée (symbolisé par un point "." dans la colonne correspondante. L'individu représente 9.09% de l'échantillon observé.

Je pense pouvoir m'en sortir avec un mélange de margin.table(), addmargins() et prop.table(). Toutefois, il me semble possible qu'il existe une commande de R (ou d'un paquetage de R) qui réalise directement ce style de tâche.

Encore désolé pour le manque de précision.

Matthieu Stigler
Messages : 141
Enregistré le : 07 Sep 2007, 11:30

Messagepar Matthieu Stigler » 27 Oct 2009, 14:54

D'accord. En fait je n'utilise pas trop ces fonctions, peut-'etre existe-t-il une qui pemrette de faire ça, voilà en tout cas une manière manuelle:

Définir variables groupes!

Code : Tout sélectionner

groupes<-factor(c(rep(1,6), 2,2,3,4,5))


Puis utiliser fonction d'avant:

Code : Tout sélectionner

NAs<-apply(donnees, 2, function(x) tapply(x, groupes, function(x) sum(is.na(x))))
cbind(NAs, table(groupes), round(100*table(groupes)/length(groupes),2))

Ce qui donne:
Var1 Var2 Var3
1 1 2 1 6 54.55
2 0 0 0 2 18.18
3 0 0 0 1 9.09
4 1 1 1 1 9.09
5 0 0 0 1 9.09


Avec des X et 0 à la place du compte:

Code : Tout sélectionner

NAs<-apply(donnees, 2, function(x) tapply(x, groupes, function(x) ifelse(any(is.na(x)), "X", "0")))
cbind(NAs, table(groupes), round(100*table(groupes)/length(groupes),2))


C'est moins jooli:
Var1 Var2 Var3
1 "X" "X" "X" "6" "54.55"
2 "0" "0" "0" "2" "18.18"
3 "0" "0" "0" "1" "9.09"
4 "X" "X" "X" "1" "9.09"
5 "0" "0" "0" "1" "9.09"

Stéphane Rapelli
Messages : 25
Enregistré le : 16 Juil 2009, 09:24
Contact :

Messagepar Stéphane Rapelli » 27 Oct 2009, 15:17

Arg, je m'en veux terriblement de n'avoir pas été assez rapide. J'ai découvert un paquetage qui inclue une commande idoine. Il s'agit de
mice
avec sa commande md.pattern() : http://finzi.psych.upenn.edu/R/library/mice/html/md.pattern.html.

En tout cas, je vous remercie pour votre réponse que je vais tout de même exploiter dans la mesure où votre code permet de produire un résultat déjà mis en forme.

Cordialement.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité