{"id":1022,"date":"2018-11-20T11:30:07","date_gmt":"2018-11-20T10:30:07","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=1022"},"modified":"2018-11-20T18:15:43","modified_gmt":"2018-11-20T17:15:43","slug":"expliquer-les-tests-statistiques-avec-le-package-infer","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/expliquer-les-tests-statistiques-avec-le-package-infer\/","title":{"rendered":"Expliquer les tests statistiques avec le package infer"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/infer\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<p>Il y a maintenant quelques mois, je suis tomb\u00e9e sur <a href=\"https:\/\/twitter.com\/thinkR_fr\/status\/986487009672916992\">ce tweet de thinkR<\/a> (toujours sur les bons coups!) qui m&rsquo;a fait d\u00e9couvrir le g\u00e9nial package <code>infer<\/code>. En d\u00e9couvrant la pr\u00e9sentation de Chester Ismay (pas tellement la premi\u00e8re partie qui parle de \u00ab\u00a0tidy data\u00a0\u00bb mais surtout <a href=\"https:\/\/ismayc.github.io\/talks\/ness-infer\/slide_deck.html#118\">la deuxi\u00e8me<\/a>, \u00e0 partir de la diapo&#8230; 118 -!!-) j&rsquo;ai r\u00e9alis\u00e9 que ce package allait probablement <strong>changer ma vie d&rsquo;enseignante\/formatrice<\/strong> (occasionnelle) ayant \u00e0 expliquer les tests statistiques. Et apr\u00e8s, j&rsquo;ai r\u00e9alis\u00e9 qu&rsquo;en fait, il pouvait \u00e9galement me <strong>faciliter ma vie d&rsquo;analyste de donn\u00e9es<\/strong> (parce que la simplicit\u00e9, ce n&rsquo;est pas que pour les \u00e9tudiants, moi aussi j&rsquo;aime bien!).<\/p>\n<h1>infer: pour quoi faire?<\/h1>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/infer\/infeerie.jpg\" alt=\"\" \/><\/p>\n<p>Le package <code>infer<\/code> permet, dans un premier lieu, d&rsquo;expliciter et illustrer le <strong>raisonnement sous-jacent aux tests statistiques<\/strong> (comme le t-test ou le test du <em>\u03c7<\/em><sup>2<\/sup>). Il permet en outre de <strong>s&rsquo;abstraire (dans une certaine mesure) des probl\u00e8mes de non-respect des hypoth\u00e8ses de ces tests<\/strong> en permettant de calculer la distribution des statistiques de test via des <strong>permutations<\/strong> plut\u00f4t qu&rsquo;en s&rsquo;appuyant sur les <strong>distributions th\u00e9oriques<\/strong> des statistiques sous hypoth\u00e8se de normalit\u00e9, d&rsquo;homoscedasticit\u00e9, ou de taille d&rsquo;\u00e9chantillon ou effectifs \u00ab\u00a0suffisants\u00a0\u00bb.<\/p>\n<p>De fait, je me suis empress\u00e9e d&rsquo;int\u00e9grer quelques exemples d&rsquo;utilisation du package <code>infer<\/code> \u00e0 mon <a href=\"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/grimoireStat\/_book\/intro.html\">Grimoire Stat<\/a> puis \u00e0 m&rsquo;en servir dans le cadre de <a href=\"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/Supports_formation\/initR_8_tests_statistiques.html#(1)\">ma (mini-)formation aux tests stats<\/a>. Je ne souhaite pas ici rentrer dans le m\u00eame niveau de d\u00e9tail que dans les deux documents sus-mentionn\u00e9s, ou m&rsquo;adresser au m\u00eame public. Ce billet de blog s&rsquo;adresse \u00e0 ceux qui ont <strong>d\u00e9j\u00e0 compris la logique des tests statistiques<\/strong>, mais qui <strong>recherchent des outils pour faciliter leur enseignement<\/strong>&#8230; Aussi, si vous souhaitez <strong>comprendre les tests statistiques<\/strong>, je vous invite \u00e0 consulter le grimoire Stat (version longue) ou la formation (version synth\u00e9tique)&#8230;<\/p>\n<p>En effet, si vous \u00eates amen\u00e9s \u00e0 enseigner les tests statistiques, le package <code>infer<\/code> est particuli\u00e8rement int\u00e9ressant dans le cas o\u00f9 vous adoptez le parti pris de l&rsquo;<strong>initiation \u00e0 R par le tidyverse<\/strong>. En effet, <code>infer<\/code> r\u00e9pond aux m\u00eames logiques de syntaxe et de programmation (avec des commandes \u00ab\u00a0pipables\u00a0\u00bb par exemple). Il est aussi \u00e9galement particuli\u00e8rement int\u00e9ressant si vous souhaitez enseigner les statistiques \u00e0 des gens qui ne savent pas ou ne sont pas encore \u00e0 l&rsquo;aise pour <strong>r\u00e9aliser des simulations \u00ab\u00a0\u00e0 la main\u00a0\u00bb<\/strong>.<\/p>\n<p>En effet, le package prend en charge la <strong>r\u00e9alisation de nombreuses permutations des donn\u00e9es<\/strong> qui permettent de calculer la <strong>distribution empirique d&rsquo;une statistique sous hypoth\u00e8se nulle<\/strong> (et donc le calcul d&rsquo;une p-value) m\u00eame si les <strong>hypoth\u00e8ses permettant de d\u00e9duire la distribution th\u00e9orique de la statistique ne sont pas r\u00e9unies<\/strong>.<\/p>\n<p>Les cr\u00e9ateurs du package illustrent cette id\u00e9e de la mani\u00e8re suivante:<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/infer\/infer.png\" alt=\"\" \/><\/p>\n<p>Par le pass\u00e9, j&rsquo;\u00e9tais toujours un peu emb\u00eat\u00e9e en enseignant les tests statistiques quand j&rsquo;en venais \u00e0 la partie <strong>v\u00e9rification des hypoth\u00e8ses de normalit\u00e9\/homoscedasticit\u00e9\/\u00e9chantillons de grande taille\/effectifs \u00e9lev\u00e9s<\/strong>. En effet, la <strong>robustesse<\/strong> des m\u00e9thodes d&rsquo;inf\u00e9rence est telle qu&rsquo;on peut souvent s&rsquo;y fier quand bien-m\u00eame la v\u00e9rification des hypoth\u00e8ses serait douteuse (qu&rsquo;est-ce qu&rsquo;un \u00e9chantillon de grande taille? quand est-ce que l&rsquo;\u00e9cart aux hypoth\u00e8ses est tel que la taille d&rsquo;\u00e9chantillon ne suffit plus \u00e0 le compenser?). J&rsquo;avais d&rsquo;ailleurs fait <a href=\"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/non-respect-des-hypotheses-du-modele-lineaire-anova-regression-cest-grave-docteur\/\">un billet de blog<\/a> sur ce sujet (intitul\u00e9 \u00ab\u00a0Non-respect des hypoth\u00e8ses du mod\u00e8le lin\u00e9aire: c&rsquo;est grave, docteur?\u00a0\u00bb) qui montrait que l&rsquo;on pouvait <strong>se fournir quelques rep\u00e8res<\/strong> pour r\u00e9pondre \u00e0 ces questions en r\u00e9alisant quelques simulations. N\u00e9anmoins, recourir \u00e0 des simulations pour \u00e9valuer si l&rsquo;on \u00e9tait en mesure d&rsquo;utiliser un test param\u00e9trique classique signifiait un effort non-n\u00e9gligeable pour <strong>mod\u00e9liser le probl\u00e8me<\/strong> et <strong>r\u00e9aliser les simulations<\/strong> en question. C&rsquo;est maintenant beaucoup plus simple \u00e0 l&rsquo;aide du package <code>infer<\/code>, en tout cas pour les tests pris en charge par le package!<\/p>\n<p>En pratique, <code>infer<\/code> r\u00e9alise l&rsquo;ensemble des op\u00e9rations n\u00e9cessaires \u00e0 ce processus \u00e0 travers de fonctions (ou <strong>verbes<\/strong>) dont l&rsquo;articulation est illustr\u00e9e ci-dessus (illustration issue de <a href=\"https:\/\/ismayc.github.io\/talks\/ness-infer\/slide_deck.html#1\">ce diaporama, d\u00e9j\u00e0 mentionn\u00e9<\/a>)<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/infer\/infer_ht.jpg\" alt=\"\" \/><\/p>\n<p>Je montre dans la suite de ce document 3 exemples d&rsquo;utilisation du package:<\/p>\n<ul>\n<li>un exemple de t-test (bas\u00e9 sur la distribution th\u00e9orique de la statistique T sous hypoth\u00e8se d&rsquo;ind\u00e9pendance)<\/li>\n<li>un exemple de test du <em>\u03c7<\/em><sup>2<\/sup> (bas\u00e9 sur la distribution th\u00e9orique de la statistique du <em>\u03c7<\/em><sup>2<\/sup> sous hypoth\u00e8se d&rsquo;ind\u00e9pendance)<\/li>\n<li>un exemple de test du <em>\u03c7<\/em><sup>2<\/sup> (bas\u00e9 sur une distribution de la statistique du <em>\u03c7<\/em><sup>2<\/sup> sous hypoth\u00e8se d&rsquo;ind\u00e9pendance <strong>calcul\u00e9e par des permutations du jeu de donn\u00e9es<\/strong>)<\/li>\n<\/ul>\n<h1>Exemple 1: t-test<\/h1>\n<p>Je vais ici utiliser les donn\u00e9es <code>broceliande<\/code> de mon grimoire Stat pour illustrer la r\u00e9alisation d&rsquo;un t-test \u00e0 l&rsquo;aide du package <code>infer<\/code>. Imaginons par exemple que je souhaite tester l&rsquo;effet de l&rsquo;enchantement sur la quantit\u00e9 de poudre de perlimpinpin produite par mes arbres:<\/p>\n<pre><code>datasets_path=\"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/grimoireStat\/datasets\/\"\nbroceliande=readr::read_delim(paste0(datasets_path,'broceliande.csv'),\n                              delim=';')\nggplot(broceliande, aes(x=enchantement, y=perlimpinpin))+\n  geom_boxplot(fill=\"skyblue\")+\n  geom_point(data= broceliande %&gt;% \n               group_by(enchantement) %&gt;% \n               summarise(perlimpinpin=mean(perlimpinpin)),\n             color=\"red\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/infer\/unnamed-chunk-2-1.png\" alt=\"\" \/><\/p>\n<p>La fonction de <code>infer<\/code> pour r\u00e9aliser le t-test est <code>t_test()<\/code>:<\/p>\n<pre><code>montest1 &lt;- broceliande %&gt;% \n  t_test(perlimpinpin ~ enchantement,\n         order=c(TRUE, FALSE))\n\nt_obs=montest1 %&gt;% \n  select(statistic)\n<\/code><\/pre>\n<p>L&rsquo;argument <code>order<\/code> me permet de dire dans quel sens j&rsquo;effectue la comparaison de moyenne (ici je consid\u00e8re la moyenne des arbres enchant\u00e9s (enchantement est <code>TRUE<\/code>) moins la moyenne des arbres non-enchant\u00e9s (<code>enchantement<\/code> est <code>FALSE<\/code>).<\/p>\n<p>Je peux <strong>d\u00e9composer le processus<\/strong> et <strong>produire une visualisation<\/strong> montrant l&#8217;emplacement de la statistique observ\u00e9e par rapport \u00e0 la distribution th\u00e9orique attendue sous hypoth\u00e8se d&rsquo;ind\u00e9pendance via les <strong>verbes du package<\/strong>:<\/p>\n<pre><code>broceliande %&gt;%\n  specify(perlimpinpin ~ enchantement) %&gt;%\n  hypothesize(null = 'independence') %&gt;% \n  calculate(stat = 't') %&gt;% \n  visualize(method = 'theoretical',\n            obs_stat=t_obs,\n            direction = 'two_sided')\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/infer\/unnamed-chunk-3-1.png\" alt=\"\" \/><\/p>\n<p>Dans ce cas, je me contente de consid\u00e9rer la <strong>distribution th\u00e9orique<\/strong> sous hypoth\u00e8se nulle car les conditions permettant de supposer que la statistique T suit cette distribution sont respect\u00e9es. De ce fait, je ne me sers pas du verbe <code>generate()<\/code>&#8230; Je vous montrerai comment utiliser ce verbe dans mon troisi\u00e8me exemple.<\/p>\n<h1>Exemple 2: test du Chi-2<\/h1>\n<p>Int\u00e9ressons-nous maintenant au jeu de donn\u00e9es <code>fantaisie<\/code>, et au lien entre <code>sexe<\/code> et <code>activite<\/code>.<\/p>\n<pre><code>fantaisie=readr::read_delim(paste0(datasets_path,'chateauxEtBoulots.csv'),\n                            delim=';')\n\nfantaisie %&gt;% \n  janitor::tabyl(sexe,activite)\n\n##      sexe chevalerie enchantements magie_noire royaute\n##   feminin          0            13          14       9\n##  masculin         18             3           8       7\n<\/code><\/pre>\n<p>Le package <code>janitor<\/code> permet de transformer ce tableau d&rsquo;effectifs pour afficher \u00e0 la fois les pourcentages (ici par colonne) et les effectifs, ce qui en facilite l&rsquo;<strong>interpr\u00e9tation<\/strong>.<\/p>\n<pre><code>fantaisie %&gt;% \n  janitor::tabyl(sexe,activite) %&gt;% \n  janitor::adorn_percentages(\"col\") %&gt;% \n  janitor::adorn_pct_formatting(digits=2) %&gt;% \n  janitor::adorn_ns()\n\n##      sexe   chevalerie enchantements magie_noire    royaute\n##   feminin   0.00%  (0)   81.25% (13) 63.64% (14) 56.25% (9)\n##  masculin 100.00% (18)   18.75%  (3) 36.36%  (8) 43.75% (7)\n\nggplot(fantaisie,aes(x=activite))+\n  geom_bar(aes(fill=sexe),position=\"fill\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/infer\/chisq_ggplot_bar-1.png\" alt=\"\" \/><\/p>\n<p>La fonction de <code>infer<\/code> pour r\u00e9aliser un test du <em>\u03c7<\/em><sup>2<\/sup> est <code>chisq_test()<\/code><\/p>\n<pre><code>montest2 &lt;- fantaisie %&gt;% \n  chisq_test(formula=activite~sexe)\nprint(montest2)\n\n## # A tibble: 1 x 3\n##   statistic chisq_df    p_value\n##       &lt;dbl&gt;    &lt;int&gt;      &lt;dbl&gt;\n## 1      26.1        3 0.00000893\n\nchi_obs=montest2 %&gt;%\n  pull(statistic)\n<\/code><\/pre>\n<p>Pour visualiser la <strong>distribution th\u00e9orique de la statistique<\/strong> et l&rsquo;<strong>emplacement de la statistique observ\u00e9e<\/strong>, la logique est exactement la m\u00eame que dans le cas du t-test (sauf qu&rsquo;on adapte la nature de la statistique calcul\u00e9e!):<\/p>\n<pre><code>fantaisie %&gt;%\n  specify(tenue~sexe) %&gt;% \n  hypothesize(null='independence') %&gt;%\n  calculate(stat='Chisq') %&gt;% \n  visualize(method = 'theoretical',\n            obs_stat=chi_obs,\n            direction = 'greater')\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/infer\/unnamed-chunk-7-1.png\" alt=\"\" \/><\/p>\n<h1>Exemple 3: test du Chi-2 en cas de non-respect des conditions d&rsquo;application du test classique<\/h1>\n<p>Un test du <em>\u03c7<\/em><sup>2<\/sup> classique (c&rsquo;est-\u00e0-dire reposant sur la distribution th\u00e9orique du <em>\u03c7<\/em><sup>2<\/sup>) est construit en supposant que <strong>les effectifs crois\u00e9s sont &lsquo;suffisants&rsquo;<\/strong>. Ainsi, quand certaines cases du tableau de contingence comprennent trop peu d&rsquo;individus, appliquer un test du <em>\u03c7<\/em><sup>2<\/sup> peut causer un &lsquo;warning&rsquo; stipulant que l&rsquo;approximation du <em>\u03c7<\/em><sup>2<\/sup> peut \u00eatre incorrecte.<\/p>\n<p>Consid\u00e9rons par exemple un sous-jeu de donn\u00e9es de <code>fantaisie<\/code> rassemblant uniquement les individus de noble extraction, et int\u00e9ressons-nous au lien entre leur sexe et leur couleur de tenue:<\/p>\n<pre><code>fantaisie_princiere=filter(fantaisie, activite=='royaute')\n\nfantaisie_princiere %&gt;% \n  janitor::tabyl(sexe,tenue) %&gt;% \n  janitor::adorn_percentages(\"col\") %&gt;% \n  janitor::adorn_pct_formatting(digits=2) %&gt;% \n  janitor::adorn_ns()\n\n##      sexe      bleue      noire        rose      verte\n##   feminin 75.00% (3) 25.00% (1) 100.00% (2) 50.00% (3)\n##  masculin 25.00% (1) 75.00% (3)   0.00% (0) 50.00% (3)\n<\/code><\/pre>\n<p>Je r\u00e9alise un test du <em>\u03c7<\/em><sup>2<\/sup> \u00ab\u00a0classique\u00a0\u00bb:<\/p>\n<pre><code>montest3 &lt;- fantaisie_princiere %&gt;%\n  chisq_test(tenue~sexe) \n\n## Warning in stats::chisq.test(table(df), ...): Chi-squared approximation may be incorrect\n\nmontest3\n\n## # A tibble: 1 x 3\n##   statistic chisq_df p_value\n##       &lt;dbl&gt;    &lt;int&gt;   &lt;dbl&gt;\n## 1      3.81        3   0.283\n<\/code><\/pre>\n<p>Ici j&rsquo;ai un warning car, de fait, certains niveaux crois\u00e9s sexe*tenue comprennent <strong>tr\u00e8s peu d&rsquo;individus<\/strong>! Dans ce cas le recours \u00e0 des permutations pour calculer la distribution de la statistique sous hypoth\u00e8se d&rsquo;ind\u00e9pendance s&rsquo;av\u00e8re tr\u00e8s utile:<\/p>\n<pre><code>sim_princiere &lt;- fantaisie_princiere %&gt;%\n  specify(tenue~sexe) %&gt;% \n  hypothesize(null='independence') %&gt;%\n  generate(reps=1000, type='permute') %&gt;% \n  calculate(stat='Chisq') \n<\/code><\/pre>\n<p>Ici la <strong>p-value<\/strong> correspond \u00e0 la <strong>proportion des cas<\/strong> (parmi les 1000 permutations) <strong>o\u00f9 la valeur de statistique observ\u00e9e sur donn\u00e9es permut\u00e9es a \u00e9t\u00e9 sup\u00e9rieure \u00e0 la statistique observ\u00e9e sur nos <em>vraies<\/em> donn\u00e9es<\/strong>:<\/p>\n<pre><code>sim_princiere %&gt;%\n  get_pvalue(obs_stat = montest3$statistic,\n             direction = \"greater\")\n\n## # A tibble: 1 x 1\n##   p_value\n##     &lt;dbl&gt;\n## 1   0.297\n<\/code><\/pre>\n<p>La distribution de la statistique du <em>\u03c7<\/em><sup>2<\/sup> pour ces permutations est montr\u00e9e par l&rsquo;histogramme.<\/p>\n<pre><code>sim_princiere%&gt;% \n  visualize(obs_stat=montest3$statistic,\n            direction='greater')\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/infer\/unnamed-chunk-11-1.png\" alt=\"\" \/><\/p>\n<p>De fait, ici, on obtient une valeur de p-value extr\u00eamement proche de celle que l&rsquo;on avait obtenue en consid\u00e9rant la distribution th\u00e9orique du <em>\u03c7<\/em><sup>2<\/sup>&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il y a maintenant quelques mois, je suis tomb\u00e9e sur ce tweet de thinkR (toujours sur les bons coups!) qui m&rsquo;a fait d\u00e9couvrir le g\u00e9nial package infer. En d\u00e9couvrant la pr\u00e9sentation de Chester Ismay (pas tellement la premi\u00e8re partie qui parle de \u00ab\u00a0tidy data\u00a0\u00bb mais surtout la deuxi\u00e8me, \u00e0 partir de la diapo&#8230; 118 -!!-) j&rsquo;ai r\u00e9alis\u00e9 que ce package allait probablement changer ma vie d&rsquo;enseignante\/formatrice (occasionnelle) ayant \u00e0 expliquer.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/expliquer-les-tests-statistiques-avec-le-package-infer\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1022","post","type-post","status-publish","format-standard","hentry","category-tous-les-posts"],"_links":{"self":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1022","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/comments?post=1022"}],"version-history":[{"count":25,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1022\/revisions"}],"predecessor-version":[{"id":1047,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1022\/revisions\/1047"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=1022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=1022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=1022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}