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 :

Créer des boucles qui nous affiche dans un tableau les test de shapiro par variables


Sujet :

R

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Créer des boucles qui nous affiche dans un tableau les test de shapiro par variables
    Je m'explique, ayant débuter assez récemment R studio, j'ai un projet qui consiste en l'étude statistique de différentes variables.

    Pour cela je voudrai faire des tests de Student mais pour cela mes variables doivent suivre les conditions du test, notamment le test de normalité. Pour cela mes professeurs m'ont conseillé d'utiliser un test de Shapiro-Wilk :
    J'ai donc exécuté le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    shapiro.test(Data_Projet2$poids)
    by(Data_Projet2$poids, Data_Projet2$Classe_Age,shapiro.test)
    Ce qui me renvoie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shapiro.test(Data_Projet2$POIDS)
    Shapiro-Wilk normality test

    data: Data_Projet2$POIDS
    W = 0.98181, p-value = 0.3134

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (by(Data_Projet2$POIDS, Data_Projet2$Classe_Age, shapiro.test))#significatif
    Data_Projet2$Classe_Age: -25ans

    Shapiro-Wilk normality test

    data: dd[x, ]
    W = 0.91575, p-value = 0.07138

    -----------------------------------------------------------------------------------------------------------
    Data_Projet2$Classe_Age: 25-35

    Shapiro-Wilk normality test

    data: dd[x, ]
    W = 0.96018, p-value = 0.4671

    -----------------------------------------------------------------------------------------------------------
    Data_Projet2$Classe_Age: 35-45

    Shapiro-Wilk normality test

    data: dd[x, ]
    W = 0.9796, p-value = 0.9603

    -----------------------------------------------------------------------------------------------------------
    Data_Projet2$Classe_Age: 45+

    Shapiro-Wilk normality test

    data: dd[x, ]
    W = 0.96936, p-value = 0.807


    Shapiro-Wilk normality test

    data: Data_Projet2$POIDS
    W = 0.98181, p-value = 0.3134

    Cela est ce que je souhaite mais je voudrais dans les limites du possible, l'automatiser par une boucle :
    J’ai donc créé ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for( i in 3:15){
      shapiro.test(Data_Projet2[,i])
      by(Data_Projet2[,i], Data_Projet2$Classe_Age, shapiro.test)
    }
    Mais là est tout le problème, je n'ai aucun affichage des résultats. Je voudrais donc savoir si quelqu'un le sait ici, comment afficher les résultats de cette boucle, et, si cela est possible, stocker toutes les valeurs dans un tableau du style :

    var w p-value wGroupe1 p-value1 wGroupe2 p-value2 ...
    var2 w p-value wGroupe1 p-value1 wGroupe2 p-value2 ..
    var3 w p-value wGroupe1 p-value1 wGroupe2 p-value2 ..
    .
    .
    etc.

    Merci d'avance pour votre aide !

  2. #2
    Membre averti
    Homme Profil pro
    Data scientist
    Inscrit en
    Février 2017
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2017
    Messages : 211
    Points : 343
    Points
    343
    Par défaut
    Hello,

    Essaye ce code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    data_intermidiaire = data.frame(Data_Projet2$Classe_Age , Data_Projet2[,3:15])
    table_res = data.frame()
     
    for( j in 2:14){
      for(i in 1:length(unique(Data_Projet2$Classe_Age)))
        {table_res[i,j-1] =  by(data_intermidiaire[,j], data_intermidiaire$Classe_Age, shapiro.test)[[i]][2]}}
     
    row.names(table_res) = sort(unique(Data_Projet2$Classe_Age))
    colnames(table_res) = names(data_intermidiaire[2:14])
    table_res

  3. #3
    Membre averti
    Homme Profil pro
    Data scientist
    Inscrit en
    Février 2017
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2017
    Messages : 211
    Points : 343
    Points
    343
    Par défaut
    Merci à toi pour ta réponse, une fois lancé j'obtiens le résultat suivant :

    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
    data_intermidiaire = data.frame(Data_Projet2$Classe_Age , Data_Projet2[,3:15])
    table_res = data.frame()
    > 
    for( j in 2:14){
       for(i in 1:length(unique(Data_Projet2$Classe_Age)))
       {table_res[i,j-1] =  by(data_intermidiaire[,j], data_intermidiaire$Classe_Age, shapiro.test)[[i]][2]}}
    Error in by.default(data_intermidiaire[, j], data_intermidiaire$Classe_Age,  : 
      'names' attribute [1] must be the same length as the vector [0]
     
    row.names(table_res) = sort(unique(Data_Projet2$Classe_Age))
    Error in `row.names<-.data.frame`(`*tmp*`, value = 1:4) : 
      longueur de 'row.names' incorrecte
    colnames(table_res) = names(data_intermidiaire[2:14])
    Error in `colnames<-`(`*tmp*`, value = c("AGE", "TAILLE", "POIDS", "TTAILLE",  : 
      'names' attribute [13] must be the same length as the vector [0]
    table_res
    data frame with 0 columns and 0 rows
    Cependant, je n'ai pas encore tout compris de ton code, je continue de réfléchir dessus, encore merci.

    J'aurais besoin d'avoir la table, stp.

    Merci.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut je te met le début de mon code ainsi que la base de données
    Voilà la base de donnée ainsi que mon code :

    Data + Code.zip

    Merci beaucoup pour ton aide !

  5. #5
    Membre averti
    Homme Profil pro
    Data scientist
    Inscrit en
    Février 2017
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2017
    Messages : 211
    Points : 343
    Points
    343
    Par défaut
    Il y avait une petite coquille dans ton code : l'âge 25 qui n'était rangé nul part.

    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
    #création de classes en fonction de l'age
    Classe_Age[data_Projet$AGE>=25 & data_Projet$AGE<=35] = "25-35" #ICI ajouter ou égale 25
     
     
    #Analyse Des variables d'interêt
     
    data_intermidiaire = data.frame(Classe_Age = Data_Projet2[,17], Data_Projet2[,3:15])
    table_res = data.frame()
     
    for( j in 2:14){
      for(i in 1:length(unique(Data_Projet2$Classe_Age)))
      {table_res[i,j-1] =  by(data_intermidiaire[,j], data_intermidiaire$Classe_Age, shapiro.test)[[i]][2]}}
    row.names(table_res) = sort(unique(Data_Projet2$Classe_Age))
    colnames(table_res) = names(data_intermidiaire[2:14])
    table_res
    Dis-moi si ça marche.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    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
    for(i in 1:length(unique(Data_Projet2$Classe_Age)))
    {table_res[i,j-1] = by(data_intermidiaire[,j], data_intermidiaire$Classe_Age, shapiro.test)[[i]][2]}}
    row.names(table_res) = sort(unique(Data_Projet2$Classe_Age))
    colnames(table_res) = names(data_intermidiaire[2:14])
    table_res
                   AGE    TAILLE      POIDS    TTAILLE      POULS          SYS        DIA         CHOL        IMC      JMBG      COUD      POIGN
    -25ans 0.203543064 0.8597775 0.07137645 0.07337158 0.01599083 0.4464293518 0.42228047 0.0003622682 0.57666382 0.9776619 0.3492221 0.37577858
    25-35  0.086735431 0.3754143 0.35526149 0.30404895 0.01550943 0.5571254898 0.06674311 0.0003483188 0.07906653 0.7039415 0.4488543 0.08543332
    35-45  0.136481632 0.8664580 0.96033478 0.23993383 0.41933361 0.0004853147 0.02818010 0.0578813192 0.85027729 0.5754434 0.4690241 0.63893060
    45+    0.009031555 0.9154327 0.80704940 0.16681525 0.01549630 0.0443950735 0.95254429 0.4660793535 0.02341525 0.2106016 0.4856563 0.51152626
                 BRAS
    -25ans 0.16333109
    25-35  0.09703022
    35-45  0.15580372
    45+    0.57155434
    Comme tu peux le constater, ça a marché, Merci beaucoup tu m'enlèves une belle épine du pied !
    Cependant juste pour ne pas me tromper, les valeurs obtenues sont bien la P-value, pas la statistique W ?

    Encore merci !

  7. #7
    Membre averti
    Homme Profil pro
    Data scientist
    Inscrit en
    Février 2017
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2017
    Messages : 211
    Points : 343
    Points
    343
    Par défaut
    C'est bien des p_values.

    Bon courage.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup !!

  9. #9
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    Bonjour,

    La fonction aggregate peut-être une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aggregate(. ~ Classe_Age, data_intermidiaire, function(x) shapiro.test(x)$p.value)
    cdlt

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Bonjour,
    J'ai de nouveau un soucis, maintenant que j'ai obtenu ce tableau, je voudrai rajouter une ligne, dans laquelle ont me dis, si l'une des p-value de la colonne est inférieur à 0.05 alors il affiche "non significatif", sinon il affiche "significatif" :

    Par exemple :

                                            POULS              SYS                     DIA                 CHOL
    Corpulence normale   5.415332e-05     0.51050123          0.1852344        2.392820e-03
    Maigreur où Anorexie 5.452922e-01     0.56997333          0.6329544        2.808405e-01
    Obésité                     6.976291e-01     0.01073719          0.1961547        3.136831e-02
    Surpoids                   2.676835e-01     0.73884206           0.1571853        8.822792e-05
    P_value                    non significatif     non significatif       non significatif    non significatif
    c'est à dire que si l'une des valeurs d'une colonne est inférieur à 0.05, la valeur de P_value est : non significative, si toute les p_value de la colonne sont > 0.05 alors p_value = significative

    Exemple : Pour la variable Pouls, corpulence normale < 0.05 alors P_Value = "non significatif"

    Merci d'avance !

  11. #11
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Points : 561
    Points
    561
    Par défaut
    si l'une des p-value de la colonne est inférieur à 0.05 alors il affiche "non significatif"
    Ca ne serait pas plutôt l'inverse ? A savoir que si p-value < 0,05 alors le test est significatif alors que si p-value > 0,05 le test est non significatif.

    Si ton tableau s'appelle tab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rbind(tab, sapply(tab, function(x) if (any(x < 0.05)) "Significatif" else "Non significatif"))
    Mais en mélangeant des nombres et du texte dans une même colonne tu vas casser la structure numérique et tout va devenir du texte ou des facteurs.

    cdlt

  12. #12
    Membre averti
    Homme Profil pro
    Data scientist
    Inscrit en
    Février 2017
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2017
    Messages : 211
    Points : 343
    Points
    343
    Par défaut
    Bonjour,

    L'hypothèse nulle du test shapiros est :
    H0 : L'échantillon est normalement distribué , on rejette H0 si p.value < 0.05 . Donc si c'est le cas le test est significatif. En gros en considère que l'échantillon suit une loi normale quand la p.value est supérieur à 0.05

    Je te propose le code suivent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    tab = as.data.frame(aggregate(. ~ Classe_Age, data_intermidiaire, function(x) shapiro.test(x)$p.value))
     
    for( i in 1:4){
      for (j in 2:14) {
        if( tab[i,j] < 0.05 ) { tab[5,j] = 'Significatif'
            } else { tab[5,j] = 'non Significatif'
             } }}

Discussions similaires

  1. [Débutant] Boucle qui n'affiche pas un tableau
    Par kenpei dans le forum C#
    Réponses: 2
    Dernier message: 09/10/2011, 19h50
  2. Vérifier l'etat des checbox qui sont contenus dans un tableau [].
    Par madina dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/08/2011, 14h04
  3. Réponses: 2
    Dernier message: 13/01/2010, 13h54
  4. Réponses: 13
    Dernier message: 27/11/2007, 11h06

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