David Madore's WebLog: Sur l'impact de la structure du graphe social dans le taux d'attaque des épidémies

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]

↓Entry #2645 [older| permalink|newer] / ↓Entrée #2645 [précédente| permalien|suivante] ↓

(mardi)

Sur l'impact de la structure du graphe social dans le taux d'attaque des épidémies

Je suis vraiment débordé (le temps que je passe à me documenter sur l'épidémie et à répondre aux présentations biaisées et autres conneries sur Twitter représente une surcharge de travail absolument énorme qui s'ajoute au fait que tout est devenu tellement plus long et compliqué dans ma vie, je ne vais pas pouvoir tenir longtemps comme ça), donc je me contente ici de reproduire en français ce que j'ai écrit dans un fil Twitter :

Il s'agit d'expériences numériques sur l'influence de la structure du graphe social sur le taux d'attaque des épidémies (taux d'attaque = le nombre de personnes infectées cumulé pendant l'épidémie).

Rappelons la situation basique : j'ai déjà écrit ici sur mon blog (et ici en anglais sur Twitter) sur ce que prédit le modèle épidémiologique SIR au sujet du taux d'attaque. En bref, il prédit un taux d'attaque énorme : 89% (de la population touchée) pour un nombre de reproduction de 2.5. (La formule, comme je l'ai expliqué, est 1 + W(−κ·exp(−κ))/κ = 1 − exp(−κ) + O(κ·exp(−2κ)) où κ est le nombre de reproduction. Par ailleurs, il faut bien différencier ce taux d'attaque du seuil d'immunité grégaire qui, lui, vaut, 1 − 1/κ, et qui est le taux d'infectés à partir duquel l'épidémie commence à régresser, c'est-à-dire le taux d'attaque au pic épidémiologique.)

Or les épidémies réelles ne semblent pas avoir des taux d'attaque aussi énormes, même avec des nombres de reproduction de l'ordre de ce que je viens de dire. Bien sûr, on connaît mal le taux d'attaque même a posteriori, mais (malgré une absence d'immunité préalable aux souches) il semble que les grippes de 1918 et 1957 aient infecté autour de 30% de la population à différents endroits, pas franchement autour de 90%.

Alors que se passe-t-il ? Mon explication est que SIR, étant un modèle basé sur des équations différentielles, ne connaît qu'une seule chose, c'est la proportion de la population qui est susceptible, infectée et rétablie, et pas où ces personnes sont ni comment elles interagissent socialement.

Autrement dit, un tel modèle suppose un « mélange parfait » : tout individu a la même probabilité d'infecter n'importe quel autre individu. Ce n'est bien sûr pas du tout le cas dans la réalité. En réalité, une bonne proportion des contaminations suit un graphe social (famille, amis, collègues).

Même les modèles plus sophistiqués qui stratifient la population par catégories d'âge (disons) supposent toujours un mélange parfait dans chaque catégorie. Je soupçonne que c'est la raison pour laquelle le papier d'Imperial obtient un taux d'attaque si élevé (j'en ai déjà parlé dans cette entrée, voir aussi ce fil Twitter).

Alors, comment peut-on prendre en compte le fait que les contaminations suivent des graphes sociaux, et que doit-on en attendre ? Je m'attendais, et je voulais tester, deux effets apparentés mais distincts :

Le premier effet est que si l'épidémie doit suivre les liens d'un graphe social de connectivité relativement modeste (chacun n'ayant qu'un petit nombre de parents/amis/collègues par rapport à toute la population), elle va s'étouffer plus rapidement, même pour un nombre de reproduction donné, par rapport au cas de mélange aléatoire : c'est ce que j'ai essayé de dire ici sur Twitter ainsi que dans cette entrée dans la phrase la première [sous-raison] c'est (a) que quand on retire une proportion suffisamment élevées de sommets d'un graphe (en l'occurrence celui des contacts humains), il cesse de « percoler », c'est-à-dire qu'on ne peut plus passer d'un sommet à un autre. Ce phénomène est, en effet, lié à des questions de seuil de percolation dans les graphes (qui est, en gros, la proportion des sommets, ou des arêtes selon la définition, qu'il faut retirer aléatoirement à un graphe pour qu'il cesse d'avoir une composante connexe géante) : l'idée est que quand suffisamment de personnes (=sommets, =nœuds) sont immunisées, l'épidémie ne peut plus se propager d'un point à un autre : même avec l'hypothèse de mélange parfait le nombre d'immunisés ralentit l'épidémie, mais le seuil de percolation suggère qu'une proportion plus faible d'immunisés peut arrêter complètement la propagation (et, probablement, on la ralentit plus vite avant de l'arrêter complètement).

Le second phénomène est différent : non seulement il doit suffire de retirer relativement peu de nœuds pour arrêter l'épidémie (comme je viens de l'expliquer), mais en plus l'épidémie va retirer (c'est-à-dire infecter et rendre immuns) en premier les nœuds les plus « précieux » à sa propre propagation, parce que ce sont les nœuds les plus connectés, les « célébrités ». C'est ce que j'ai essayé d'exprimer ici et  (+ tweet suivant) sur Twitter, ainsi que dans la même entrée que mentionée dans la phrase (b) les infections ont tendance à infecter en premier les personnes qui sont hautement connectées dans le graphe, et en les rendant immunes, elle neutralise en premier les liens qui lui permettaient le plus facilement de se propager.

Tout ça n'est que mon intuition ! Maintenant, voyons si je peux modéliser ces phénomènes, pour au moins montrer qu'ils existent. Je ne vais pas chercher à quantifier les effets (il y a tout simplement trop de paramètres avec lesquels jouer), seulement d'illustrer qu'ils peuvent exister et semblent jouer dans la direction que je pensais.

J'ai donc écrit un petit programme Perl qui simule un modèle épidémique SEIR stochastique. SEIR, ça signifie que les nœuds (les individus) passent entre quatre états, S = susceptible = non-infecté, puis E = exposé = en incubation, puis I = infectieux et enfin R = rétabli = immunisé ou mort. Stochastique, ça signifie que plutôt que modéliser les choses avec des équations différentielles, je prends un grand nombre de nœuds (300 000 dans mes expériences) et les contaminations ont lieu au hasard. Ça rend les calculs non-reproductibles, mais cela permet de gérer des situations bien plus complexes qu'avec des équations différentielles.

Pour simplifier, mon programme postule qu'un nœud une fois infecté, il passe par les étapes E, I, R en un temps constant. Spécifiquement, les paramètres que j'ai utilisés sont qu'à partir de l'infection on passe 5 pas de temps dans l'état E puis 25 pas de temps dans l'état I, avant de passer enfin dans l'état R. (En fait je pense que c'est plus réaliste que le modèle SIR sur équations différentielles, qui suppose que le rétablissement suit un processus exponentiel de paramètre γ : or personne ne guérit en un tout petit nombre de jour ; donc les deux sont simplifiés, mais je pense que cette simplification de temps constant est plutôt meilleure. Si on essaie d'imaginer une épidémie comparable à Covid-19, ce que je ne prétends pas vraiment faire, il faut se dire que le pas de temps vaut à peu près un demi-jour.)

On peut ensuite jouer à faire varier la manière dont l'infection a lieu, selon plusieurs scénarios :

  1. À une extrême, on a la situation purement aléatoire, c'est-à-dire de mélange parfait : chaque nœud infectieux (I), à chaque pas de temps, a une certaine probabilité d'infecter un autre nœud purement aléatoire. Sans aucune structure sociale. Ceci est très proche du modèle S(E)IR sur équations différentielles, et je m'attends à un taux d'attaque similaire.
  2. À l'autre extrême, on peut restreindre les infections à suivre les arêtes d'un graphe sociale. Mais ce graphe peut lui-même être construit de différentes manières :
    1. On peut prendre un graphe aléatoire à peu près homogène ayant une certaine connectivité moyenne : un modèle pour le construire est de le créer sommet par sommet, et, à chaque fois, de connecter le sommet nouvellement construit à un certain nombre de sommets préexistants tirés au hasard. Ceci fournit un graphe sans nœuds hautement connectés, i.e., sans « célébrités ». (En fait, le cas de mélange parfait est équivalent à cette construction où on connecte chaque nœud à tous les autres. Mais je suppose ici implicitement que la connectivité moyenne est faible devant le nombre total de nœuds !)
    2. Ou on peut prendre un graphe avec un « effet de célébrité », selon une construction donnant un petit nombre de nœuds hautement connectés et une décroissance essentiellement en loi de puissance de la connectivité des sommets. Il y a un modèle standard pour ça, c'est le modèle de Barabási-Albert (Emergence of Scaling in Random Networks, Science 286 (1999), 509–512) : en gros, en modifiant à peine leur construction, ce que modèle fait est de construire le graphe nœud par nœud comme au point précédent, mais en choisissant cette fois les nœuds auxquels relier un nœud nouvellement créé proportionnellement à la connectivité qu'ils ont déjà, ce qui revient à tirer non pas un nœud au hasard mais une arête au hasard dont on prend aléatoirement un des deux sommets. Ceci donne un graphe ayant un très haut effet de célébrité à cause du fait que les nœuds déjà hautement connectés ont tendance à devenir encore plus hautement connectés au fur et à mesure que le graphe croît (avec un phénomène d'invariance d'échelle) ; ce phénomène reproduit des effets en loi de puissance observés dans de nombreux types de phénomènes sociaux réels, comme expliqué dans l'article de Barabási et Albert. Bien sûr, ce modèle est très criticable, et probablement pas idéal pour modéliser les rapports sociaux réels, donc pas idéal pour simuler une épidémie, mais mon but est simplement de tester la manière dont différents effets, comme la célébrité, ont un impact, donc on va faire avec ça.

Bref. Mon programme est capable de suivre ces trois modes, ou n'importe quelle combinaison de ceux-ci (mais dans mes simulations, je vais suivre ces trois scénarios extrêmes). Le code source est ici (c'est du Perl, il y a d'abondants commentaires au début expliquant le fonctionnement général et comment s'en servir ; essentiellement, il faut régler les paramètres à travers les constantes au début du programme, je n'ai pas eu le temps de faire des choses plus raffinées).

Il y a cependant un autre problème qu'on doit régler avant de comparer des taux d'attaques dans ces différents scénarios : que doit-on garder constant ? Mon programme prend en entrée des paramètres numériques tels qu'une probabilité de contagion par pas de temps et par lien ; mais ça, ce n'est pas quelque chose qu'on peut observer directement ! Les deux choses qu'on peut espérer observer dans une épidémie, ce sont des choses comme :

  • Le taux de croissance du nombre d'infectés avec le temps, pendant la phase exponentielle de l'infection, c'est-à-dire le facteur d'augmentation, par unité de temps, du nombre I d'infectés (plus tant de pourcents par jour), ou, pour être un peu plus précis, sa dérivée logarithmique (= dérivée de log(I), c'est-à-dire I′/I, rapport entre l'augmentation absolue I′ par unité de temps, et le nombre absolu I). Problème, ce taux de croissance dépend lui-même du temps.
  • Le nombre de reproduction. Et encore, ce nombre-là lui-même est délicat à observer ! Dans le modèle SIR à équations différentielles, si les paramètres sont β (taux d'infection) et γ (taux de rétablissement), le taux de croissance de l'exponentielle, au début de l'infection, vaut βγ, tandis que le nombre de reproduction vaut κ = β/γ. Mais ceci n'est pas facile à transposer à d'autres modèles !, notamment si le rétablissement ne suit pas un processus exponentiel. Et j'avoue ne pas bien comprendre ce que calculent réellement les épidémiologues et statisticiens quand ils annoncent un certain nombre de reproduction. Pour estimer ce nombre dans mon modèle, je suis parti d'une définition plus théorique : j'étiquette chaque individu infecté par une génération d'infection, qui vaut 0 pour les individus initialement contaminés, et g+1 pour les individus infectés par des individus de la génération g. Alors le nombre de reproduction devrait être la base de la croissance exponentielle selon g du nombre d'individus infectés de la génération g. Problème, il dépend fortement de g.

Ce que j'ai fait pour estimer le taux de croissance et le nombre de reproduction est de chercher la plus forte pente (du log du nombre d'infectés en fonction, dans un cas, du temps et dans l'autre, de la génération) entre deux points suffisamment espacés (j'ai arbitrairement choisi 20 pas de temps pour la pente dans le temps, et 2 générations pour la pente en générations), et ayant au moins pour valeur la racine carrée du nombre de nœuds pour éviter les bizarreries liées au tout début de l'infection. C'est un peu du bidouillage, mais il faut bien choisir quelque chose à comparer.

Bref. J'ai pris chacun des trois scénarios décrits ci-dessus ((1) mélange parfait aléatoire, (2a) diffusion selon un graphe homogène, et (2b) diffusion selon un graphe avec fort effet de célébrité) et, à chaque fois, j'ai réglé les paramètres de manière à produire des nombres de reproduction proches et des taux de croissance comparables, et à chaque fois j'ai observé le taux d'attaque final et le taux d'attaque au pic de l'épidémie (ainsi que différentes autres statistiques). J'ai cherché à être conservateur : par exemple, pour affirmer que les effets sociaux diminuent le taux d'attaque par rapport au mélange parfait, je cherche des valeurs des paramètres sur un graphe social qui donnent un taux de croissance et un nombre de reproduction au moins égaux à ce que je fixe pour le cas de mélange aléatoire, et qui donnent quand même un taux d'attaque plus faible.

Bref, voici quelques simulations ! À chaque fois je montre trois images : la première est la courbe de l'évolution de l'épidémie en fonction du temps (sachant, de nouveau, que la durée d'incubation est de 5 pas de temps et qu'on est ensuite infectieux pendant 25 pas de temps — ces valeurs sont identiques sur toutes mes simulations), avec une échelle logarithmique en ordonnée ; la deuxième est le nombre d'infectés par génération d'infectés, toujours avec une échelle logarithmique en ordonnée ; et la troisième donne un certain nombre de statistiques produites par le programme, dont celles qui m'intéressent le plus sont : d'une part les paramètres à contrôler, à savoir le pic du nombre de reproduction et le pic de la pente logarithmique (= taux de croissance) du nombre d'infectés dans le temps ; et d'autre part les paramètres à mesurer, à savoir le taux d'attaque final, et le taux d'attaque au moment du pic d'infectés (ce qui donne une idée du seuil d'immunité grégaire comme je l'ai expliqué plus haut).

Première simulation (ci-dessous) selon le scénario (1), c'est-à-dire avec mélange parfait (sans aucun graphe social) : les paramètres choisis donnent un nombre de reproduction de 2.44 et un taux de croissance des infectés de 0.062 par pas de temps, pour un taux d'attaque final de 89% et un taux d'attaque au pic de l'épidémie de 67%. Ce taux d'attaque de 89% est très proche de ce que prédit le modèle SIR pour un nombre de reproduction de 2.44 (à savoir 88%), ce qui conforte l'idée qu'on est très proche de ce modèle, et/ou que ma mesure du nombre de reproduction est à peu près sensée.

[Courbe de l'épidémie dans le temps] [Nombre d'infectés par génération] [Statistiques sur l'épidémie]

Deuxième simulation (ci-dessous) selon le scénario (2a), c'est-à-dire selon un graphe à peu près homogène, ici avec un degré moyen de 10 (je rappelle que le nombre de nœuds est de 300 000) : les paramètres choisis donnent toujours un nombre de reproduction de 2.44, un taux de croissance des infectés un peu plus élevé de 0.073 par pas de temps, et pourtant, on trouve un taux d'attaque final plus faible de 60%, et un taux d'attaque au pic d'infectés de 39%.

[Courbe de l'épidémie dans le temps] [Nombre d'infectés par génération] [Statistiques sur l'épidémie]

Cette simulation semble donc conforter l'intuition sur le premier effet que j'ai exprimée plus haut, à savoir que forcer l'épidémie à suivre un graphe social de connectivité modeste, va diminuer considérablement le taux d'attaque, même pour un nombre de reproduction donné (et/ou même pour une croissance donnée avec le temps lors de la phase exponentielle de l'épidémie).

Combien peut-on compter sur cette effet dans la vraie vie ? Je n'en ai aucune idée ! Mon modèle prétend juste montrer que l'effet existe, pas montrer son ampleur. Mais je crois comprendre qu'il semble vrai que beaucoup si ce n'est la grande majorité des infections suivent un lien social (famille, ami, collègue) plutôt que des rencontres aléatoires. Ceci pourrait donc aider à expliquer que des épidémies réelles s'arrêtent bien avant un taux d'attaque de l'ordre de 90%.

Enfin, une simulation (ci-dessous) selon le scénario (2b), c'est-à-dire selon un graphe qui est cette fois-ci extrêmement « social » avec un effet de célébrité fort. Le degré moyen est toujours de 10, mais le nombre de nœuds ayant au moins k voisins décroît, dans la partie à régime en loi de puissance, en C·k−2 : les vrais graphes sociaux dans la vraie vie ne sont probablement pas aussi extrêmes ! Mais le but étant uniquement d'explorer le sens de l'effet et de tester mon intuition, voyons ce qui se produit :

[Courbe de l'épidémie dans le temps] [Nombre d'infectés par génération] [Statistiques sur l'épidémie]

Avec des paramètres donnant un nombre de reproduction (générationnel, comme toujours) comparable et même un peu plus élevé, de 2.50, et un taux de croissance pendant la phase exponentielle encore un peu plus élevé, 0.092 par unité de temps, on trouve néanmoins un taux d'attaque final très modéré, autour de 35%, et possiblement une immunité grégaire à partir de 23%. Ceci semble donc corroborer l'intuition que j'exprimais quant au second effet mentionné ci-dessus, à savoir que le fait pour l'épidémie d'attaquer en premier lieu les célébrités va diminuer son taux d'attaque final.

Encore une fois, je ne sais pas à quel point cet effet fonctionne dans la vraie vie ! Je prétends juste montrer qu'il peut influencer dans le sens que j'ai dit. Mais je remarque quand même qu'on a très rapidement entendu parler d'énormément de célébrité et de personnalités politiques infectées par le Covid-19 : il y a sans doute deux raisons qui jouent, l'un étant qu'ils peuvent se faire tester plus facilement que le vulgum pecus (mais si c'est la seule explication, cela va dans le sens de montrer que le nombre de cas serait sous-évalué), l'autre étant celui que je viens d'expliquer (qui diminuerait donc le taux d'attaque) ; dans les deux cas, c'est plutôt une bonne nouvelle.

↑Entry #2645 [older| permalink|newer] / ↑Entrée #2645 [précédente| permalien|suivante] ↑

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]