Extraire un réseau de coauteurs depuis la base PubMed

La base MEDLINE contient environ 23 millions d’articles scientifiques, accessibles via le moteur de recherche PubMed depuis une vingtaine d’années. Ces articles sont utilisés pour toutes sortes d’analyse, des méta-analyses aux analyses de communautés sémantiques. La base PubMed, c’est très littéralement du big data, et les chercheurs comme les entreprises le savent depuis un bail1.

Le sujet vous donne une idée de ce que je vais faire de mes vacances, mais la phase données devrait être indolore : MEDLINE est une base extrêmement bien entretenue, et les opérations ci-dessous font moins saigner des yeux que, par exemple, au hasard (p < .0001), les fichiers du Ministère de l’Intérieur. De plus, on va travailler sur des requêtes précises plutôt que sur la base intégrale.

Allez découvrir PubMed si vous n’avez jamais fait un tour, c’est un tour de force du point de vue de la science archivistique et documentaire, et un fleuron discret de la médecine scientifique contemporaine, “basée sur les preuves” (id est publiée dans une revue scientifique avec un impact factor aussi élevé que possible ; pour les preuves, la maison demande un délai d’environ quinze années supplémentaires) :

Screen Shot 2014-06-14 at 5.26.38 PM

Télécharger une requête PubMed

Les articles en accès ouvert via PubMed Central (PMC) sont facilement téléchargeables depuis un serveur FTP, mais pour obtenir les résultats d’une requête sur la base intégrale, c’est un peu plus long. Heureusement, grâce à Kristoffer Magnusson, il y a ce bout de code vieux de deux ans, qui méritait un petit remix.

La première étape consiste à envoyer une requête PubMed du même type que celle que l’on rentre dans le moteur de recherche en ligne2, et à récupérer en retour un fichier XML qui contient la requête développée en plusieurs mots-clés, après vérification de leur disponibilité dans les mots-clés du thesaurus MeSH (Medical Subject Headings) de la National Library of Medicine. La requête health (inequalit*) donne ainsi :

("health"[MeSH Terms] OR "health"[All Fields]) AND (inequalites[All Fields] OR inequaliti[All Fields] OR inequalities[All Fields] OR inequalities'[All Fields] OR inequalitiies[All Fields] OR inequalitiy[All Fields] OR inequality[All Fields] OR inequality'[All Fields] OR inequality's[All Fields] OR inequalityin[All Fields] OR inequalitys[All Fields])

Mais vous avez plutôt intérêt à formuler la requête health AND (inequality or inequalities), qui va identifier les mots-clés correspondant à l’entrée MeSH consacrée aux facteurs socio-économiques, le nom donné par PubMed aux recherches sur les inégalités de santé. La requête devient alors, sans l’antislash de formatage3 :

("health"[MeSH Terms] OR "health"[All Fields]) AND \(("socioeconomic factors"[MeSH Terms] OR ("socioeconomic"[All Fields] AND "factors"[All Fields]) OR "socioeconomic factors"[All Fields] OR "inequality"[All Fields]) OR ("socioeconomic factors"[MeSH Terms] OR ("socioeconomic"[All Fields] AND "factors"[All Fields]) OR "socioeconomic factors"[All Fields] OR "inequalities"[All Fields]))

Le nombre total d’articles correspondant à la requête se trouve dans le même fichier XML et ne demande que peu d’efforts pour être récupéré, mais c’est surtout le “numéro unique” de la requête qui va nous intéresser : la variable NCID est une chaîne unique qui permet de récupérer les résultats de notre recherche (métadonnées et résumés des articles) sans se fatiguer, une fois placée dans une boucle récupérant n articles k fois.

C’est la seconde et dernière étape : en quelques lignes, on écrit une boucle de téléchargement qui demande les mille premiers articles PubMed correspondant à la requête, qu’on sauvegarde dans un fichier XML, puis les mille suivants, et ainsi de suite. Un fichier XML, c’est du contenu entouré de balises de marquage sémantique, comme dans cet exemple :

Screen Shot 2014-06-14 at 5.04.11 PM

La boucle de téléchargement écrit un rapport qui contient la datation des fichiers, histoire que vous puissiez la lancer en plusieurs fois si nécessaire sans recommencer au début. Le code, qui fait 300 lignes à tout casser, permet aussi de compter le nombre d’articles par année, par revue, ou les deux, ou par nombre d’auteurs.

Démo : la Convention-cadre OMS FCTC

La démo du code télécharge 236 articles en rapport avec la Convention-cadre de l’OMS pour la lutte antitabac. Quand on jette un coup d’oeil aux auteurs les plus fréquents dans le corpus, on trouve par exemple J. Collin et H. M. Mamudu, des noms connus dans ce segment de la littérature :

> pubmed_names('pubmed_fctc', min = 5)
538 Warren CW    14
30     Asma S    13
169 Glantz SA    13
225  Jones NR    13
414     Raw M     8
479  Sinha DN     8
150   Fong GT     7
316 McNeill A     7
67  Borland R     6
87  Chapman S     6
98   Collin J     6
298 Mamudu HM     6

Si l’on regarde les dates, le plus intéressant est au début : les premiers articles apparaissent trois ans avant l’adoption du texte, dans une revue de l’OMS et sous la plume de chargés de mission affectés à son élaboration. Celui-ci bénéficie ensuite d’une couverture exceptionnelle en 2005, son année d’application, et sa couverture reste élevée dans les années récentes4.

> head(pubmed_years('pubmed_fctc'))
  year count
1 2000     1
2 2001     2
3 2002     3
4 2004     1
5 2005    16
6 2006     3

Faites-vous une idée des articles téléchargés en allant lire le plus ancien, qui évoque la Convention-cadre et surtout les accords du GATT : la perspective d’une remise à plat des règles du commerce mondial offre une fenêtre d’opportunité à l’OMS pour produire son propre corpus de normes, en s’inspirant d’autres conventions comme celle de Basel5.

Screen Shot 2014-06-14 at 7.59.48 PM

Voici à présent le nombre d’articles publiés chaque année en lien avec la Convention-cadre par année. Les couleurs soulignent les revues qui ont le publié le plus d’articles (sans surprise, des revues de santé publique comme Tobacco Control et Addiction), ainsi que le Bulletin de l’OMS, le BMJ et le Lancet (il n’y a pas d’articles NEJM dans le corpus).

example

Comme il n’y a pas trop de données, on peut assez bien voir les petites aberrations du corpus, comme par exemple, ci-dessous en 2005, le numéro spécial d’un institut indépendant. La revue était alors basée à Vanves et publiée majoritairement en français ; elle a changé de nom et est à présent publiée par Sage Publications.

pubmed_fctc_lang

Mais… mais où est le réseau ?

Ah, je suis content que vous posiez la question. Pour les habitués, voici donc le réseau des co-auteurs dans le corpus « Convention-cadre OMS anti-tabac », où l’on retrouve les auteurs cités avec une de leurs collègues, plus des connexions entre chercheurs américains et britanniques, le tout entouré de beaucoup d’isolats.

pubmed_fctc_net

Le code pour créer le réseau produit un réseau non dirigé, où chaque lien indique un article co-signé par les deux auteurs. Le poids du lien est inversement proportionnel au nombre de coauteurs par article, additionné pour chaque paire de coauteurs (méthode “Newman-Fowler” ; appellation non contrôlée)6.

Le code du graphique lui-même, qui utilise ggnet (actuellement en soldes !), tient en dix lignes une fois les dépendances installées (packages devtools pour lire la fonction depuis GitHub sans vous embêter, network, sna et intergraph pour les réseaux, et RColorBrewer et ggplot2 pour le graphe).

source_url("https://raw.githubusercontent.com/briatte/ggnet/master/ggnet.R")
d = pubmed_edges("pubmed_fctc")
n = network(d[, 1:2])
n %e% "w" = d[, 3] / max(d[ , 3])
n %e% "q" = as.numeric(cut(n %e% "w", quantile(n %e% "w"), include.lowest = TRUE)) / 4
ggnet(n, segment.alpha = n %e% "q",
      segment.color = "black", size = 1) + 
  geom_text(label = ifelse(degree(n) > quantile(degree(n), .9),
                           network.vertex.names(n), NA), size = 4)
ggsave("pubmed_fctc_net.pdf", width = 11, height = 11)

Les données sont quasi-exhaustives, si l’on en croit le tests initiaux de 2011-2012. En revanche, le graphe peut éventuellement contenir plusieurs fois le même auteur s’il a été identifié par plusieurs combinaisons d’initiales et/ou de noms de famille (par exemple, “C Marquez” et “CR Marquez”).

Plus tard

On ira plus loin une prochaine fois, en regardant les mots-clés et les auteurs de plus près. La méthode de construction du réseau utilisée dans la demo est très basique : d’une part, elle ne collecte aucun attribut sur les auteurs, d’autre part, elle aplanit un réseau bipartite auteur-article où le mode secondaire (l’article) est très intéressant. À suivre, donc.

  1. L’industrie pharmaceutique , par exemple, a largement investi le champ de l’édition scientifique à des fins de légitimation de ses produits. []
  2. L’opérateur par défaut est AND. Les connecteurs logiques doivent être rentrés en majuscules et en anglais. Le reste des consignes est donné dans l’aide de PubMed. []
  3. L’antislash ne sert qu’à éviter un problème d’affichage avec le moteur de formatage du blog ; il ne doit pas figurer dans le code. []
  4. Il y a eu jusqu’à 44 articles sur le sujet en 2012, année d’adoption d’un protocole supplémentaire. Pour rappel, la recherche initiale n’utilise que les résumés (et les titres) des articles. []
  5. Le problème étant, bien évidemment, que jamais l’OMS n’a pu appliquer le genre de sanctions très dissuasives que l’OMC peut employer sur les marchés mondiaux. []
  6. La méthode Newman-Fowler étant additive, ses liens peuvent donc représenter un ou plusieurs articles co-signés. Le code renvoie aussi la version brute des liens au format CSV. []

“Facebook manipule vos émotions” : Milgram 2.0

Les médias n’ont eu aucune difficulté à médiatiser ad nauseam la dernière actualité du réseau social Facebook : en manipulant les informations que lisent plusieurs centaines de millions d’utilisateurs, on peut créer une variation de sentiment de quelques points de pourcentages — et qui correspond, en pratique, à trois fois rien.

Faire varier l’opinion d’un ou plusieurs iotas est inscrit dans l’ADN des médias, et si le verbe “manipuler” est remplacé par le verbe “personnaliser”, on retombe sur la définition de la page d’accueil de Google ou du Monde : de l’information, et beaucoup de publicité, taillée sur mesure pour l’utilisateur, en partie grâce aux données des autres utilisateurs.

Or, les utilisateurs Facebook ne se sont pas tous fait une raison sur le fait que “quand on ne paie pas, on est le produit”. Cette expérience n’est pas unique et ses résultats ne sont pas si encourageants que ça, mais sa grande échelle fournit un bon motif à chacun pour s’indigner de cet état de fait.

Du coup, bien que tout soit écrit noir sur blanc dans les conditions d’utilisation (que personne ne lit) et que n’importe quel essai clinique contrôlé pose exactement les mêmes questions (élevées au risque de vie ou de mort dans certains cas), c’est le cocktail, très efficacement servi par Facebook aux médias, qui fait le plus de bulles, à partir de :

  • 90% d’eau claire (les effets sont de très faible magnitude)
  • 9% de big data (sans guillemets : n > 500 000, bitches)
  • 1% de Milgram 2.0

Le dernier ingrédient concerne les normes éthiques qui s’appliquent aux expériences contrôlées : Facebook semble avoir suivi les normes états-uniennes en la matière, en validant son étude auprès de l’IRB, mais ces normes sont récentes et jamais complètement consensuelles.

Et surtout, on ne sait pas ce que Facebook va faire de ces résultats : si la finalité d’une expérience contrôlée est claire dans le cas d’un essai clinique, elle l’est moins dans le cas d’un réseau social, d’autant plus que les publicitaires n’avaient pas besoin de cette étude pour acheter ses services.

En définitive, c’est ce dernier travestissement qui peut poser problème : sous couvert de mener une recherche inductive de sociologie appliquée à l’insu de votre plein gré, Facebook vend sa force de frappe publicitaire, et votre réaction indignée fait partie intégrante de la stratégie de diffusion auprès des futurs investisseurs.

Milgram, peut-être, mais “2.0”.