D’un abus de langage…

Dans mon cours d’analyse des données, je commençais par présenter les diverses distances et normes, en particulier, celles qui dérivent d’un produit scalaire, comme la norme Euclidienne \|\boldsymbol{X}\|_{\mathbb{I}}^2=\boldsymbol{X}^\top\boldsymbol{X}, ou plus intéressante, la norme que l’on peut construire à partir d’une matrice \boldsymbol{M} symétrique définie positive, \|\boldsymbol{X}\|_{\boldsymbol{M}}^2=\boldsymbol{X}^\top\boldsymbol{M}\boldsymbol{X}. Un exemple bien connu étant la norme de Mahalanobis, ou la distance associée, où on prend pour \boldsymbol{M}  la matrice \boldsymbol{\Sigma}^{-1}\boldsymbol{\Sigma}=\text{Var}[\boldsymbol{X}]. Sauf que, par abus de langage, j’appelle aussi distance de Mahalanobis le distance obtenue en prenant pour matrice \boldsymbol{M} la matrice diagonale \boldsymbol{\Delta}_{\boldsymbol{\Sigma}}^{-1} définie par \boldsymbol{\Delta}_{\boldsymbol{\Sigma},ii}=\boldsymbol{\Sigma}_{ii}. En fait, c’est cette matrice que l’on utilise principale en analyse de données, par exemple en analyse des correspondances principales… Prenons un petit exemple, avec quelques données centrées

library(FactoMineR)
library(clusterGeneration)
library(mnormt)
n=15
S=genPositiveDefMat("unifcorrmat",dim=4)
X=round(rmnorm(n,varcov=S$Sigma)+8,2)
for(j in 1:ncol(X)) X[,j]=X[,j]-mean(X[,j])
rownames(X)=1:n
colnames(X)=LETTERS[1:4]

et seulement 4 variables. Par défaut, quand on fait une analyse en composantes principales, on va réduire les données

acp = PCA(X,scale.unit = TRUE,graph = FALSE)
fviz_pca_var(acp, col.var = "cos2")

Le fait de centrer et réduire les données fait que l’on travaille avec la matrice de corrélation (\boldsymbol{X}^\top\boldsymbol{X}, à un facteur n, ou n-1, près). D’où le cercle de corrélation qui apparaît sur la figure. Et abusivement, quand je présente l’ACP, je dis qu’on a deux manière de voir : (1) utiliser le produit scalaire et la distance usuelle (Euclidienne) sur les données centrées et réduites, (2) utiliser la distance de Mahalanobis sur les données centrées. Mon abus de langage tient du fait qu’on utilise la version avec la matrice diagonale \boldsymbol{\Delta}_{\boldsymbol{\Sigma}}^{-1} , et pas la vraie distance de Mahalanobis… En discutant avec Gabriel après mon cours de ce matin, je me suis rendu compte de la confusion possible (même si je me faisais la réflexion lors de mes enregistrements de capsules, les jours passés). Mais en réalité, faire une analyse en composantes principales avec la vraie distance de Mahalanobis n’aurait aucun sens.

Pour s’en convaincre, utilisons les données centrées et réduites,

S = var(X)
Sd = diag(diag(S))
X1 = X%*%solve(chol(Sd))
colnames(X1)=colnames(X)
var(X1)
A B C D
A 1.0000000 0.10113165 -0.88021475 0.4733021
B 0.1011316 1.00000000 0.07885109 -0.7400999
C -0.8802147 0.07885109 1.00000000 -0.5743660
D 0.4733021 -0.74009993 -0.57436600 1.0000000

x

acp1 = PCA(X1,scale.unit = FALSE,graph = FALSE)
fviz_pca_var(acp1, col.var = "cos2")

On n’a plus ici, le cercle des corrélations car la fonction ne sait pas que mes données ont été centrées et réduite au préalable… mais on a la même sortie qu’auparavant à part ça…

Si maintenant on utilise la norme de Mahalanobis, on peut là aussi tranformer les données, en notant que \boldsymbol{X}^\top\boldsymbol{M}\boldsymbol{X} peut aussi s’écrire \boldsymbol{X}^\top\boldsymbol{M}^{1/2}\boldsymbol{M}^{1/2}\boldsymbol{X} soit encore la distance euclidienne standard \tilde{\boldsymbol{X}}^\top\tilde{\boldsymbol{X}} sur les données transformées \tilde{\boldsymbol{X}}={\boldsymbol{X}}{\boldsymbol{M}^{1/2}},

S = var(X)
X2 = X%*%solve(chol(S))
colnames(X2)=colnames(X)
> var(X2)
              A             B             C             D
A  1.000000e+00 -3.582611e-17  5.307644e-16 -1.004784e-16
B -3.582611e-17  1.000000e+00 -3.021333e-16  4.164692e-17
C  5.307644e-16 -3.021333e-16  1.000000e+00 -3.649967e-16
D -1.004784e-16  4.164692e-17 -3.649967e-16  1.000000e+00

ce qui donne des données… orthogonales (pour ne pas dire indépendantes, on retrouve ici le processus de whitening, utilisé en ICA, analyse des composantes indépendantes. Et comme on a rendu les données indépendantes… l’analyse des composantes principales n’aura plus grand chose à raconter…

acp2 = PCA(X2,scale.unit = FALSE,graph = FALSE)
fviz_pca_var(acp2, col.var = "cos2")

Chaque axe explique ici pour 25% de l’inertie… bref, on ne va jamais faire une ACP avec la distance de Mahalanobis (la vraie). Elle ne va pas normaliser les variables, mais les orthonormaliser. Et pourtant, par abus de langage, je vais continuer à utiliser ce terme… Désolé…

Méthodes de prévision en finance (et copules)

Le livre Méthodes de prévision en finance est sorti, en France, cette semaine. L’application que je propose pour montrer la modélisation par copules (par opposition aux modèles GARCH multivariés en particulier) est basée sur un vieux billet sur le blog (ou les codes permettent de reproduire l’analyse que j’en fait), remis en forme dans un court article, Prévision avec des copules en finance

STT5100, introduction et rappels

Reprise des cours ce vendredi pour STT5100, modèles linéaires appliqués. Les supports de cours sont en ligne sur https://github.com/freakonometrics/STT5100. Avec la session en distanciel, le cours sera asynchrone, et je posterais régulièrement des capsules vidéos. Les premières, présentant le cours, et reprenant les principaux concepts déjà vus dans les prérequis, sont en ligne

1. Syllabus video pdf (36:44)
2. Epistémologie video pdf (29:50)

1. Rmarkdown video pdf (30:48)
2. Probabilités video pdf (47:24)
3. Loi normale et vecteur Gaussien video pdf (36:05)
4. Maximum de vraisemblance video pdf (39:56)
5. Estimation paramétrique video pdf (27:32)
6. Estimation nonparamétrique video pdf (37:12)
7. Simulations, Bootstrap video pdf (40:50)
8. Tests (1) video pdf (32:29)
9. Tests (2) video pdf (32:30)
10. Tests (3) video pdf (25:44)
11. Optimisation video pdf (49:57)
12. Algèbre linéaire et matrices video pdf (53:54)

 

ACT6100, rappels et compléments

Reprise des cours ce jeudi, pour le cours ACT6100 d’analyse des données en actuariat. Les supports de cours sont en ligne sur https://github.com/freakonometrics/ACT6100. Avec la session en distanciel, le cours sera asynchrone, et je posterais régulièrement des capsules vidéos. Les capsules d’introduction et de compléments mathématiques sont (presque) toutes en ligne

1. Syllabus video pdf (36:36)
2. Glossaire video pdf (29:38)
3. Historique video pdf (24:54)

1. Vecteurs et distances video pdf (29:24)
2. Algèbre et applications linéaires video pdf (25:11)
3. Vecteurs et valeurs propres video pdf (24:27)
4. SVD video pdf (19:05)
5. Noyaux Hilbertiens video pdf
6. Vecteur Gaussien video pdf (15:11)
7. Convexité video pdf (24:10)
8. Optimisation (1) video pdf (23:26)
9. Optimisation (2) video pdf (35:02)
10. Optimisation et finance video pdf (13:36)
11. Programmation linéaire video pdf (39:10)
12. Temps de calcul video pdf
13. Lissage video pdf (35:19)

(mais on va avancer tranquillement, ces capsules étant à regarder pendant les 2 prochaines semaines.

Reprise des cours pour l’automne

Les cours de la session d’automne reprennent cette semaine, avec ACT6100 (analyse de données en assurance) jeudi et STT5100 (modèles linéaires appliqués). Les slides sont en ligne sur github, ainsi que les liens vers les vidéos (ces derniers seront mis à jour au fur et à mesure…)

Suite aux soucis sur viméo l’hiver dernier, toutes les vidéos sont maintenant sur youtube, avec une chaîne pour STT5100, et une pour ACT6100.

Concilier risques collectifs et décisions individuelles

cet article a été co-écrit avec Laurence Barry.

Les débuts de la pandémie de SARS-CoV-2 (ou COVID-19) ont vu se multiplier les appels à la « responsabilité individuelle », en commençant par de fortes demandes (voire une obligation dans certains pays, dont la France) à rester chez soi autant que possible, au début du printemps 2020, avant qu’il ne soit obligatoire de porter un masque dans les lieux publics (souvent fermés) au cours de l’été. En paraphrasant Coluche, « dire qu’il suffirait que les gens restent chez eux pour qu’on puisse sortir… ». Cet appel à la responsabilité de chacun est faite au nom de tous et pour le bien de tous, venant symboliser cette solidarité toute particulière que nous rappelle la pandémie : le risque que je choisis de courir ne concerne pas seulement ma personne mais constitue aussi un risque pour ceux qui m’entourent. Pour le formuler en terme probabiliste, McKendrick (1926) affirmait « la probabilité d’occurrence augmente avec le nombre de cas existants ». Assez intuitive a priori, cette conception de la responsabilité individuelle va en réalité à l’encontre de la conception classique en économie : l’individu rationnel (et responsable) fait des choix le concernant, et ne concernant que lui. Le bien collectif se déduit par sommation des utilités individuelles, indépendantes les unes des autres. Seulement voilà ; avec l’épidémie se crée une interdépendance des utilités qui fait que le bien-être d’Untel, qui choisit de ne pas porter de masque, peut nuire à la santé et donc l’utilité de beaucoup d’autres personnes. Comment penser alors en termes économiques cette « responsabilité individuelle » dans le contexte de l’épidémie ?

Des préférences individuelles au bien-être collectif

L’hypothèse centrale de la théorie économique du comportement est que chacun est capable de classer, par ordre de préférence, toutes sortes d’alternatives qui lui sont proposées. Et si je dois choisir une parmi deux, je choisirai systématiquement celle que je préfère. Comme le montre Mas-Colell et al. (1995), une simple hypothèse de continuité des préférences se traduit alors par l’existence d’une fonction d’utilité individuelles traduisant ces préférences. Cette approche pourrait suffire dans l’état de nature de Jean-Jacques Rousseau, lorsque l’homme est imaginé vivant en solitaire. Mais en société il convient d’être plus réaliste, et de tenir compte des interactions entre les individus. Organiser la vie en société, en favorisant la coopération et en cherchant à assurer un bien-être collectif, ne peut en effet se faire en se contentant de comprendre le bien-être individuel. Pour reprendre un exemple de Jean-Jacques Rousseau, plusieurs chasseurs ont intérêt à collaborer pour traquer un cerf, car aucun chasseur ne saurait y arriver seul[i] (Rousseau, 1755). La première difficulté est donc d’assurer une collaboration pour la chasse, mais aussi et surtout, si un cerf est tué, se pose le problème de la répartition de la viande.

Tout au long du XVIIIème siècle Francis Hutcheson et Adam Smith en Angleterre, Jean-Charles de Borda et Nicolas de Condorcet ont tenté de formaliser cette notion de « bien-être collectif », montrant qu’il existait malheureusement de très nombreux paradoxes, en particulier quand il s’agit du bien être d’une nation. A la même époque, Kant formalise l’impératif catégorique : « Agis uniquement d’après la maxime qui fait que tu puisses vouloir en même temps qu’elle devienne une loi universelle ». Autrement dit, avant de prendre une décision pour agir, il convient de se demander ce qui se passerait si tout le monde agissait de cette manière. La rationalité de l’individu se doit d’être collective, et de prendre en compte l’humanité dans son ensemble. Dans sa lecture de Kant, Arendt (1991) met en avant le sensus communis, ce sens commun à tous les hommes et qui rattache le jugement de chacun « à la raison humaine tout entière ». Penser par soi-même devient alors « penser en se mettant à la place de tout autre, dans ce qu’elle appelle une « mentalité élargie ».

Tocqueville quant à lui renverse les termes de l’équation. Dans les pays démocratiques selon lui, on ne peut plus mettre en avant la valeur du sacrifice de soi : il faut pouvoir démontrer que « l’homme en servant ses semblables se sert lui-même (…) Aux Etats-Unis on ne dit presque point que la vertu est belle. On dit qu’elle est utile ». Cela implique cependant de « petits sacrifices », consentis car ils se révèlent bénéfiques pour celui qui les consent. Tocqueville (1981) exhorte alors ses lecteurs à agir dans leur intérêt « bien entendu », c’est-à-dire en tenant compte de l’intérêt de tous.

Cette rationalité collective est en réalité une pratique habituelle au sein de petits groupes, comme la famille. Il n’est pas rare, en effet, de mettre de côté son intérêt personnel pour le bien de la famille. Mais elle est plus complexe à mettre en œuvre au sein d’un groupe plus important, plus hétérogène, voire plus abstrait.

Le passager clandestin contre les intérêts communs

Une vision résolument optimiste consisterait en effet à croire que si tous les membres d’un groupe ont des intérêts communs, alors chacun va agir pour les atteindre. Un exemple bien connu est celui du réchauffement climatique : collectivement, l’intérêt de tous est la réduction des gaz à effet de serre au niveau mondial ; mais individuellement, chaque pays a la tentation de retarder la mise en place de mesures qui pourraient pénaliser son économie, en espérant toutefois bénéficier d’actions précoces de pays voisins. C’est le principe du passager clandestin : il y aurait un bénéfice collectif à tirer d’une coopération, mais les individus ont davantage d’incitations à chercher à profiter de la « coopération » des autres. En termes économiques, ils cherchent à avoir une prestation sans en assumer les coûts.

Ce problème, largement étudié dans Olson (1965), est classique pour la majorité des « biens publics[ii] » qui satisfont deux caractéristiques : être non-rival et non-excluable, c’est-à-dire dont la consommation par les uns ne diminue pas la quantité disponible pour les autres et dont on ne peut par ailleurs restreindre l’accès. Axelrod & Hamilton (1981) expliquaient que la coopération nécessaire à la promotion de biens communs ne dépendait pas forcément d’une forme d’altruisme, mais plus simplement d’une réciprocité entre les agents, basée sur une coopération conditionnelle : ils coopèrent s’ils pensent que les autres vont faire de même. Plusieurs études ont montré que la majorité des gens fonctionnent de la sorte, mais leur comportement est très sensible à leurs croyances, d’où l’importance de maintenir leurs convictions en matière d’égalité (ou d’égalitarisme) : tout le monde doit coopérer, personne ne doit bénéficier d’un traitement de faveur. Fehr & Fischbacher (2004) ont ainsi montré qu’il suffit d’une petite proportion de passagers clandestins pour provoquer une rupture[iii] de la coopération. Ceci explique probablement les diverses normes injonctives autour de la « distanciation sociale », assurant qu’une personne qui resquille soit sanctionnée de manière exemplaire. En effet, comme le soulignent Brito et al. (1991) à propos des vaccins, même si l’obligation de vacciner est sous-optimale, elle peut être nécessaire si la proportion de gens prêts à se porter volontaires est en dessous du seuil nécessaire à l’immunité de la population dans son ensemble.

Le cas de la vaccination

La vaccination est en fait un exemple presque parfait de ce problème de passager clandestin, via la notion d’immunité de groupe. Plus le taux de personnes immunisées augmente, dans un groupe, plus le risque pour une personne non-immunisée de rencontrer une personne infectieuse diminue, et au-delà d’un certain seuil (de l’ordre de 80% pour la plupart des maladies, comme la coqueluche, la variole, la polio, etc), il devient impossible pour la maladie de se maintenir dans la population et elle finit par disparaître. Pour les maladies contagieuses bénéficiant d’un vaccin, au niveau collectif, il est souhaitable que 80% de la population soit vaccinée ; mais si la vaccination a des effets secondaires conséquents, il peut être rationnel au niveau individuel de ne pas souhaiter être vacciné.

Deux aspects importants entrent alors en jeu : la perception des risques, et la croyance dans le comportement des risques des autres membres de la communauté. Avoir une minorité de passagers clandestins (disons moins de 20%), parce qu’ils pensent les risques trop grands, n’est pas problématique. Mais si la perception des risques change, on peut observer la rupture de l’équilibre, et l’immunité de groupe n’existe plus. Aussi, la confiance dans l’autorité est essentielle, comme le rappelait Charpentier (2020).

L’immunité collective fonctionne grâce à un contrat social implicite : ceux qui sont médicalement capables de se faire vacciner doivent se faire vacciner. La contrepartie est que les personnes que ne souhaitent pas respecter ce contrat devraient s’engager à ce que leurs actions n’entraînent pas de coût supplémentaire pour ceux qui le respectent, en particulier en s’imposant une forte distanciation sociale, en évitant les lieux publics, de manière à ne pas contaminer des personnes ayant de faibles défenses immunitaires, et qui sont, elles, dans l’obligation de compter sur l’immunité collective.

Les pandémies et leurs réponses individuelles

Comme le disait Daniel Kahneman dans Konnikova (2020), « people, certainly including myself, don’t seem to be able to think straight about exponential growth. What we see today are infections that occurred 2 or 3 weeks ago and the deaths today are people who got infected 4 or 5 weeks ago. All of this is I think beyond intuitive human comprehension ». Le fait d’adopter une attitude de passager clandestin et de ne pas respecter les contraintes de distanciation sociale tient peut-être simplement du fait qu’on ne comprend simplement pas ce qu’est une croissance exponentielle : on ne mesure pas vraiment l’impact de sa propre contagion sur le groupe dans son ensemble.

Ce point a été montré dans Lammers et al. (2020) à partir de l’interprétation du nombre de reproduction de base R0 des modèles épidémiologiques. Le  Rcorrespond au nombre moyen de personnes qu’une personne contagieuse peut infecter : il constitue ainsi une visualisation de la contagiosité d’un individu sur son entourage. Avec un R0 de 1, la pandémie est contrôlée, et la croissance est linéaire. Mais s’il excède 1, la croissance est exponentielle. Avec un R0 de 1.5, 4 personnes vont en contaminer 6 autres, qui à leur tour vont en contaminer 9 autres, etc. En une quinzaine d’itérations, 1 750 personnes seront contaminées. Avec un R0 de 2, ces 4 individus auront contaminé plus de 130 000 personnes (soit 75 fois plus), en une quinzaine d’itération ! Autrement dit, alors qu’au niveau de l’individu spécifique l’augmentation est à peine perceptible (il contamine 2 personnes au lieu de 1.5 en moyenne), l’effet collectif est, lui, extrêmement important et difficilement concevable.

Figure 1 : nombre de personnes contaminées après 1, 3, 5, 7, 9 itérations, pour différentes valeurs de R0 (entre 1.8 en haut à gauche et 2.4 en bas à droite).

De nombreuses études en science du comportement ont montré que nous sommes davantage sensibilisés face à une seule personne identifiable qu’en étant noyé sur une avalanche de chiffres. Ce serait alors par l’exemple que l’on pourrait se convaincre mutuellement de coopérer pour le bien commun. Le port du masque facial est intéressant, car si des sondages ont montré qu’une majorité des gens portaient un masque pour se protéger, les masques ont surtout pour effet de protéger les autres personnes d’une transmission asymptomatique du SARS-CoV-2. Il présente aussi l’avantage de rendre visible la nouvelle norme sociale et d’impliquer activement tous les membres de la communauté. En devenant un symbole de la solidarité, le port du masque engage ainsi la coopération de chacun. A l’inverse, les photos de personnes à la plage ou dans les parcs publics qui ne respectent pas la distanciation sociale ont probablement eu un impact préjudiciable en termes de changement de comportement.

Les débats autour des applications de traçage sont un autre exemple frappant de la difficulté de faire accepter la coopération. Comme pour le masque, elles sont présentées le plus souvent comme permettant d’être alerté si l’on a été en contact avec une personne contaminée, donc comme un moyen de se protéger soi-même ; beaucoup plus rarement est mise avant la possibilité de prévenir autrui de sa propre contamination, parfois un inconnu qu’on ne pourra jamais alerter sans l’application. De plus, alors qu’elles étaient recommandées par de nombreux épidémiologistes (di Domenico et al. 2020; Ferguson et al. 2020; Ferretti et al. 2020), elles ont été dénoncées soit parce qu’elles porteraient atteinte à la liberté individuelle, soit parce qu’elles présenteraient des dangers de détournement. Dans une importante contribution, des experts en cryptographie ont ainsi tenté d’alerter l’opinion publique sur les possibles usages malveillants de ces applications ; au travers d’une quinzaine d’exemples qui cherchent à marquer l’imagination, ce n’est plus le passager clandestin qui est mis en avant pour saper la coopération mais l’individu franchement malveillant qui chercherait à nuire à ses voisins (Vuillot et al. 2020).

De la place de la liberté individuelle

Dans le contexte de la vaccination, et plus récemment sur le port du masque, l’argument de la liberté de choix est souvent avancé par les opposants, laissant croire que l’exercice de la liberté se faisait sans contraintes. Comme le note Frankfurt (2003), la plupart des religions limite le comportement d’une personne dans la mesure où elle agit en accord avec les préceptes de son Dieu ou de son église. Dans un contexte plus laïque, Jean-Jacques Rousseau affirmait que « l’obéissance à la loi qu’on s’est prescrite est liberté ». Car le concept de liberté s’accompagne toujours de la notion de responsabilité : je suis libre lorsque deux conditions sont réunies. Premièrement, j’ai la capacité d’agir (ou de ne pas agir) d’une manière particulière, et deuxièmement, j’accepte la responsabilité de mes actes. Quand je refuse de porter un masque en période de pandémie, j’accepte la première condition mais rejette la seconde. Autrement dit, j’affirme mon droit d’agir, ou de ne pas agir, mais je le fais de manière à refuser d’accepter toute responsabilité pour les conséquences que mes actions (ou inactions) peuvent entraîner. Comme l’affirmait Friedrich Hayek, « la liberté ne signifie pas seulement qu’une personne a le droit de choisir et qu’elle porte le fardeau de ses choix, mais aussi qu’elle doit assumer les conséquences de ses actes, pour lesquels elle sera félicitée ou blâmée. Liberté et responsabilité sont indissociables ».

L’assurance comme réponse collective ?

Dans le contexte de la santé, Wikler (2002) affirmait « if people know they are taking risks but accept them as the price of pursuing goals to which they assign higher priority, then it is not the business of public health to insist that health be valued above all ». Si ce précepte peut valoir pour l’assurance santé classique, il est plus difficile à appliquer à l’épidémie ; comme expliqué plus haut, dans les maladies contagieuses le choix individuel de prendre un risque se répercute sur le reste de la collectivité. De plus, la logique assurantielle de couverture de l’aléa grâce à la mutualisation fonctionne mal dans le cadre de l’épidémie ; on est dans le cas classique d’un risque systémique où les individus et leurs risques ne sont pas indépendants. En réalité, la contagion met en avant une solidarité d’un autre ordre que celle promue par l’assurance, comme le note Barry (2020). Il s’agit d’une interdépendance où le comportement de l’un impacte le risque de l’autre et qui exige, pour être contrôlé, la coopération de tous. Penser collectivement, c’est donc finalement adopter des valeurs de solidarité et de coopération.

Références

Arendt, Hannah (1991). Juger – La Philosophie Politique de Kant. Points. Paris: Seuil.

Axelrod, Robert & Hamilton, William (1981). The Evolution of Cooperation. Science, 211 (4489): 1390–96.

Barry, Laurence (2020). Individu/Collectif : L’épidémiologie à l’épreuve Du Big Data (Ou l’inverse) ? Working Paper # 20. Paris: Chaire PARI.

Brito, Dagobert, Sheshinski Eytan & Intriligator Michael (1991). Externalities and Compulsory Vaccinations. Journal of Public Economics 45, 69–90.

Charpentier, Arthur (2020). De la démarche scientifique en période de crise. Risques, 121.

Costa, Dora et Kahn, Matthew (2003). Civic Engagement and Community Heterogeneity: An Economists Perspective. Perspectives on Politics, 1(1): 103-112.

di Domenico, Laura, Giulia Pullano, Chiara Sabbatini, Pierre-Yves Boelle, and Vittoria Colizza. (2020). Expected Impact of Lockdown in Île-de-France and Possible Exit Strategies. 9. Paris: INSERM.

Fehr, Ernst & Fischbacher, Urs (2004). Social norms and human cooperation. Trends in Cognitive Sciences, 8(4), 185-190.

Ferguson, Neil, D. Laydon, G. Nedjati Gilani, N. Imai, K. Ainslie, M. Baguelin, S. Bhatia, A. Boonyasiri, Z. Cucunuba Perez, G. Cuomo-Dannenburg, A. Dighe, I. Dorigatti, H. Fu, K. Gaythorpe, W. Green, A. Hamlet, W. Hinsley, L. Okell, S. Van Elsland, H. Thompson, R. Verity, E. Volz, H. Wang, Y. Wang, P. Walker, C. Walters, P. Winskill, C. Whittaker, C. Donnelly, S. Riley, & A. Ghani. 2020. Report 9: Impact of Non-Pharmaceutical Interventions (NPIs) to Reduce COVID19 Mortality and Healthcare Demand. Imperial College Report.

Ferretti, Luca, Chris Wymant, Michelle Kendall, Lele Zhao, Anel Nurtay, Lucie Abeler-Dörner, Michael Parker, David Bonsall, & Christophe Fraser. (2020). Quantifying SARS-CoV-2 Transmission Suggests Epidemic Control with Digital Contact Tracing. Science, Vol. 68 #619, 1-8.

Frankfurt, Harry, (2003) Freedom of the Will and a Concept of a Person, in Gary Watson (ed), Free Will, 2nd edition, Oxford University Press,  322-336.

Konnikova, Maria (2020). Why We Underestimated COVID-19. New Yorker, 3 avril 2020,

Lammers, Joris, Crusius, Jan et Gast, Anne (2020). Correcting misperceptions of exponential coronavirus growth increases support for social distancing. PNAS, 117 (28).

Lim, Wooyoung & Zhang, Pengfei (2020). Herd immunity and a vaccination game: An experimental study. PLoS One. 5(5), e0232652.

McKendrick, A. G. (1926). Applications of Mathematics to Medical Problems. Proceedings of the Edinburgh Mathematical Society 44, 98–130.

Mas-Colell, Andreu, Whinston, Michael et Green, Jerry (1995). Microeconomic Theory. Oxford University Press.

Olson, Mancur (1965). The Logic of Collective Action: Public Goods and the Theory of Groups. Harvard University Press.

Rousseau, Jean-Jacques (1755). Discours sur l’origine et les fondements de l’inégalité parmi les hommes. Garnier Flammarion.

Skyrms, Brian (2004) The Stag Hunt and the Evolution of Social Structure. Cambridge: Cambridge University Press.

Tocqueville, Alexis. (1981). De La Démocratie En Amérique – 2. Flammarion.

Vuillot, Xavier, Anne Bonnetain, Veronique Canteaut, Pierrick Cortier, Lucca Gaudry, Steve Hirschi, Stéphanie Kremer, Gaëtan Lacour, Matthieu Leurent, Léo Lequesne, André Perrin, Emmanuel Schrottenloher, Serge Thomé, and Christophe Vaudenay. (2020). Le Traçage Anonyme, Dangereux Oxymore Analyse de Risques à Destination Des Non-Spécialistes. Https://Risques-Tracage.Fr. Retrieved April 25, 2020 (https://risques-tracage.fr/).

Wikler, Daniel (2002) Personal and social responsibility for health. Ethics & International Affairs, 16, 47-55.

Wolman, Davis (2020). Yes, the Public Can Be Trusted in a Pandemic. Wired, 27 mars 2020,

[i] Comme le rappelle Skyrms (2004), ce dilemme de chasse au cerf est aussi appelé jeu de l’assurance, en théorie des jeux et de choix sociaux.

[ii] On pourrait aussi penser aux « biens communs », qui sont des biens en capacité limité. Le SARS-CoV-2 a montré que le système de santé pouvait être saturé, ce qui en fait dès lors un bien rival.

[iii] Mathématiquement, cette rupture est intéressante car on peut alors voir la vaccination comme un jeu non-linéaire de bien public, comme le fait Lim & Zhang (2020).

R0 and the exponential growth of a pandemic, an update

A few days ago, I wrote a blog post – R0 and the exponential growth of a pandemic – where I was trying to generate some visualization of some exponential growth, in the context of a pandemic. After giving some thoughts, the previous graph might not be the best one to see an exponential based contagion.

Having graphs evolving, from the left to the right, gives us the (false) idea of some temporal evolution. Which is no necessarily correct. It simply means that contaminated people will contaminate other people, and we look at the number of iterations here. So maybe some concentric dots would look better.

And from a technical perspective, what I did was fun, but probably too complicated. In my previous post, I wanted to pack optimally k identical disks intro a unit circle. On http://hydra.nat.uni-magdeburg.de/packing, it was possible to get the “best known packings of equal circles in a circle”, with the coordinates. But as we will see, we can use something much more simple here.

My idea is now to create some picture like one below, with concentric colored dot. In the center, we have the first people that were contaminated, and then, we can see the transmission, somehow

From a technical perspective, here, I use a different strategy. I decided to draw random points, uniformly. The problem with randomness is the natural high discrepancy, with monte carlo methods: it is very likely that some disks will overlap. It is not a major issue, but it might distort the message. So I decided to use some low-discrepancy sequences, such as Halton‘s sequence.

library(randtoolbox)
S = halton(n=5000, dim = 2)*2-1

Here, I have disk coordinates in [-1,+1]^2. Then, to get disks in a circle, I simply compute the distance to the origin (0,0),

D0 = S[,1]^2+S[,2]^2

and take the ranks. If I want to visualize k=200 people, I consider the 200 smaller ranks. To get concentric circles, each part having k_i individuals, I use as thresholds R_0^{\bar k_{i-1}},R_0^{\bar k_{i}},R_0^{\bar k_{i+1}}, etc, where \bar k_i=\bar k_{i-1}+k_i,

R0 = rank(D0,ties.method = "random")
C0 = as.numeric(cut(R0,c(0,cumsum(k)+.5)),100000)

where

R0=1.8
k=round(R0^(seq(1,9,by=2)))

Then we can plot the dots, with appropriate colors,

points(S,pch=19,col=colrpal[C0],cex=.75)

And of course, we can try that with different values, for R_0

R0=2.2
k=round(R0^(seq(1,9,by=2)))
kmax=max(k)  
S = halton(n=5000, dim = 2)*2-1
plot(S,col="light yellow",axes=FALSE,xlab="",ylab="",xlim=c(-1.3,1),ylim=c(-1,1),cex=.75,pch=19)
D0 = S[,1]^2+S[,2]^2
R0 = rank(D0,ties.method = "random")
C0 = as.numeric(cut(R0,c(0,cumsum(k)+.5)),100000)
points(S,pch=19,col=colrpal[C0],cex=.75)

R0 and the exponential growth of a pandemic

For some dissemination work, I want to create a nice graph to explain the exponential growth in pandemics, related to the value of R_0. Recall that R_0 corresponds to the average number of people that a contagious person can infect. Hence, with R_0=1.5, 4 people will contaminate 6 people, and those 6 will contaminate 9, etc. After n iteration, the number of contaminated people is simply R_0{}^n. As explained by Daniel Kahneman

people, certainly including myself, don’t seem to be able to think straight about exponential growth. What we see today are infections that occurred 2 or 3 weeks ago and the deaths today are people who got infected 4 or 5 weeks ago. All of this is I think beyond intuitive human comprehension

For different values of R_0 (on each row), I wanted to visualise the number of contaminated people after 3, 5 or 7 iterations, since graphs are usually the most simple way to give some intuition. The graph I had in mind was the following

(to be honest, I am quite sure I had seen it somewhere, but I cannot find where). The main challenge here is pack optimally k identical circles intro a unit circle: we need here the location of the points (center of the disks) and the radius. It seems to be a rather complicated mathematical problem. Nicely, on http://hydra.nat.uni-magdeburg.de/packing, it is possible to get the “best known packings of equal circles in a circle” (up to 5000, but many k‘s are missing). For instance, for k=37, we have

And interestingly, on the same website, we can get the coordinates of the centers, for example with 37 disks, so it is possible to recreate the R graph.

k = 37
base = read.table(paste("http://hydra.nat.uni-magdeburg.de/packing/cci/txt/cci",k,".txt",sep=""), header=FALSE)

The problem, as discussed earlier, is that some cases are not solved, yes, for instance k=2^{12}=4096: the next feasable case is 4105. To avoid that issue, one can use

T = "Error"
while(T == "Error"){
    T = substr(try(base = read.table(paste("http://hydra.nat.uni-magdeburg.de/packing/cci/txt/cci",k,".txt",sep=""), header=FALSE),silent = TRUE),1,5)
k=k+1
} 
k=k-1

Now we can almost plot it. The problem is that the radius of the circles is missing, here. But we can compute it

D=as.matrix(dist(x = base[,2:3]))
diag(D)=1e5
i=which(D == min(D), arr.ind = TRUE)
r = D[i[1,1],i[1,2]]

Here the radius is

r
[1] 0.2959118

To plot it, use

plot(base$V2,base$V3,xlim=c(-1,1),ylim=c(-1,1))
n=100
theta=seq(0,pi,length=n+1)
circ= function(x,y,r,h=1){
  vu=x+r*cos(theta)
  vv=r*sin(theta)
  cbind(c(vu,rev(vu))*h,c(y+vv,y-rev(vv))*h)
}
for(i in 1:k) polygon(circ(base[i,2],base[i,3],r/2*.95),col=colr,border=NA)

We can now use that code to create the graph above, with k=R_0{}^n for various values of n

And we can also use it to visualize more subtile differences, like R_0=1.1, R_0=1.3, R_0=1.5 and R_0=1.7

Hidding values in the output of the summary function for a (linear) regression

Since our Fall 2020 session will be 100% online (and off-site), I have to work hard this summer to prepare online quizz and exams. I started intensively to play with Achim’s awesome r-exams package. But there are still a few things that I wanted to add, so I will post a series of posts on my blogs to keep tracks of updated functions I will write. Most of them a modification of R internal functions, so the code is hard to read. Here is the file, and I will update it frequently

url = "http://freakonometrics.free.fr/onlineExams.R"
source(url)

I have updated the summary function (more precisely the summary.lm function). To see how it works, consider a simple regression

library(car)
reg = lm(prestige ~ women, data=Prestige)
my_summary(reg)
 
Call:
lm(formula = prestige ~ women, data = Prestige)
 
Residuals:
    Min      1Q  Median      3Q     Max 
-33.444 -12.391  -4.126  13.034  39.185 
 
Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 48.69300    2.30760  21.101    2e-16 ***
women       -0.06417    0.05385  -1.192    0.236    
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1
 
Residual standard error: 17.17 on 100 degrees of freedom
Multiple R-squared:  0.014,	Adjusted R-squared:  0.004143
F-statistic:  1.42 on 1 and 100 DF,  p-value: 0.2362

A classical question I ask in my quizz is to hide the p-value of the F-test, and ask what it is (to make sure that students understand the equivalence between the F and the t test, in a simple regression). To hide the p-value, use

my_summary(reg, Fisher=TRUE)
 
Call:
lm(formula = prestige ~ women, data = Prestige)
 
Residuals:
    Min      1Q  Median      3Q     Max 
-33.444 -12.391  -4.126  13.034  39.185 
 
Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 48.69300    2.30760  21.101    2e-16 ***
women       -0.06417    0.05385  -1.192    0.236    
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1
 
Residual standard error: 17.17 on 100 degrees of freedom
Multiple R-squared:  0.014,	Adjusted R-squared:  0.004143
F-statistic:  1.42 on 1 and 100 DF,  p-value: ■■■■■

(and then, in a multiple choice exam, I ask if it is 1%, 5%, 12%, 23%, 47%, for example). That one was easy, since all those lines are based on the cat function, so I just modify it, if necessary

if(Fisher) cat("\nF-statistic:", formatC(x$fstatistic[1L], 
    digits = digits), "on", x$fstatistic[2L], "and", 
        x$fstatistic[3L], "DF,  p-value:", "■■■■■")
    if(!Fisher) cat("\nF-statistic:", formatC(x$fstatistic[1L], 
    digits = digits), "on", x$fstatistic[2L], "and", 
                   x$fstatistic[3L], "DF,  p-value:", format.pval(pf(x$fstatistic[1L], 
                   x$fstatistic[2L], x$fstatistic[3L], lower.tail = FALSE), 
                   digits = digits))

(here I use the unicode ‘black square‘ symbol to hide numbers). Of course, I can hide the value of \sigma, or the (adjusted or not) R ^2, etc.

Now, a little bit more tricky: what if we want to change the regression table, with the coefficients, their standard deviation, etc.  It is tricky since those values are numeric, with an appropriate format (not too many digits), but it can be done easily since that formating is done through the printCoefmat function.  So in my code, I have my internal function, where I ask to put some ‘black square‘ (and the good number to keep a readable format) at some specific locations. Consider a more complex regression

reg = lm(prestige ~ ., data=Prestige)

and assume that we want to hide the value of the intercet, \widehat{\beta}_0 (i.e. located at (1,1) in the matrix) and the p-value of the t-test for the fourth one (i.e. located at (4,4) in the matrix – since the first colum is \widehat{\beta}_3, the second one its standard deviation, the thirst one the t value, and then, the fourth one, the p-value of the test). I use the following two vectors

vligne = c(1,4),
vcolonne = c(1,4)

with rows and columns in the matrix (of course, the two should have the same length). Then, the good thing is that the printCoefmat function convert numerical values into characters (to have things that look like columns actually). So we simply have to remove numerical digits, and use squares instead

Cf2=Cf
  if(length(vligne)>0){  
    for(i in 1:length(vligne)){
      long = nchar(Cf[vligne[i],vcolonne[i]])
      Cf2[vligne[i],vcolonne[i]] = paste(rep("■",long),collapse = "")
    }}

Then, we print the updated version of the table

print.default(Cf2, quote = quote, right = right, na.print = na.print,...)

For example, here, it would be

my_summary(reg, vligne=c(1,4), vcolonne=c(1,4))
 
Call:
lm(formula = prestige ~ ., data = Prestige)
 
Residuals:
     Min       1Q   Median       3Q      Max 
-12.9863  -4.9813   0.6983   4.8690  19.2402 
 
Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) ■■■■■■■■■■  8.018e+00  -1.513  0.13380    
education    3.933e+00  6.535e-01   6.019 3.64e-08 ***
income       9.946e-04  2.601e-04   3.824  0.00024 ***
women        1.310e-02  3.019e-02   0.434  ■■■■■■■    
census       1.156e-03  6.183e-04   1.870  0.06471 .  
typeprof     1.077e+01  4.676e+00   2.303  0.02354 *  
typewc       2.877e-01  3.139e+00   0.092  0.92718    
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1
 
Residual standard error: 7.037 on 91 degrees of freedom
  (4 observations deleted due to missingness)
Multiple R-squared:  0.841,	Adjusted R-squared:  0.8306
F-statistic: 80.25 on 6 and 91 DF,  p-value: < 2.2e-16

Of course, it is hand made, I do not check for typos (like you should not ask to put squares in the seventh column), but that works well enough to generate random regressions in a quizz (or identical regressions on subsamples of a large dataset), and to hide values, in a quizz.

An Open Lab-Notebook Experiment

Search OpenEdition Search

You will be redirected to OpenEdition Search