diff --git a/challenger.pdf b/challenger.pdf index c55cade61bbbefed47b5f6e8256fdf3c029043b1..8e264cf11e7a737982a9f03f3f38a35eb9add6f2 100644 Binary files a/challenger.pdf and b/challenger.pdf differ diff --git a/src/R/challenger.Rmd b/src/R/challenger.Rmd index 49be3ee61a9ce4f23d5aebcd2746e485a8703fd1..9d19787596f9da39aaae8efb141a55064d8389c2 100644 --- a/src/R/challenger.Rmd +++ b/src/R/challenger.Rmd @@ -59,12 +59,71 @@ rmv <- predict(logistic_reg,list(Temperature=tempv),type="response") plot(tempv,rmv,type="l",ylim=c(0,1)) points(data=data, Malfunction/Count ~ Temperature) ``` + This figure is very similar to the Figure 4 of Dalal et al. **I have managed to replicate the Figure 4 of the Dalal et al. article.** -Let's try to plot confidence intervals although I am not sure exactly how they are computed. +# Confidence on the prediction +Let's try to plot confidence intervals with ggplot2. +```{r, fig.height=3.3} +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, I have a warning from ggplot2 indicating *"non-integer #successes in a binomial glm!"*. This seems fishy. Furthermore, this confidence region seems huge... It seems strange to me that the uncertainty grows so large for higher temperatures. And compared to my previous call to glm, I haven't indicated the weight which accounts for the fact that each ratio Malfunction/Count corresponds to Count observations (if someone knows how to do this...). There must be something wrong. + +So let's provide the "raw" data to ggplot2. ```{r} -ggplot(data, aes(y=Malfunction/Count, x=Temperature)) + geom_point(alpha=.2, size = 2) + +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) +str(data_flat) +``` + +Let's check whether I obtain the same regression or not: +```{r} +logistic_reg_flat = glm(data=data_flat, Malfunction ~ Temperature, family=binomial(link='logit')) +summary(logistic_reg) +``` +Perfect. The estimates and the standard errors are the same although the Residual deviance is difference since the distance is now measured with respect to each 0/1 measurement and not to ratios. Let's use plot the regression for *data_flat* along with the ratios (*data*). + +```{r, fig.height=3.3} +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() ``` -No confidence region was given in the original article. **Let's hope this confidence region estimation is correct.** + +This confidence interval seems much more reasonable (in accordance with the data) than the previous one. Let's check whether it corresponds to the prediction obtained when calling directly predict. Obtaining the prediction can be done directly or through the link function. + +Here is the "direct" (response) version I used in my very first plot: +```{r} +pred = predict(logistic_reg_flat,list(Temperature=30),type="response",se.fit = T) +pred +``` +The estimated Failure probability for 30° is thus $0.834$. However, the $se.fit$ value seems pretty hard to use as I can obviously not simply add $\pm 2 se.fit$ to $fit$ to compute a confidence interval. + +Here is the "link" version: +```{r} +pred_link = predict(logistic_reg_flat,list(Temperature=30),type="link",se.fit = T) +pred_link +logistic_reg$family$linkinv(pred_link$fit) +``` +I recover $0.834$ for the estimated Failure probability at 30°. But now, going through the *linkinv* function, we can use $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)) +``` +The 95% confidence interval for our estimation is thus [0.163,0.992]. This is what ggplot2 just plotted me. This seems coherent. + +**I am now rather confident that I have managed to correctly compute and plot the uncertainty of my prediction.** Let's be honnest, it took me a while. My first attempts were plainly wrong (I didn't know how to do this so I trusted ggplot2, which I was misusing) and did not use the correct statistical method. I also feel confident now because this has been somehow validated by other colleagues but it will be interesting that you collect other kind of plots values that you obtained, that differ and that you would probably have kept if you didn't have a reference to compare to. Please provide us with as many versions as you can. diff --git a/src/R/challenger.pdf b/src/R/challenger.pdf index c55cade61bbbefed47b5f6e8256fdf3c029043b1..8e264cf11e7a737982a9f03f3f38a35eb9add6f2 100644 Binary files a/src/R/challenger.pdf and b/src/R/challenger.pdf differ