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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2017
    Messages : 7
    Points : 2
    Points
    2

    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 du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    février 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : février 2017
    Messages : 32
    Points : 57
    Points
    57

    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 du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    février 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : février 2017
    Messages : 32
    Points : 57
    Points
    57

    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
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2017
    Messages : 7
    Points : 2
    Points
    2

    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 du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    février 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : février 2017
    Messages : 32
    Points : 57
    Points
    57

    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
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2017
    Messages : 7
    Points : 2
    Points
    2

    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 du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    février 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : février 2017
    Messages : 32
    Points : 57
    Points
    57

    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
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2017
    Messages : 7
    Points : 2
    Points
    2

    Par défaut

    Merci beaucoup !!

  9. #9
    Membre régulier
    Inscrit en
    février 2011
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 54
    Points : 99
    Points
    99

    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
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2017
    Messages : 7
    Points : 2
    Points
    2

    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 régulier
    Inscrit en
    février 2011
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : février 2011
    Messages : 54
    Points : 99
    Points
    99

    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 du Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    février 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : février 2017
    Messages : 32
    Points : 57
    Points
    57

    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, 20h50
  2. Réponses: 2
    Dernier message: 11/08/2011, 15h04
  3. Réponses: 2
    Dernier message: 13/01/2010, 14h54
  4. Réponses: 13
    Dernier message: 27/11/2007, 12h06

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