IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

panel function pour moyenne ponderee dans trellis graph


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 28
    Par défaut panel function pour moyenne ponderee dans trellis graph
    Bonjour,

    Je souhaiterais savoir s'il existe une panel.function qui calcule des moyennes pondérées pour des trellis graphs (package lattice)
    Avec le code suivant je superpose une moyenne des y pour chaque valeur de x au scatterplot de (x,y) mais ce n'est pas une moyenne pondérée.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    xyplot(y~x|cat,data=mytab,groups=mygroup,layout=c(1,nbr.panel), 
           panel = function(x, y) {
               panel.xyplot(x, y, pch="*")
               panel.average(x,y,fun=mean,horizontal=FALSE,col.line="red")
    })
    Je souhaiterais pouvoir faire quelque chose comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    xyplot(y~x|cat,data=mytab,groups=mygroup,layout=c(1,nbr.panel), 
           panel = function(x, y) {
               panel.xyplot(x, y, pch="*")
               panel.average(x,y,weight,fun=mean_ponderee,horizontal=FALSE,col.line="red")
    })
    Merci bcp !

  2. #2
    Membre émérite

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Billets dans le blog
    2
    Par défaut
    Si j'ai bien compris le fonctionnement de xyplot, tu crées la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mean_pond<-function(x){mean(x*weight)/mean(weight)}
    dans la fonction xyplot, tu prends les paramètres notés ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    xyplot(y~x|cat,data=mytab,groups=mygroup,layout=c(1,nbr.panel), 
           panel = function(x, y) {
               panel.xyplot(x, y, pch="*")
               panel.average(x,y,weight=c,fun=mean_pond,horizontal=FALSE,col.line="red")
    })
    Avec c ton vecteur poids.

    et cela devrait fonctionner.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 28
    Par défaut
    Merci pour ton aide.

    C'est une bonne idée d'essayer de définir sa propre fonction le problème c'est dans le passage de l'argument weight
    Que ce soit au niveau de la fonction panel.average elle-même comme tu le
    suggères ou bien dans les arguments de la fonction xyplot, je n'arrive pas à faire reconnaitre le paramètre weight à l’exécution.

    Note qu'une solution alternative consiste à ajouter dans mon data.frame les moyennes pondérées déjà calculées et à les flagger avec une nouvelle valeur pour la variable mygroup.
    Ensuite il ne me reste plus qu'a faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xyplot(y~x|cat,data=mytab,groups=mygroup,layout=c(1,nbr.panel))
    sans même mentionner de fonction car par default

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    panel = panel.xyplot(x, y)
    C'est cette solution que je voulais éviter en posant ma question.

    J'aime ta suggestion mais je bute sur le passage d'argument !

  4. #4
    Membre émérite

    Homme Profil pro
    Cyber Security & AI
    Inscrit en
    Février 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Cyber Security & AI

    Informations forums :
    Inscription : Février 2009
    Messages : 506
    Billets dans le blog
    2
    Par défaut
    Si cela ne marche pas, tu peux réécrire la fonction panel.average

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    panel.average_weight<-function (x, y, fun = mean, horizontal = TRUE, lwd = reference.line$lwd, 
        lty = reference.line$lty, col, col.line = reference.line$col, 
        type = "l", ...) 
    {
        x <- as.numeric(x)
        y <- as.numeric(y)
        reference.line = trellis.par.get("reference.line")
        if (!missing(col)) {
            if (missing(col.line)) 
                col.line <- col
        }
        if (horizontal) {
            vals <- unique(sort(y))
            yy <- seq_along(vals)
            xx <- numeric(length(yy))
            for (i in yy) xx[i] <- fun(x[y == vals[i]], weight)
            panel.lines(xx, vals[yy], col = col.line, lty = lty, 
                lwd = lwd, ...)
        }
        else {
            vals <- unique(sort(x))
            xx <- seq_along(vals)
            yy <- numeric(length(xx))
            for (i in xx) yy[i] <- fun(y[x == vals[i]], weight)
            panel.lines(vals[xx], yy, col = col.line, lty = lty, 
                lwd = lwd, ...)
        }
    }
    et là ta fonction panel.average_weight devrait fonctionner, toujours avec la fonction mean_pond.

    C'est l'idée alternative que j'avais.

  5. #5
    Membre averti
    Inscrit en
    Novembre 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 28
    Par défaut
    Merci,

    Je ne suis pas encore suffisamment expert pour écrire des fonctions, même si pour commencer je peux essayer de modifier à la marge le code de fonctions existantes.

    J'ai essayé ta solution qui devrait marcher modulo qq ajustements. Pour le moment ça bugue encore.
    Je vais creuser. Je donnerai un update quand ça marchera.

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/11/2012, 09h47
  2. [XL-2010] Code pour rajouter du pourcentage dans un graphe sur excel VBA
    Par darkryn dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 07/06/2012, 13h31
  3. [CR9] Ajouter colonne moyenne dans un graphe
    Par zodeno dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 28/04/2008, 15h27
  4. Réponses: 5
    Dernier message: 19/04/2008, 01h31
  5. bean:define pour passage variable dans function javascript
    Par fbuchwalder dans le forum Struts 1
    Réponses: 2
    Dernier message: 06/11/2006, 18h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo