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 :

Boucle avec fonction


Sujet :

R

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 20
    Points
    20
    Par défaut Boucle avec fonction
    Bonjour,

    Je débute avec R et je suis confrontée à un problème que j'imagine classique même si je n'ai rien trouvé comme aide sur les forums & docs..

    J'ai un tableau constitué d'individus en ligne et de variables & facteur en colonne. Je veux faire une succession de Khi2 entre chaque variable et le facteur. J'utilise pour cela :
    > chisq.test(Exemple[,3],Exemple$Facteur)
    où 3 est le numéro de ma variable-colonne et Exemple$Facteur le nom du facteur.

    Ca marche très bien. Le souci est que j'aimerai faire cela pour toutes les variables-colonnes (env. 40).
    J'ai donc essayé de faire la boucle suivante :
    > for (i in 2:40) {chisq.test(Exemple[,i],Exemple$Facteur)}

    Et ca ne marche pas.
    Si quelqu'un peut m'aider, d'avance merci !

  2. #2
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 74
    Points : 164
    Points
    164
    Par défaut
    Il doit surement exister des solutions plus élégantes mais je te propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sapply(Exemple[,2:40],function(x) chisq.test(Exemple$Facteur,x)$statistic)
    Je présume que tu veut juste avoir la statistique du KHI-2 et pas les autres parametres
    sinon ton code fonctionne aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    m <- numeric(39) # pour stocker les khi2
    for (i in 2:40) {
      m[i-1] <- chisq.test(tab$Produit,tab[,i])$statistic
    }
    m
    J'avais pas de jeu de donnée mais je pense que ca devrait marcher...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 20
    Points
    20
    Par défaut
    Merci pour ta réponse.
    Ca marche très bien !
    J'avoue ne pas très bien comprendre les structures des 2 solutions que tu proposes (qui fonctionnent toutes les 2). Si tu peux me répondre sur les points suivants, je suis preneuse d'infos :

    - Dans la fonction "sapply", que représente fonction(x) ?
    - "$Statistics" a l'air de préciser ce que l'on veut dans l'ensemble des résultats du test. Si on l'enlève, on récupère toutes les infos. Mais que doit-on ajouter pour ne récupérer que la p-valeur ?
    - Dans la boucle que je proposais, qu'est-ce qui ne fonctionnait pas ? Faut-il toujours renvoyer un vecteur ? (je comprends la structure que tu proposes mais je ne comprends pas pourquoi la mienne ne fonctionne pas)

    Encore merci pour tes solutions !

  4. #4
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 74
    Points : 164
    Points
    164
    Par défaut
    Pour sapply, elle est fait parti d'un famille de fonction qui sont une alternative aux boucles dans R qui sont souvent lent (pas toujours) est donc il es conseiller de 'vectoriser' les opérations. Pour sapply
    Elle prend un objet (matrice, dataframe, liste) et une fonction, quelle applique à chaque element de l'objet (ici colonne). Donc c'est pour ca que j'ai rajouter la notation function(x) .........
    Mais j'aurais pu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    chisq.pvalue <- function(x) {
             chisq.test(Exemple$Facteur,x)$p.value
    }
    sapply(Exemple[,2:40],chisq.pvalue)
    Y'a en plein d'autres apply, tapply, lapply, mapply

    Pour la p valeur je pense que t'a du comprendre il suffit de remplacer juste $statistic par $p.value. Pour en être sur il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # par exemple
    str(chisq.test(Exemple$Facteur,Exemple[,3]))
    # ou 
    names(chisq.test(Exemple$Facteur,Exemple[,3]))
    ce qui te permet de connaitre la structure et ainsi d'avoir ce que tu veux.

    Par rapport à ton code, je pense que le but de ce code est d'afficher les resultats classiques d'un test de chi2 avec toute les sorties (p-value,statistique, signification....). Ben tu rajoute un "print" et c'est bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (i in 2:40) {
    print(chisq.test(Exemple[,i],Exemple$Facteur))
    }
    Mais ca va faire beaucoup de sortis, je pense qu'il est préférable de stocker les résultats voulus pour les utiliser ultérieurement. Et la raison pour le print est que sous R en général, quand t'es en mode interactif, quand tu fait
    chisq.test(Exemple[,i],Exemple$Facteur) , ca appelle print(chisq.test(Exemple[,i],Exemple$Facteur))
    Bon j'espere que ces détails pourront t'aider !!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 20
    Points
    20
    Par défaut
    C'est parfait. Merci beaucoup pour toutes ces explications claires.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction boucle avec condition
    Par gaetanos dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/05/2015, 16h12
  2. probleme de boucle avec fonction et appel
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 26/05/2011, 16h37
  3. Pb OpenMP avec fonction + boucles
    Par Syens dans le forum Threads & Processus
    Réponses: 14
    Dernier message: 16/09/2010, 15h57
  4. Boucle avec la fonction setTimeout
    Par mathilda dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/10/2006, 11h08
  5. Réponses: 4
    Dernier message: 08/02/2006, 09h31

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