Interlude de programmation : l’élégance mystérieuse des listes

Je me tourne les pouces pendant que mon code est en train de rouler dans R (1). Alors, autant vous parler de l’utilisation des listes dans ce logiciel et de ma nouvelle fonction préférée, lapply! Je vous avertis, c’est un billet plus technique, mais qui pourra peut-être intéresser des gens.

J’ai découvert récemment combien une liste peut être utile dans R. On peut y mettre des vecteurs ou des fichiers de données. En soi, la liste ne me semblait pas très utile, c’est pourquoi je ne l’avais jamais utilisée.

Mais admettons que vous voulez effectuer une même opération sur plusieurs variables ou sur plusieurs fichiers de données. Vous pouvez ranger ces variables ou ces fichiers dans une liste et effectuer en une seule ligne la même opération sur tous les éléments de la liste! Mettons ça un peu plus concret, mais pas trop (c’est un interlude, pas un cours de programmation) :

Vous voulez changer aléatoirement les valeurs d’une variable dans votre fichier de données. Mais vous voulez faire cette opération 100 fois! Et bien vous n’avez qu’à créer une liste comprenant 100 fois votre jeu de données en utilisant lapply et utiliser encore une fois la fonction pour randomiser cette colonne :

>a <- c(1, 2, 3, 4, 5)
>b <- c(45, 34, 50, 100, 64)
>test <- data.frame(a, b) #On crée un fichier avec deux colonnes a et b
>#On crée une liste qui contient 2 copies du fichier
>test2 <- lapply(1:2,function(x) test)
>test2
[[1]]
a b
1 145
2 234
3 350
4 4 100
5 564

[[2]]
a b
1 145
2 234
3 350
4 4 100
5 564
>#Et on randomize la colonne a! 
>test3 <- lapply(test2, function(df) transform(df, a = sample(a))) 
>test3
[[1]]
  a   b
1 145
2 534
3 250
4 3 100
5 464

[[2]]
  a   b
1 345
2 534
3 150
4 4 100
5 264

Je n’aurais jamais réussi la dernière partie sans de l’aide sur Stack Overflow.

Ça a l’air d’être un exemple inutile. Mais non! Ça arrive souvent qu’on veuille redistribuer aléatoirement une variable pour faire plusieurs itérations (répétitions) d’une analyse. Ça peut permettre de vérifier si les résultats sont dus à des processus aléatoires.

(1)    Pour les non-initiés, j’ai lancé une analyse. Quand les analyses sont longues, l’ordinateur ne les fait pas instantanément. C’est plate.

Interlude de programmation

Avis aux lecteurs n’utilisant jamais les statistiques : ce texte n’est pas pour vous. J’y décris un problème auquel je me suis heurtée et la solution à laquelle je suis arrivée. Ça peut avoir l’air plate, mais peut-être que ça aidera quelqu’un, un jour.

J’analyse présentement des données qui ont une distribution binomiale négative. La distribution binomiale négative et la distribution de poisson, contrairement à la distribution normale, ne sont pas symétriques. En fait, elles s’étirent comme une queue de poisson.

La distribution négative binomiale, sous forme de GIF (Merci Wikipedia https://en.wikipedia.org/wiki/Negative_binomial_distribution)

La distribution négative binomiale, sous forme de GIF (Merci Wikipedia https://en.wikipedia.org/wiki/Negative_binomial_distribution)

Le problème : l’analyse statistique que j’utilise (modèle linéaire généralisé mixte) a comme supposition que nos données se présentent sous la forme d’une distribution normale.

La solution : certaines fonctions des logiciels statistiques ont des fonctions particulières pour tenir compte de ces distributions non normales. Dans le logiciel SAS, c’est la fonction GLIMMIX. Dans R, on a l’option glmer.nb.

Le nouveau problème : mes modèles ne convergent pas (1), autant avec SAS qu’avec le logiciel R.

Nouvelle solution : la fonction glmmadmb (package glmmADMB, R) permet aussi de faire des modèles avec distribution binomiale négative. Et ça marche!

Le nouveau nouveau problème : Les autres fonctions que j’utilise, comme une me permettant de faire de la sélection de modèle, ne sont pas compatibles avec glmmadmb. Aussi, c’est dur à dire glmmadmb.

Nouvelle nouvelle solution (comme un modèle, les problèmes, c'est itératif) : j’ai écrit mon propre code pour faire un tableau de sélection de modèles. Je me suis fortement inspirée du package AICcmodavg et du cours que j'ai suivi avec son auteur, Marc Mazerolle (2). Probablement pas la fonction la plus élégante, mais la voici :

  #Tout d'abord, créer une liste des modèles (Modlist) pour la sélection ainsi qu'une liste de noms de modèles (Modnames)

  table.sel <- function(Modlist, Modnames){
    Out <- data.frame(cbind(Modnames, unlist(lapply(Modlist, "[[", "npar")), unlist(lapply(Modlist, FUN= AIC)),
            unlist(lapply(Modlist, "[[", "loglik"))), stringsAsFactors = FALSE)
    colnames(Out) [1:4] <- c("Names", "K", "AIC", "LogL")
    order <- order(Out$AIC)
    Out <- Out[order, ]
    Out$AIC <- as.numeric(Out$AIC)
    Out$LogL <- as.numeric(Out$LogL)
    Out$K <- as.numeric(Out$K)
    Out$Delta_AIC <- abs(ave(Out$AIC,FUN=function(x)x[1]-x))
    Out$ModelLik<-exp(-0.5*Out$Delta_AIC)
    Out$AICWt<-Out$ModelLik/sum(Out$ModelLik)
    print(Out)
  }

  tab <- table.sel(Modlist= Modlist, Modnames= Modnames)

Il est possible assez aisément de transformer le code pour sélectionner des AICc

Ajout (29-06-2015): Finalement, j'ai du changer de types d'analyses que je faisais et j'ai donc tout fait ça...pour rien ! Mais peut-être que mon expérience vous inspirera/vous sera utile !

(1) Si vous ne connaissez pas les statistiques et que vous lisez toujours, les modèles linéaires généralisés sont une équation. Le logiciel statistique essaie, avec plusieurs essais, de résoudre l’équation. Si après plusieurs itérations il n’y réussit pas, on dit que le modèle ne converge pas.

(2) Plutôt que d'utiliser mon code, utilisez ses excellentes fonctions. À moins d'être pris avec une distribution binomiale négative.

Survivre à commencer à penser à analyser ses données

Publié originalement le 9 octobre 2014

Cette semaine encore, je vais me servir d’un problème que je vis comme sujet. C’est pratique, car dans mon doctorat, j’ai des problèmes sur une base régulière. Donc, parlons analyses de données et plus précisément, ce terrible moment où l’on veut commencer, mais on ne sait pas trop par quel bout aborder la question. On peut diviser les tâches préparatoires en plusieurs étapes, à faire dans l’ordre ou dans le désordre.

Vérification des données

Vous avez récolté des données à la sueur de votre front. Si vous n’avez pas d’ordinateur de terrain, vous avez saisi les données (ou avez fait saisir les données… merci, étudiants au bac!). Prenez le temps nécessaire pour vérifier les données. Les problèmes d’importations des données dans les logiciels statistiques résultent souvent d’un manque de vérification. Pensez surtout à :

  • Comment sont saisies les données manquantes : un point, une case vide, un Na. Le choix dépendra de votre logiciel statistique.
  • Uniformisation des valeurs des variables catégoriques : par exemple, avez-vous toujours écrit Cassé lorsque vous rapportiez l’état de la tige d’un arbre, ou avez-vous aussi utilisé cassé et cassée?
  • Une virgule ou un point pour vos chiffres? Un détail qui bloque souvent lors du passage d’Excel à un logiciel statistique.
  • Erreurs potentielles dans le jeu de données : une valeur impossible, une date mal saisie, etc. Bien souvent, elles ne peuvent être détectées que par quelqu’un qui comprend bien le projet.

Revoir l’objectif des analyses

«Ben là ! C’est évident que j’ai déjà pensé à ce que je voulais analyser! »

Effectivement, vous savez probablement déjà quel type de conclusion vous voulez tirer de ces données. Et vous avez peut-être même décidé à l’avance quel type d’analyse effectuer (1). C’est quand même une excellente pratique que de réviser les décisions prise précédemment. De votre objectif découlent les variables que vous analyserez et le type d’analyse statistique utilisée.

Bien souvent, on récupère plus de données que ce dont on a besoin… commencez par analyser l’essentiel. Retournez aux décisions prises avant la collecte de données. Ça vous permettra de débuter les analyses. Vous pourrez toujours rajouter une couche de complexité par la suite.

Explorez vos données!

C’est une étape excitante! (2) Avant de procéder avec une analyse super complexe, vous devriez visualiser les données, graphiquement ou avec des statistiques descriptives comme les moyennes et écarts-types. J’avoue que j’ai tendance à sauter cette étape, surtout que mes analyses sont rarement complexes. Mais visualiser les données peut suggérer des analyses à faire, des variables à explorer…

L’exploration des données permet également d’éviter des problèmes statistiques. À ce sujet, Zuur et al. (2010) ont écrit un article brillant que je consulte régulièrement. Je vous le conseille et je me le conseille fortement.

Et maintenant?

Et maintenant, il faudra que je passe aux analyses en tant que telles. J’aimerais bien savoir si vous avez d’autres étapes à me suggérer!

(1) Sans cette décision préliminaire, c’est plutôt ardu de faire une bonne récolte de données. Comme le billet d’aujourd’hui s’adresse plutôt à l’analyse des données, je n’embarque pas dans la préparation du travail de collecte… ce sera pour une autre fois!

(2) Relativement excitante…

Zuur, A. F., E. N. Ieno et C. S. Elphick (2010). A protocol for data exploration to avoid common statistical problems. Methods in Ecology & Evolution 1: 3-14.