tableau statistiques descriptives

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

herve chapuis
Messages : 110
Enregistré le : 05 Déc 2008, 15:26

tableau statistiques descriptives

Messagepar herve chapuis » 27 Fév 2023, 12:39

Bonjour à tous.

Je souhaite obtenir un tableau de statistiques descriptives pour certaines colonnes (col 13 à col 169 qui sont des données d'expression génique) d'un fichier.
En tapant

Code : Tout sélectionner

SUMMARY<-apply(Donnees[,c(13:169)],2,summary)

j'obtiens une liste.
Je souhaiterais plutôt un data.frame avec notamment le nombre de données manquantes.

J'ai essayé

Code : Tout sélectionner

array(unlist(apply(Donnees[,c(13:169)],2,summary)),dim=c(7,157))


La première colonne me donne bien les 7 chiffres recherchés. Les lignes sont respectivement min, 1st Quart, median, mean, 3rd Quart, max et Na's
Hélas, vu que je n'ai pas toujours des données manquantes, dès la seconde colonne je constate un décalage.

Or j'ai besoin du nombre de Na's pour automatiser un traitement (du genre si le nombre de Na est supérieur à un seuil donné j'écarte la donnée, sinon je pourrai essayer d'imputer).
De préférence, ce data.frame aurait les données d'expression en ligne (avec le row.name kivabien mais je devrais m'en débrouiller) et 7 colonnes.

Je peux y parvenir en mode bourrin avec des boucles for mais je veux croire qu'il existe aussi des méthodes plus élégantes :)

D'avance merci :)
Ingénieur de recherche INRAE Toulouse

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: tableau statistiques descriptives

Messagepar Maxime Deniaux » 27 Fév 2023, 14:27

Salut,

j'ai cherché un peu au niveau des packages de résumé de données, je n'ai pas trouvé pour mettre ça dans un data frame. Du moins, sans retouche à faire ensuite quoi.

Et si effectivement ça n'existe pas, la meilleure solution reste de créer ta propre fonction je pense et même sans partir de ton output complet (toutes tes colonnes) avec la fonction summary. Surtout que ça doit je pense se coder en quelques minutes. Et le problème des NA sera réglé sans souci.



Edit : quelque chose dans ce style,

Code : Tout sélectionner

dataset = Donnees[,colonnes_concernees]

nrow = ncol(dataset)

data_summary = data.frame(matrix(nrow = nrow, ncol = 7))

rownames(data_summary) = colnames(dataset)
colnames(data_summary) = c("min","first_quart","median","mean","third_quart","max","na")


for(i in 1:ncol(dataset)){
 
data_summary$min[i]         = min(dataset[,i],na.rm = T)
data_summary$first_quart[i] = as.numeric(summary(dataset[,i])[2])
data_summary$median[i]      = median(dataset[,i],na.rm = T)
data_summary$mean[i]        = mean(dataset[,i],na.rm = T)
data_summary$third_quart[i] = as.numeric(summary(dataset [,i])[5])
data_summary$max[i]         = max(dataset[,i],na.rm = T)
data_summary$na[i]          = length(which(is.na(dataset[,i])))
                           
}

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: tableau statistiques descriptives

Messagepar Logez Maxime » 27 Fév 2023, 19:41

Bonjour,

Sinon tu peux faire comme ceci :

Code : Tout sélectionner

#un jeu de données test
dta <- as.data.frame(matrix(rnorm(1e3), 100))
dta[] <- lapply(dta, function(x) ifelse(x>2.2, NA, x))

f_summary <- function(dta) {
  res <- rbind(sapply(dta, fivenum), colMeans(dta, na.rm = T), colSums(is.na(dta)))[c(1:3, 6, 4:5,7),]
  colnames(res) <- colnames(dta)
  rownames(res) <- c("Min.   :", "1st Qu.:", "Median :", "Mean   :", "3rd Qu.:",
     "Max.   :", "NA's   :")
  if (is.data.frame(dta))
    res <- as.data.frame(res)
  res
  }
 
f_summary(dta)
De manière générale, ce n'est pas conseillé dans une boucle de répéter des opérations plusieurs fois alors qu'une seule suffit. Par exemple summary(data_set) et utilisée deux fois, pour récupérer les quartiles. Il vaudrait mieux stocker le résultat du summary et ensuite d'extraire les valeurs 2 et 5.
Remarque en passant, il est généralement conseillé d'utiliser " = " comme symbole d'assignation d'une valeur à un argument d'une fonction et d'utiliser " <- " pour assigner un objet à un nom.

Cordialement,
Maxime

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: tableau statistiques descriptives

Messagepar Maxime Deniaux » 27 Fév 2023, 21:18

Salut Maxime,

par rapport à ça :

Remarque en passant, il est généralement conseillé d'utiliser " = " comme symbole d'assignation d'une valeur à un argument d'une fonction et d'utiliser " <- " pour assigner un objet à un nom.


tu pourrais rappeler pourquoi ? Me semble que dans une très grande majorité des cas ça ne change rien non ?

Je fait ça par facilité, et surtout car en plusieurs années j'ai jamais eu de problème mais c'est vrai qu'il me semblait avoir lu qu'il peut potentiellement y avoir un problème dans certains cas. T'as raison d'insister sur les bons reflexes à adopter, mais avec une petite explication en plus t'irais encore plus loin dans la démarche de faire progresser les autres (et je vois à travers tous tes messages que t'as les capacités de le faire. Sachant qu'il n'y a pas 500 personnes qui répondent régulièrement aux posts...qui ont pourtant pas mal de vues, si t'as quelques minutes en plus à chacune de tes réponses pour expliquer d'avantage ce que tu écris, je t'assure que ça fera une différence non négligeable sur l'impact apporté) ! :)

Merci ! a+

PS : pas de news du mainteneur par rapport au topic sur la fonction predict() ?

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: tableau statistiques descriptives

Messagepar Logez Maxime » 28 Fév 2023, 08:21

Maxime Deniaux a écrit :[color]T'as raison d'insister sur les bons reflexes à adopter[/color], mais avec une petite explication en plus t'irais encore plus loin dans la démarche de faire progresser les autres (et je vois à travers tous tes messages que t'as les capacités de le faire. Sachant qu'il n'y a pas 500 personnes qui répondent régulièrement aux posts...qui ont pourtant pas mal de vues, si t'as quelques minutes en plus à chacune de tes réponses pour expliquer d'avantage ce que tu écris, je t'assure que ça fera une différence non négligeable sur l'impact apporté) ! :)

Bonjour,

Je comprends ta remarque, mais c'est impossible. Comme tu l'as fait remarqué il n'y a plus trop de gens qui prennent le temps de répondre. J'essaye donc de continuer à le faire et d'apporter le plus possible des réponses efficaces. Cela je le fais en parallèle de mes autres activités. Je ne peux consacrer plus de temps au forum que je ne me fais déjà.
Ensuite, je pense que c'est aussi aux gens qui viennent poser une question sur le forum de prendre le temps d'analyser les réponses qui sont données et de faire des recherches complémentaires. Ce ne sont pas les ressources qui manquent sur le net. Souvent l'information peut être trouvée rapidement par ailleurs. Je pense aussi que chercher par soi même l'information est formateur et permet de s'approprier plus sûrement le résultat. Comme n'importe quel langage, il faut se faire la main, faire des tests procéder par essais-erreurs pour progresser. Sauf à être un génie on en passe tous par là.
Pour finir je n'ai pas pour but d'être un formateur sur ce forum mais d'apporter mon aide par rapport à l'expérience que je peux avoir de l'utilisation de ce logiciel. Il y a d'autres ressources et moyens pour ça. Ne pas oublier que tout ceci repose sur du bénévolat.

Bien cordialement,
Maxime

P. S : non aucune.

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: tableau statistiques descriptives

Messagepar Maxime Deniaux » 28 Fév 2023, 08:56

Et je comprends ta réponse.

Je disais bien dans mon message que c'était si tu avais le temps (et l'envie bien-sûr), je sais bien qu'on a déjà tous notre propre vie et un temps limité (et que le "travail" fait ici, est gratos comme tu l'évoques)

Me suis permis cette remarque car je vois depuis que j'essaie de répondre souvent ici, que tu prends déjà du temps pour répondre très souvent et que t'as un bon bon niveau (bien supérieur au mien), donc je me suis dis qu'au vu de ton level, ça ne te prendrai pas beaucoup plus de temps pour donner quelques infos en + parfois.
Mais t'es le mieux placer pour savoir si t'as les moyens de le faire ou non par rapport à ton temps et ce que tu cherches à être sur ce forum, bien évidemment (j'espère que ma remarque initiale n'a pas été prise trop de travers :), j'ai beaucoup de respect pour les gens comme toi qui prennent ce temps déjà).

Et je te rejoins sur la partie apprentissage par soi-même, malgré le fait que je pense que ça peut être bien parfois d'avoir des pistes de recherches rapides à défaut d'une explication complète, de la part de la personne aidante.

a+ sur le forum...

Bonne journée

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: tableau statistiques descriptives

Messagepar jean lobry » 22 Avr 2023, 20:32

Maxime Deniaux a écrit :Salut Maxime,

par rapport à ça :

Remarque en passant, il est généralement conseillé d'utiliser " = " comme symbole d'assignation d'une valeur à un argument d'une fonction et d'utiliser " <- " pour assigner un objet à un nom.


tu pourrais rappeler pourquoi ? Me semble que dans une très grande majorité des cas ça ne change rien non ?
[...]

Code : Tout sélectionner

> system.time(x <- rnorm(100))
   user  system elapsed
      0       0       0
> system.time(x = rnorm(100))
Error in system.time(x = rnorm(100)) : unused argument (x = rnorm(100))

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: tableau statistiques descriptives

Messagepar Maxime Deniaux » 26 Avr 2023, 09:41

jean lobry a écrit :
Maxime Deniaux a écrit :Salut Maxime,

par rapport à ça :

Remarque en passant, il est généralement conseillé d'utiliser " = " comme symbole d'assignation d'une valeur à un argument d'une fonction et d'utiliser " <- " pour assigner un objet à un nom.


tu pourrais rappeler pourquoi ? Me semble que dans une très grande majorité des cas ça ne change rien non ?
[...]

Code : Tout sélectionner

> system.time(x <- rnorm(100))
   user  system elapsed
      0       0       0
> system.time(x = rnorm(100))
Error in system.time(x = rnorm(100)) : unused argument (x = rnorm(100))



Salut,

oui effectivement j'avais connaissance de ce type de cas. De la même manière, sur internet on montre souvent l'exemple comme :

mean(x = 1:10) et mean(x <- 1:10) où le premier va simplement renvoyer le résultat là où le second va également créer le vecteur x.

C'était peut-être mal formulé, mais ma question était davantage sur une assignation classique en dehors de toute fonction comme ci-dessus, parce que j'avoue n'avoir encore jamais croisé quelqu'un dans mon travail créant des objets au sein de fonctions comme ici.

Quelle différence entre un x = 1:10 et x <- 1:10 ? A part éventuellement l'aspect de prendre de mauvaises habitudes de code.
C'est dans ce sens là que je disais que j'avais l'impression que dans une grande majorité des cas cela ne changeait rien.

Merci ! :)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: tableau statistiques descriptives

Messagepar Logez Maxime » 26 Avr 2023, 11:59

Bonjour,

Tu trouveras des réponses ici :
https://www.r-bloggers.com/2018/09/why-do-we-use-arrow-as-an-assignment-operator/

Cordialement,
Maxime

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: tableau statistiques descriptives

Messagepar Maxime Deniaux » 26 Avr 2023, 12:38

Logez Maxime a écrit :Bonjour,

Tu trouveras des réponses ici :
https://www.r-bloggers.com/2018/09/why-do-we-use-arrow-as-an-assignment-operator/

Cordialement,
Maxime


Salut Maxime, merci pour la source

J'ai regardé quelques autres articles proposés en-dessous à chaque fin de page.
Je ne sais pas ce qu'il est en est de ton côté, mais comme j'ai dis un peu avant, j'ai jamais vu dans le code de quelqu'un (j'en n'ai pas lu des millions, certes...) des assignations via l'argument d'une fonction. J'ai toujours vu en dehors (ce qui est + clair je pense pour la majorité des gens, pour une meilleure visibilité notamment ?).

Ce qui me fait de nouveau conclure que dans l'immense majorité des cas (j'entends les assignations "classiques" donc), utiliser = et <- n'a pas d'impact de ce que j'ai compris. Et que la préconisation du <- est liée aux quelques cas cités dans notre discussion et l'article. Et que dès lors qu'on est conscient de ces quelques cas, peu importe si on utilise le = ou <-. , puisque l'on est au courant de quand ça pose problème, donc on ne devrait pas faire l'erreur en théorie si on souhaite faire une assignation "non classique"...

Le danger serait pour les personnes qui ne seraient pas au courant de ces derniers. D'où aussi l'intérêt de plutôt leur conseiller le <- pour éviter tout problème dans leur futur. Donc, j'essaierai dans le futur sur le forum d'utiliser ce <- , comme tu l'avais préconisé déjà plusieurs fois...

Mais dans mes propres codes non diffusés sur le forum, j'avoue que je continuerai sûrement à utiliser le = ... car plus simple, rapide, notamment à cause des switch de langage.

Bonne journée !

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: tableau statistiques descriptives

Messagepar Logez Maxime » 26 Avr 2023, 13:02

Un conseil reste un conseil.
Libre à tout à chacun de coder comme il l'entend.
Cordialement,
Maxime

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: tableau statistiques descriptives

Messagepar jean lobry » 04 Mai 2023, 19:09

Logez Maxime a écrit :Un conseil reste un conseil.
Libre à tout à chacun de coder comme il l'entend.
Cordialement,
Maxime

Code : Tout sélectionner

#
# Je n'ose pas invoquer l'argument d'asymétrie de Spinoza, mais quand même :
#

"Logez Maxime" -> GrandSage

#
# Essayez de faire de même avec un simple '=' que vous allez fatalement confondre avec un '=="
#


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité