diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5b6a0652566d10360493952aec6d4a4febc77083 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.Rproj.user +.Rhistory +.RData +.Ruserdata diff --git a/module4/exo5_fr_Replication.Rmd b/module4/exo5_fr_Replication.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..afd2143d2e2e10bb3feb3903b3278dfa2d238772 --- /dev/null +++ b/module4/exo5_fr_Replication.Rmd @@ -0,0 +1,146 @@ +--- +title: "Analyse du risque de défaillance des joints toriques de la navette Challenger" +author: "Paul Faye" +date: "25 Mai 2021" +output: html_document +--- + +Le 27 Janvier 1986, veille du décollage de la navette _Challenger_, eu +lieu une télé-conférence de trois heures entre les ingénieurs de la +Morton Thiokol (constructeur d'un des moteurs) et de la NASA. La +discussion portait principalement sur les conséquences de la +température prévue au moment du décollage de 31°F (juste en dessous de +0°C) sur le succès du vol et en particulier sur la performance des +joints toriques utilisés dans les moteurs. En effet, aucun test +n'avait été effectué à cette température. + +L'étude qui suit reprend donc une partie des analyses effectuées cette +nuit là et dont l'objectif était d'évaluer l'influence potentielle de +la température et de la pression à laquelle sont soumis les joints +toriques sur leur probabilité de dysfonctionnement. Pour cela, nous +disposons des résultats des expériences réalisées par les ingénieurs +de la NASA durant les 6 années précédant le lancement de la navette +Challenger. + +```{r} +library(ggplot2) +sessionInfo() +``` + + +```{r} +devtools::session_info() +``` + +# Chargement des données + +```{r} +data = read.csv("https://app-learninglab.inria.fr/moocrr/gitlab/moocrr-session3/moocrr-reproducibility-study/raw/master/data/shuttle.csv",header=T) +data +``` +Nous savons, grâce à notre expérience précédente sur cet ensemble de données, que le filtrage des données est une très mauvaise idée. + +Nous allons donc les traiter comme telles, sans modification. + +Vérifions visuellement comment la température affecte le dysfonctionnement : +```{r} +plot(data=data, Malfunction/Count ~ Temperature, ylim=c(0,1)) +``` +Supposons que les joints toriques se rompent indépendamment les uns des autres avec la même probabilité qui dépend uniquement de la température. +Une régression logistique devrait nous permettre d'estimer l'influence de la température. +```{r} +logistic_reg = glm(data=data, Malfunction/Count ~ Temperature, weights=Count, +family=binomial(link='logit')) +summary(logistic_reg) +``` +L'estimateur du maximum de vraisemblance de l'ordonnée à l'origine et de la Température sont donc $\hat{\alpha}$= 5,0849 et $\hat{\beta}$ = -0,1156 et leurs erreurs type sont $s_{\hat{\alpha}}$ = 3,052 et$s_{\hat{\beta}}$ = 0,04702. La déviance résiduelle correspond à la Goodness of fit $G^{2}$ = 18,086 avec 21 degrés de liberté. + +# Prévision de la probabilité de défaillance + +la température au moment du lancement de la navette était de 31°F. Essayons d'estimer la probabilité de défaillance pour une telle température en utilisant notre modèle : +```{r} +# shuttle=shuttle[shuttle$r!=0,] +tempv = seq(from=30, to=90, by = .5) +rmv <- predict(logistic_reg,list(Temperature=tempv),type="response") +plot(tempv,rmv,type="l",ylim=c(0,1)) +points(data=data, Malfunction/Count ~ Temperature) +``` +Essayons de tracer les intervalles de confiance avec ggplot2. + +```{r} +ggplot(data, aes(y=Malfunction/Count, x=Temperature)) + geom_point(alpha=.2, size = 2, color="blue") + +geom_smooth(method = "glm", method.args = list(family = "binomial"), fullrange=T) + +xlim(30,90) + ylim(0,1) + theme_bw() + +``` + +Mmmh, nous avons un avertissement de ggplot2 indiquant "non-integer #successes in a binomial glm !". Cela semble louche. De plus, cette région de confiance semble énorme. . . Il semble étrange que l'incertitude augmente autant pour des températures plus élevées. Et par rapport au précédent appel à glm, nous n'avons pas indiqué le poids qui tient compte du fait que chaque rapport Malfunction/Count correspond à des observations Count (si quelqu'un sait comment faire cela. . . ). Il doit y avoir un problème. +Fournissons donc les données "brutes" à ggplot2. + +```{r} +data_flat=data.frame() +for(i in 1:nrow(data)) { +temperature = data[i,"Temperature"]; +malfunction = data[i,"Malfunction"]; +d = data.frame(Temperature=temperature,Malfunction=rep(0,times = data[i,"Count"])) +if(malfunction>0) { +d[1:malfunction, "Malfunction"]=1; +} +data_flat=rbind(data_flat,d) +} +dim(data_flat) +``` + + +```{r} +str(data_flat) +``` + +Vérifions si j'obtiens la même régression ou non : +```{r} +logistic_reg_flat = glm(data=data_flat, Malfunction ~ Temperature, family=binomial(link='logit')) +summary(logistic_reg) +``` +Parfait. Les estimations et les erreurs type sont les mêmes bien que la déviance résiduelle soit différente puisque la distance est maintenant mesurée par rapport à chaque mesure 0/1 et non par rapport à des ratios. Utilisons le tracé la régression pour data_flat ainsi que les ratios (données). + +```{r} +ggplot(data=data_flat, aes(y=Malfunction, x=Temperature)) + +geom_smooth(method = "glm", method.args = list(family = "binomial"), fullrange=T) + +geom_point(data=data, aes(y=Malfunction/Count, x=Temperature),alpha=.2, size = 2, color="blue") + +geom_point(alpha=.5, size = .5) + +xlim(30,90) + ylim(0,1) + theme_bw() +``` +Cet intervalle de confiance semble beaucoup plus raisonnable (en accord avec les données) que le précédent. +Vérifions s'il correspond à la prédiction obtenue en appelant directement predict. L'obtention de la prédiction peut se faire directement ou par l'intermédiaire de la fonction link. +Voici la version "directe" (réponse) que j'ai utilisée dans mon tout premier graphique : +```{r} +pred = predict(logistic_reg_flat,list(Temperature=30),type="response",se.fit = T) +pred +``` +La probabilité d'échec estimée pour 30° est donc de 0,834. Cependant, la valeur se.f it semble assez difficile à utiliser ainsi. +Je ne peux évidemment pas simplement ajouter ±2 se.fit à fit pour calculer un intervalle de confiance. + +Voici la version "link" (lien) + +```{r} +pred_link = predict(logistic_reg_flat,list(Temperature=30),type="link",se.fit = T) +pred_link +``` + +```{r} +logistic_reg$family$linkinv(pred_link$fit) +``` + +Je récupère 0.834 pour la probabilité d'échec estimée à 30°. Mais maintenant, en passant par la fonction linkinv, nous pouvons utiliser se.fit : + +```{r} +critval = 1.96 +logistic_reg$family$linkinv(c(pred_link$fit-critval*pred_link$se.fit, +pred_link$fit+critval*pred_link$se.fit)) +``` + + +L'intervalle de confiance à 95% pour notre estimation est donc de [0.163,0.992]. C'est ce que ggplot2 vient de me tracer. Cela semble cohérent. +Je suis maintenant assez confiant dans le fait que j'ai réussi à calculer et à représenter correctement l'incertitude de ma prédiction. Soyons honnêtes, cela m'a pris du temps. Mes premières tentatives étaient manifestement erronées (je ne savais pas comment faire, alors j'ai fait confiance à ggplot2, que j'ai mal utilisé) et je n'ai pas utilisé la bonne méthode statistique. Je me sens également confiant maintenant parce que cela a été validé d'une manière ou d'une autre par d'autres collègues mais il sera intéressant que vous rassembliez d'autres types de tracés des valeurs que vous avez obtenues, qui diffèrent et que vous auriez probablement gardées si vous n'aviez pas de référence à laquelle comparer. +Veuillez nous fournir autant de versions que vous le pouvez. + diff --git a/module4/exo5_fr_Replication.html b/module4/exo5_fr_Replication.html new file mode 100644 index 0000000000000000000000000000000000000000..0e6605baabb88864c00397a7d9573add819110f7 --- /dev/null +++ b/module4/exo5_fr_Replication.html @@ -0,0 +1,490 @@ + + + + +
+ + + + + + + + + +Le 27 Janvier 1986, veille du décollage de la navette Challenger, eu lieu une télé-conférence de trois heures entre les ingénieurs de la Morton Thiokol (constructeur d’un des moteurs) et de la NASA. La discussion portait principalement sur les conséquences de la température prévue au moment du décollage de 31°F (juste en dessous de 0°C) sur le succès du vol et en particulier sur la performance des joints toriques utilisés dans les moteurs. En effet, aucun test n’avait été effectué à cette température.
+L’étude qui suit reprend donc une partie des analyses effectuées cette nuit là et dont l’objectif était d’évaluer l’influence potentielle de la température et de la pression à laquelle sont soumis les joints toriques sur leur probabilité de dysfonctionnement. Pour cela, nous disposons des résultats des expériences réalisées par les ingénieurs de la NASA durant les 6 années précédant le lancement de la navette Challenger.
+library(ggplot2)
+sessionInfo()
+## R version 4.1.0 (2021-05-18)
+## Platform: x86_64-w64-mingw32/x64 (64-bit)
+## Running under: Windows 10 x64 (build 19041)
+##
+## Matrix products: default
+##
+## locale:
+## [1] LC_COLLATE=French_France.1252 LC_CTYPE=French_France.1252
+## [3] LC_MONETARY=French_France.1252 LC_NUMERIC=C
+## [5] LC_TIME=French_France.1252
+##
+## attached base packages:
+## [1] stats graphics grDevices utils datasets methods base
+##
+## other attached packages:
+## [1] ggplot2_3.3.3
+##
+## loaded via a namespace (and not attached):
+## [1] bslib_0.2.5.1 compiler_4.1.0 pillar_1.6.1 jquerylib_0.1.4
+## [5] tools_4.1.0 digest_0.6.27 jsonlite_1.7.2 evaluate_0.14
+## [9] lifecycle_1.0.0 tibble_3.1.2 gtable_0.3.0 pkgconfig_2.0.3
+## [13] rlang_0.4.11 DBI_1.1.1 yaml_2.2.1 xfun_0.23
+## [17] withr_2.4.2 stringr_1.4.0 dplyr_1.0.6 knitr_1.33
+## [21] generics_0.1.0 sass_0.4.0 vctrs_0.3.8 grid_4.1.0
+## [25] tidyselect_1.1.1 glue_1.4.2 R6_2.5.0 fansi_0.4.2
+## [29] rmarkdown_2.8 purrr_0.3.4 magrittr_2.0.1 scales_1.1.1
+## [33] ellipsis_0.3.2 htmltools_0.5.1.1 assertthat_0.2.1 colorspace_2.0-1
+## [37] utf8_1.2.1 stringi_1.6.1 munsell_0.5.0 crayon_1.4.1
+devtools::session_info()
+## - Session info ---------------------------------------------------------------
+## setting value
+## version R version 4.1.0 (2021-05-18)
+## os Windows 10 x64
+## system x86_64, mingw32
+## ui RTerm
+## language (EN)
+## collate French_France.1252
+## ctype French_France.1252
+## tz Europe/Paris
+## date 2021-05-25
+##
+## - Packages -------------------------------------------------------------------
+## package * version date lib source
+## assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.1.0)
+## bslib 0.2.5.1 2021-05-18 [1] CRAN (R 4.1.0)
+## cachem 1.0.5 2021-05-15 [1] CRAN (R 4.1.0)
+## callr 3.7.0 2021-04-20 [1] CRAN (R 4.1.0)
+## cli 2.5.0 2021-04-26 [1] CRAN (R 4.1.0)
+## colorspace 2.0-1 2021-05-04 [1] CRAN (R 4.1.0)
+## crayon 1.4.1 2021-02-08 [1] CRAN (R 4.1.0)
+## DBI 1.1.1 2021-01-15 [1] CRAN (R 4.1.0)
+## desc 1.3.0 2021-03-05 [1] CRAN (R 4.1.0)
+## devtools 2.4.1 2021-05-05 [1] CRAN (R 4.1.0)
+## digest 0.6.27 2020-10-24 [1] CRAN (R 4.1.0)
+## dplyr 1.0.6 2021-05-05 [1] CRAN (R 4.1.0)
+## ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.1.0)
+## evaluate 0.14 2019-05-28 [1] CRAN (R 4.1.0)
+## fansi 0.4.2 2021-01-15 [1] CRAN (R 4.1.0)
+## fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.1.0)
+## fs 1.5.0 2020-07-31 [1] CRAN (R 4.1.0)
+## generics 0.1.0 2020-10-31 [1] CRAN (R 4.1.0)
+## ggplot2 * 3.3.3 2020-12-30 [1] CRAN (R 4.1.0)
+## glue 1.4.2 2020-08-27 [1] CRAN (R 4.1.0)
+## gtable 0.3.0 2019-03-25 [1] CRAN (R 4.1.0)
+## htmltools 0.5.1.1 2021-01-22 [1] CRAN (R 4.1.0)
+## jquerylib 0.1.4 2021-04-26 [1] CRAN (R 4.1.0)
+## jsonlite 1.7.2 2020-12-09 [1] CRAN (R 4.1.0)
+## knitr 1.33 2021-04-24 [1] CRAN (R 4.1.0)
+## lifecycle 1.0.0 2021-02-15 [1] CRAN (R 4.1.0)
+## magrittr 2.0.1 2020-11-17 [1] CRAN (R 4.1.0)
+## memoise 2.0.0 2021-01-26 [1] CRAN (R 4.1.0)
+## munsell 0.5.0 2018-06-12 [1] CRAN (R 4.1.0)
+## pillar 1.6.1 2021-05-16 [1] CRAN (R 4.1.0)
+## pkgbuild 1.2.0 2020-12-15 [1] CRAN (R 4.1.0)
+## pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.1.0)
+## pkgload 1.2.1 2021-04-06 [1] CRAN (R 4.1.0)
+## prettyunits 1.1.1 2020-01-24 [1] CRAN (R 4.1.0)
+## processx 3.5.2 2021-04-30 [1] CRAN (R 4.1.0)
+## ps 1.6.0 2021-02-28 [1] CRAN (R 4.1.0)
+## purrr 0.3.4 2020-04-17 [1] CRAN (R 4.1.0)
+## R6 2.5.0 2020-10-28 [1] CRAN (R 4.1.0)
+## remotes 2.3.0 2021-04-01 [1] CRAN (R 4.1.0)
+## rlang 0.4.11 2021-04-30 [1] CRAN (R 4.1.0)
+## rmarkdown 2.8 2021-05-07 [1] CRAN (R 4.1.0)
+## rprojroot 2.0.2 2020-11-15 [1] CRAN (R 4.1.0)
+## sass 0.4.0 2021-05-12 [1] CRAN (R 4.1.0)
+## scales 1.1.1 2020-05-11 [1] CRAN (R 4.1.0)
+## sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 4.1.0)
+## stringi 1.6.1 2021-05-10 [1] CRAN (R 4.1.0)
+## stringr 1.4.0 2019-02-10 [1] CRAN (R 4.1.0)
+## testthat 3.0.2 2021-02-14 [1] CRAN (R 4.1.0)
+## tibble 3.1.2 2021-05-16 [1] CRAN (R 4.1.0)
+## tidyselect 1.1.1 2021-04-30 [1] CRAN (R 4.1.0)
+## usethis 2.0.1 2021-02-10 [1] CRAN (R 4.1.0)
+## utf8 1.2.1 2021-03-12 [1] CRAN (R 4.1.0)
+## vctrs 0.3.8 2021-04-29 [1] CRAN (R 4.1.0)
+## withr 2.4.2 2021-04-18 [1] CRAN (R 4.1.0)
+## xfun 0.23 2021-05-15 [1] CRAN (R 4.1.0)
+## yaml 2.2.1 2020-02-01 [1] CRAN (R 4.1.0)
+##
+## [1] C:/Users/Paul Faye/Documents/R/win-library/4.1
+## [2] C:/Program Files/R/R-4.1.0/library
+data = read.csv("https://app-learninglab.inria.fr/moocrr/gitlab/moocrr-session3/moocrr-reproducibility-study/raw/master/data/shuttle.csv",header=T)
+data
+## Date Count Temperature Pressure Malfunction
+## 1 4/12/81 6 66 50 0
+## 2 11/12/81 6 70 50 1
+## 3 3/22/82 6 69 50 0
+## 4 11/11/82 6 68 50 0
+## 5 4/04/83 6 67 50 0
+## 6 6/18/82 6 72 50 0
+## 7 8/30/83 6 73 100 0
+## 8 11/28/83 6 70 100 0
+## 9 2/03/84 6 57 200 1
+## 10 4/06/84 6 63 200 1
+## 11 8/30/84 6 70 200 1
+## 12 10/05/84 6 78 200 0
+## 13 11/08/84 6 67 200 0
+## 14 1/24/85 6 53 200 2
+## 15 4/12/85 6 67 200 0
+## 16 4/29/85 6 75 200 0
+## 17 6/17/85 6 70 200 0
+## 18 7/2903/85 6 81 200 0
+## 19 8/27/85 6 76 200 0
+## 20 10/03/85 6 79 200 0
+## 21 10/30/85 6 75 200 2
+## 22 11/26/85 6 76 200 0
+## 23 1/12/86 6 58 200 1
+Nous savons, grâce à notre expérience précédente sur cet ensemble de données, que le filtrage des données est une très mauvaise idée.
+Nous allons donc les traiter comme telles, sans modification.
+Vérifions visuellement comment la température affecte le dysfonctionnement :
+plot(data=data, Malfunction/Count ~ Temperature, ylim=c(0,1))
+ Supposons que les joints toriques se rompent indépendamment les uns des autres avec la même probabilité qui dépend uniquement de la température. Une régression logistique devrait nous permettre d’estimer l’influence de la température.
logistic_reg = glm(data=data, Malfunction/Count ~ Temperature, weights=Count,
+family=binomial(link='logit'))
+summary(logistic_reg)
+##
+## Call:
+## glm(formula = Malfunction/Count ~ Temperature, family = binomial(link = "logit"),
+## data = data, weights = Count)
+##
+## Deviance Residuals:
+## Min 1Q Median 3Q Max
+## -0.95227 -0.78299 -0.54117 -0.04379 2.65152
+##
+## Coefficients:
+## Estimate Std. Error z value Pr(>|z|)
+## (Intercept) 5.08498 3.05247 1.666 0.0957 .
+## Temperature -0.11560 0.04702 -2.458 0.0140 *
+## ---
+## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+##
+## (Dispersion parameter for binomial family taken to be 1)
+##
+## Null deviance: 24.230 on 22 degrees of freedom
+## Residual deviance: 18.086 on 21 degrees of freedom
+## AIC: 35.647
+##
+## Number of Fisher Scoring iterations: 5
+L’estimateur du maximum de vraisemblance de l’ordonnée à l’origine et de la Température sont donc \(\hat{\alpha}\)= 5,0849 et \(\hat{\beta}\) = -0,1156 et leurs erreurs type sont \(s_{\hat{\alpha}}\) = 3,052 et\(s_{\hat{\beta}}\) = 0,04702. La déviance résiduelle correspond à la Goodness of fit \(G^{2}\) = 18,086 avec 21 degrés de liberté.
+la température au moment du lancement de la navette était de 31°F. Essayons d’estimer la probabilité de défaillance pour une telle température en utilisant notre modèle :
+# shuttle=shuttle[shuttle$r!=0,]
+tempv = seq(from=30, to=90, by = .5)
+rmv <- predict(logistic_reg,list(Temperature=tempv),type="response")
+plot(tempv,rmv,type="l",ylim=c(0,1))
+points(data=data, Malfunction/Count ~ Temperature)
+ Essayons de tracer les intervalles de confiance avec ggplot2.
ggplot(data, aes(y=Malfunction/Count, x=Temperature)) + geom_point(alpha=.2, size = 2, color="blue") +
+geom_smooth(method = "glm", method.args = list(family = "binomial"), fullrange=T) +
+xlim(30,90) + ylim(0,1) + theme_bw()
+## `geom_smooth()` using formula 'y ~ x'
+## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
+Mmmh, nous avons un avertissement de ggplot2 indiquant “non-integer #successes in a binomial glm !”. Cela semble louche. De plus, cette région de confiance semble énorme. . . Il semble étrange que l’incertitude augmente autant pour des températures plus élevées. Et par rapport au précédent appel à glm, nous n’avons pas indiqué le poids qui tient compte du fait que chaque rapport Malfunction/Count correspond à des observations Count (si quelqu’un sait comment faire cela. . . ). Il doit y avoir un problème. Fournissons donc les données “brutes” à ggplot2.
+data_flat=data.frame()
+for(i in 1:nrow(data)) {
+temperature = data[i,"Temperature"];
+malfunction = data[i,"Malfunction"];
+d = data.frame(Temperature=temperature,Malfunction=rep(0,times = data[i,"Count"]))
+if(malfunction>0) {
+d[1:malfunction, "Malfunction"]=1;
+}
+data_flat=rbind(data_flat,d)
+}
+dim(data_flat)
+## [1] 138 2
+str(data_flat)
+## 'data.frame': 138 obs. of 2 variables:
+## $ Temperature: int 66 66 66 66 66 66 70 70 70 70 ...
+## $ Malfunction: num 0 0 0 0 0 0 1 0 0 0 ...
+Vérifions si j’obtiens la même régression ou non :
+logistic_reg_flat = glm(data=data_flat, Malfunction ~ Temperature, family=binomial(link='logit'))
+summary(logistic_reg)
+##
+## Call:
+## glm(formula = Malfunction/Count ~ Temperature, family = binomial(link = "logit"),
+## data = data, weights = Count)
+##
+## Deviance Residuals:
+## Min 1Q Median 3Q Max
+## -0.95227 -0.78299 -0.54117 -0.04379 2.65152
+##
+## Coefficients:
+## Estimate Std. Error z value Pr(>|z|)
+## (Intercept) 5.08498 3.05247 1.666 0.0957 .
+## Temperature -0.11560 0.04702 -2.458 0.0140 *
+## ---
+## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+##
+## (Dispersion parameter for binomial family taken to be 1)
+##
+## Null deviance: 24.230 on 22 degrees of freedom
+## Residual deviance: 18.086 on 21 degrees of freedom
+## AIC: 35.647
+##
+## Number of Fisher Scoring iterations: 5
+Parfait. Les estimations et les erreurs type sont les mêmes bien que la déviance résiduelle soit différente puisque la distance est maintenant mesurée par rapport à chaque mesure 0/1 et non par rapport à des ratios. Utilisons le tracé la régression pour data_flat ainsi que les ratios (données).
+ggplot(data=data_flat, aes(y=Malfunction, x=Temperature)) +
+geom_smooth(method = "glm", method.args = list(family = "binomial"), fullrange=T) +
+geom_point(data=data, aes(y=Malfunction/Count, x=Temperature),alpha=.2, size = 2, color="blue") +
+geom_point(alpha=.5, size = .5) +
+xlim(30,90) + ylim(0,1) + theme_bw()
+## `geom_smooth()` using formula 'y ~ x'
+ Cet intervalle de confiance semble beaucoup plus raisonnable (en accord avec les données) que le précédent. Vérifions s’il correspond à la prédiction obtenue en appelant directement predict. L’obtention de la prédiction peut se faire directement ou par l’intermédiaire de la fonction link. Voici la version “directe” (réponse) que j’ai utilisée dans mon tout premier graphique :
pred = predict(logistic_reg_flat,list(Temperature=30),type="response",se.fit = T)
+pred
+## $fit
+## 1
+## 0.834373
+##
+## $se.fit
+## 1
+## 0.2293304
+##
+## $residual.scale
+## [1] 1
+La probabilité d’échec estimée pour 30° est donc de 0,834. Cependant, la valeur se.f it semble assez difficile à utiliser ainsi. Je ne peux évidemment pas simplement ajouter ±2 se.fit à fit pour calculer un intervalle de confiance.
+Voici la version “link” (lien)
+pred_link = predict(logistic_reg_flat,list(Temperature=30),type="link",se.fit = T)
+pred_link
+## $fit
+## 1
+## 1.616942
+##
+## $se.fit
+## [1] 1.659473
+##
+## $residual.scale
+## [1] 1
+logistic_reg$family$linkinv(pred_link$fit)
+## 1
+## 0.834373
+Je récupère 0.834 pour la probabilité d’échec estimée à 30°. Mais maintenant, en passant par la fonction linkinv, nous pouvons utiliser se.fit :
+critval = 1.96
+logistic_reg$family$linkinv(c(pred_link$fit-critval*pred_link$se.fit,
+pred_link$fit+critval*pred_link$se.fit))
+## 1 1
+## 0.1630612 0.9923814
+L’intervalle de confiance à 95% pour notre estimation est donc de [0.163,0.992]. C’est ce que ggplot2 vient de me tracer. Cela semble cohérent. Je suis maintenant assez confiant dans le fait que j’ai réussi à calculer et à représenter correctement l’incertitude de ma prédiction. Soyons honnêtes, cela m’a pris du temps. Mes premières tentatives étaient manifestement erronées (je ne savais pas comment faire, alors j’ai fait confiance à ggplot2, que j’ai mal utilisé) et je n’ai pas utilisé la bonne méthode statistique. Je me sens également confiant maintenant parce que cela a été validé d’une manière ou d’une autre par d’autres collègues mais il sera intéressant que vous rassembliez d’autres types de tracés des valeurs que vous avez obtenues, qui diffèrent et que vous auriez probablement gardées si vous n’aviez pas de référence à laquelle comparer. Veuillez nous fournir autant de versions que vous le pouvez.
+