Graphique en trellis

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

Lorraine Bauer
Messages : 67
Enregistré le : 18 Nov 2008, 12:06

Graphique en trellis

Messagepar Lorraine Bauer » 18 Jan 2009, 20:47

Bonjour,
Je rencontre un problème avec les graphiques en trellis du packetage Lattice. J’utilise la fonction xyplot et je veux conditionner un graphique en x~y à deux facteurs, j’ai donc une formule de type : x~y |facteur A + facteur B.
Le facteur A possède 2 modalités et le facteur B possède 8 modalités, le croisement complet conduit donc à l’affichage 16 panels. Or dans mon data frame, le croisement n’est pas total car quelques croisements seulement sont pertinents, il y a en réalité 8 croisements intéressants : (A1*B1) ; (A1*B2) ; (A1*B3) ; (A1*B4) et (A2*B5) ; (A2*B6) ; (A2*B7) ; (A2*B8).
Après avoir regardé partout, je n’arrive pas à supprimer les 8 panels vides du graphique que j’obtiens pour ne garder que les 8 panels qui m’intéressent. Peut-être devrais-je organiser mon tableau de données différemment ? En tout cas je suis un peu coincée là, auriez-vous une solution pour régler cette question ?
Merci de votre aide.

Lorraine

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 18 Jan 2009, 23:07

Normalement, la formule doit être

Code : Tout sélectionner

 x ~ y | fA * fB


i.e., symbole "*" et non "+" pour les facteurs après le "|"

Pour répondre à ta question, normalement ça marche comme tu le souhaites si tu as des niveaux vraiment vides:

Code : Tout sélectionner

> library(lattice)
>
> dfr <- data.frame(y = rnorm(160),
+                   x = runif(160),
+                   u = rep(c("A", "B"), times = 80),
+                   v = rep(letters[1:4], each = 40))
> dfr$v <- factor(dfr$v, levels = letters[1:8])
> summary(dfr)
       y                  x            u            v     
 Min.   :-2.46107   Min.   :0.001981   A:80   a      :40 
 1st Qu.:-0.69570   1st Qu.:0.243406   B:80   b      :40 
 Median : 0.01174   Median :0.463254          c      :40 
 Mean   :-0.04250   Mean   :0.475403          d      :40 
 3rd Qu.: 0.54979   3rd Qu.:0.678434          e      : 0 
 Max.   : 2.45133   Max.   :0.989546          f      : 0 
                                              (Other): 0 
>
> xyplot(y ~ x | u * v, data = dfr)


produit bien un graphe avec 4 lignes et 2 colonnes. Voir ?xyplot et l'argument drop.unused.levels.

Autrement, si les niveaux non souhaités ne sont pas vides, tu peux les éliminer avec l'argument subset, par exemple:

Code : Tout sélectionner

> xyplot(y ~ x | u * v, data = dfr,
         subset = !is.element(dfr$v, c("e", "f", "g", "h")))


Renaud

Lorraine Bauer
Messages : 67
Enregistré le : 18 Nov 2008, 12:06

Messagepar Lorraine Bauer » 19 Jan 2009, 15:56

Merci de votre réponse Renaud.
Bien reçu en ce qui concerne le « * » à la place du « + ». Concernant mon problème, je crois comprendre d’où cela vient. Le jeu de données que vous me proposer en exemple résulte d’un plan factoriel qui comporte 6 groupes expérimentaux et là, effectivement cela ne pose pas de problème.
Or mon plan est équivalent à un plan de type split-plot, j’ai 2 groupes expérimentaux (A et B) et dans chaque groupe, j’ai 4 sujets. De plus sur chacun des sujets je fais 15 observations (mesure répétée). Voici le résumé de mes données :

Code : Tout sélectionner

> summary(data)
      test       reponse      groupe     sujet   
 Min.   : 1   Min.   :16.00   A:60   bb_1   :15 
 1st Qu.: 4   1st Qu.:22.00   B:60   bb_2   :15 
 Median : 8   Median :25.00          bb_3   :15 
 Mean   : 8   Mean   :25.48          bb_4   :15 
 3rd Qu.:12   3rd Qu.:29.00          bb_5   :15 
 Max.   :15   Max.   :34.00          bb_6   :15 
                                     (Other):30 


J’ai trituré mon tableau de données dans tous les sens et rien ne fonctionne, j’ai également regardé dans le bouquin de Sarkar (Lattice: Multivariate Data Visualization with R) et je n’ai rien trouvé à ce sujet. Du coté de la doc de R, rien de bien notable non plus.

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 19 Jan 2009, 18:51

Quel graphe voulez-vous faire exactement, en fonction des variables que vous présentez dans le jeu de données ?

Renaud

Lorraine Bauer
Messages : 67
Enregistré le : 18 Nov 2008, 12:06

Messagepar Lorraine Bauer » 19 Jan 2009, 23:06

Je vais tenter de vous donner plus de renseignements. En premier lieu, voici mon jeu de données : http://docs.google.com/Doc?id=dhksgr6k_15hzb9scdw
Ensuite, avec le code suivant :

Code : Tout sélectionner

> graph<-xyplot(reponse~test|sujet,type="o",strip = strip.custom(bg="gray"),col="tomato2",pch=15)
> update(graph)

j'obtiens ce premier graphique : http://docs.google.com/Doc?id=dhksgr6k_18fwrddcc9

Ce graphique me satisfait moyennement car je voudrais y faire apparaitre le groupe (A ou B) auquel appartient les sujets (ce sont des bébés). Les 4 premiers bébés (bb1->bb4) appartiennent au groupe A et les bébés 5 à 8 appartiennent au groupe B.
Pour faire apparaitre le groupe sur le graphique, j'ai donc (naïvement) tenté de conditionnaliser les tracés avec la variable supplémentaire "groupe". Et c'est là que mon problème survient. Avec la commande :

Code : Tout sélectionner

> graph<-xyplot(reponse~test|sujet*groupe,type="o",strip = strip.custom(bg="gray"),col="tomato2",pch=15)
> update(graph)

j'aboutis au graphique suivant : http://docs.google.com/Doc?id=dhksgr6k_16ckrd2qg6

Ce dernier graphique ne me satisfait plus du tout, ce que je voudrais faire, c'est supprimer les panels vides. Et là je bloque totalement. J'ai maintenant l'impression que ce problème n'est pas soluble. Qu'en pensez-vous ?

Encore merci pour le temps que vous avez la gentillesse de m'accorder.

Lorraine

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 20 Jan 2009, 00:11

Si les données sont dans le data.frame dfr, pour conserver l'info individuelle, on peut faire qque chose comme

Code : Tout sélectionner

dfr$grp_suj <- with(dfr, paste(groupe, sujet))

xyplot(reponse ~ test | grp_suj, data = dfr,
       layout = c(4, 2),
       type = "o", col = "tomato2", pch = 15,
       strip = strip.custom(bg = "gray"))


Sinon,

Code : Tout sélectionner

xyplot(reponse ~ test | groupe, data = dfr, groups = sujet, subscripts = TRUE,
       panel = function(...){
           panel.superpose(..., col = "grey", pch = 19, type = "b")
           panel.loess(..., span = 1/2, degree = 2, col = "red")
           })


qui a l'avantage de montrer les différences entre groupes (mais info individuelle partiellement perdue).

Renaud

Lorraine Bauer
Messages : 67
Enregistré le : 18 Nov 2008, 12:06

Messagepar Lorraine Bauer » 21 Jan 2009, 02:59

Parfait Renaud ! Votre solution me convient tout à fait, je n'avais absolument pas pensé à cela et comme toujours avec R, je cherche des solutions compliquées alors que des solutions simples et élégantes existent. Heureusement que ce forum existe.
Pour le second graphique il est très bien venu également, j'avais prévu de tracer quelque chose de ce type, c'est parfait !
Merci de m'avoir aidé et très bonne journée à vous Renaud.

Lorraine


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité

cron