In 1986, the space shuttle Challenger exploded during takeoff, killing the seven astronauts aboard. The explosion was the result of an O-ring failure, a splitting of a ring of rubber that seals the parts of the ship together. The accident was believed to have been caused by the unusually cold weather (31°F or 0°C) at the time of launch, as there is reason to believe that the O-ring failure probabilities increase as temperature decreases.
Data on previous space shuttle launches and O-ring failures is given in the dataset challenger provided with the mcsm package. The first column corresponds to the failure indicators \(y_i\) and the second column to the corresponding temperature \(x_{i} \ \scriptsize 1 ≤ i ≤ 24\)
Primero procedamos a cargar los paquetes y otros datos necesarios.
# install.packages('mcsm')
library('MASS')
library('coda')
library('mcsm')
library('knitr')
library('VGAM')
library('plyr')
library('ggplot2')
library('rjags')
library('stats')
data(challenger)
De acuerdo con la documentación, disponible aquÃ, en sabemos que el conjunto de datos challenger registra la ocurencia de fallas en los O-anillos durante lanzamientos espaciales contra la temperatura al momento del lanzamiento.
De la columna oring, se tiene que:
Exploremos, rápidamente los datos.
| oring | temp |
|---|---|
| 1 | 53 |
| 1 | 57 |
| 1 | 58 |
| 1 | 63 |
| 0 | 66 |
| #### Inci | so 1 |
Fit this dataset with a logistic regression, where:
\[ P(Y_{i} = 1 | \ x_{i}) = p(x_{i}) = \frac{exp(\alpha + \beta x_{i})}{1 + exp(\alpha + \beta x_{i})}\] using R glm function, as illustrated on page 21. Deduce the MLEs for \(\alpha\) and \(\beta\), along with standard errors.
Solución
Usando la función R glm
log_reg = glm(formula = oring~temp,family="binomial",data=challenger)
summary(log_reg)
##
## Call:
## glm(formula = oring ~ temp, family = "binomial", data = challenger)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.0611 -0.7613 -0.3783 0.4524 2.2175
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 15.0429 7.3786 2.039 0.0415 *
## temp -0.2322 0.1082 -2.145 0.0320 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 28.267 on 22 degrees of freedom
## Residual deviance: 20.315 on 21 degrees of freedom
## AIC: 24.315
##
## Number of Fisher Scoring iterations: 5
obtemenemos, los estimadores:
\[\begin{align*} \hat{\alpha} &= 15.0429 \\ \hat{\beta} &= -0.2322 \end{align*}\]
Y los errores estándar:
\[\begin{align*} se_{\alpha} &= 7.3786 \\ se_{\beta} &= 0.1082 \end{align*}\]
De acuerdo a los p-value's obtenidos, podemos afirmar que ambos estimadores son significativos en el modelo.
Set up a Metropolis–Hastings algorithm with the likelihood as target using an exponential candidate for \(\alpha\) and a Laplace (double-exponential) candidate for \(\beta\). (Hint: Choose the parameters of the candidates based on the MLEs derived in 1))
Solución
Dado el modelo
\[ P(Y_{i} = 1 | \ x_{i}) = p(x_{i}) = \frac{exp(\alpha + \beta x_{i})}{1 + exp(\alpha + \beta x_{i})}\]
Se tiene que,
\[ Y_{i} \sim Bernoulli\left(p(x_{i})\right) \ \scriptsize 1 ≤ i ≤ 23\]
Asà para cada \(1 ≤ i ≤ 23\),
\[ P[Y_{i} = y_{i} | x_{i}] = \left(\frac{exp(\alpha + \beta x_{i})}{1 + exp(\alpha + \beta x_{i})} \right)^{y_{i}} \left(1 - \frac{exp(\alpha + \beta x_{i})}{1 + exp(\alpha + \beta x_{i})} \right)^{1-y_{i}}\] O, equivalentemente,
\[ P[Y_{i} = y_{i} | x_{i}] = \left(\frac{exp(\alpha + \beta x_{i})}{1 + exp(\alpha + \beta x_{i})} \right)^{y_{i}} \left(\frac{1}{1 + exp(\alpha + \beta x_{i})} \right)^{1-y_{i}} \] Por lo que la función de verosimilitud es:
\[ \mathcal{L}(\alpha,\beta | \underline{y}) = \prod_{i=1}^{23} \left(\frac{exp(\alpha + \beta x_{i})}{1 + exp(\alpha + \beta x_{i})} \right)^{y_{i}} \left(\frac{1}{1 + exp(\alpha + \beta x_{i})} \right)^{1-y_{i}} \]
siguiendo la sugerencia, las distribuciones candidatas a utilizar serÃan:
\[\begin{align*} \alpha &\sim Exponencial(\lambda = 1/15.0429) \\ \beta &\sim Laplace(\mu = -0.2322, b = 0.0765) \end{align*}\]
Esto debido a que
\[\begin{align*} Var(\beta) &= 0.1082^{2} \\ 2 b^2 &= 0.1082^{2} \\ \sqrt{2} b & = 0.1082 \\ b &= 0.0765 \end{align*}\]
A continuación, se presenta la implementación del algoritmo:
# Cargando los datos
data(challenger)
# Fijamos la semilla
set.seed(210715)
# Parámetros globales
y = challenger[,1]
x = challenger[,2]
# Definimos la función de verosimilitud
verosimilitud = function(alpha, beta){
# Función que devueve el valor de la función de
# verosimilitud para el modelo de regresión
# logÃstica bajo la muestra para la muestra dada
# Argumentos
# - alpha: Coeficiente alpha de la regresión (intercepto)
# - beta: Coeficiente beta de la regresión
# Devuelve:
# vero_prod: Valor de verosimilitud evaluada en alpha, beta
vero_prod = 1
for(i in 1:23){
vero_prod = vero_prod * (exp(alpha + beta*x[i])/(1 + exp(alpha + beta*x[i])))^(y[i]) *
(1/(1 + exp(alpha + beta*x[i])))^(1 - y[i])
}
return(vero_prod)
}
# Definimos la función del producto de las candidatas
producto = function(alpha, beta){
# Función que devuelve el producto de las funciones de
# densidad candidatas para alpha y beta
# Parámetros:
# - alpha: Valor de alpha tal que alpha ~ Laplace(,)
# - beta: Valor de beta tal que beta ~ Laplace(,)
producto = dexp(alpha, 1/15.0429) * dlaplace(beta, −0.2322,0.0765)
return(producto)
}
# Implementación del algoritmo
MH_algorithm = function(Nsim = Nsim){
# Función que implementa el método de Metrópolis Hasthings
# para simular valores alpha, beta provenientes de la distribución
# de verosimilitud.
# Argumentos:
# - Nsim = Número de simulaciones
# Retorna:
# - raplha: Valores para alpha de la simulación
# - rbeta: Valores de beta de la simulación
# Inicializamos los parámetros a estimar
ralpha = rep(rexp(1,1/15.0429),Nsim)
rbeta = rep(rlaplace(1,−0.2322,0.0765),Nsim)
# Simulaciones
for(i in 2:Nsim){
Y = c(rexp(1, 1/15.0429), rlaplace(1,−0.2322,0.0765))
alpha_ratio = min(((verosimilitud(Y[1],Y[2]) * producto(ralpha[i-1],rbeta[i-1]))/
(verosimilitud(ralpha[i-1],rbeta[i-1]) * producto(Y[1],Y[2]))),1)
ralpha[i] = ralpha[i-1] + (Y[1] - ralpha[i-1]) * (runif(1) < alpha_ratio)
rbeta[i] = rbeta[i-1] + (Y[2] - rbeta[i-1]) * (runif(1) < alpha_ratio)
}
return(list(ralpha, rbeta))
}
# Usando el algortimo
Nsim = 5000
M_ejecucion = MH_algorithm(Nsim)
palpha = M_ejecucion[[1]]
pbeta = M_ejecucion[[2]]
par(mfrow=c(2, 2), cex = 0.6)
plot(palpha,type='l',
main=expression(paste("Simulación para ", alpha)),
ylab="",xlab="Simulaciones", col="chartreuse3")
plot(pbeta,type='l',
main=expression(paste("Simulación para ", beta)),
ylab="",xlab="Simulaciones", col="chocolate1")
hist(palpha,
main=expression(paste("Histograma de ", alpha)),
ylab="",xlab="Simulaciones", col="chartreuse3")
hist(pbeta,
main=expression(paste("Histograma de ", beta)),
ylab="",xlab="Simulaciones", col="chocolate1")
Generate 5000 iterations of the Markov chain and construct a picture similar to Figure 6.6 to evaluate the variability of \(p(x)\) minus the observation dots.
Nsim = 5000
M_ejecucion = MH_algorithm(Nsim)
palpha = M_ejecucion[[1]]
pbeta = M_ejecucion[[2]]
# Graficando observaciones originales
plot(x,y,pch=16,cex=1.5,col="maroon4",xlab="Temperatura",ylab="Fallas",
main="Variabilidad de p(x) menos los puntos observados")
# Curvas p(x) para los últimos 500 valores (palpha[i],pbeta[i])
for (i in 4500:Nsim){
curve(exp(palpha[i]+pbeta[i]*x)/(1+exp(palpha[i]+pbeta[i]*x)),
col="plum3",lwd=1.5, add=TRUE,)
}
# Curva usando los estimadores de la función glm
curve(exp(15.0429−0.2322*x)/(1+exp(15.0429+−0.2322*x)),
col="mediumorchid4",lwd=2.5, add=TRUE,)
Challenger data con curva \(p(x)\) (violeta oscuro) ajustada con los mÃnimos cuadrados de la función glm. Las curvas en violeta claro representan las muestras \(\left\lbrace \alpha^{(i)},\beta^{(i)}) \right \rbrace\) obtenidas a partir de la simulacion Monte Carlo y muestran la variabilidad de las curvas ajustadas en las últimas 500 iteraciones del total de simulaciones.
Derive from this sample an estimate of the probability of failure at 60°, 50°, and 40° F along with a standard error.
Solución
Como estimadores de \(\alpha,\beta\) podemos utilizar:
\[\begin{align*} \hat{\alpha} &= \sum_{i=1}^{N_{sim}} \alpha^{(i)} \\ \hat{\beta} &= \sum_{i=1}^{N_{sim}} \beta^{(i)} \end{align*}\]
donde \(\alpha^{(i)}\) corresponde a la i-ésima simulación de \(\alpha\), mediante el algortimo de Metropólis-Hastings, análogamente para \(\beta\). Entonces, en general, para una temperatura \(t\), se tiene que la probabilidad de falla a dicha temperatura , es decir,
\[ P(Y = 1 | X = c) = \frac{exp(\hat{\alpha}+\hat{\beta} \cdot c)}{1 + exp(\hat{\alpha}+\hat{\beta} \cdot c)}\] En la siguiente tabla se muestra dicha probabilidad para los valores requeridos, usando los estimadores propuestos y los estimados mediante la función glm
| Temperatura \((t)\) | \(P(Y=1\) | \(X=t)\) glm |
\(P(Y=1\) | \(X=t)\) Metropolis-Hastings |
|---|---|---|
| 40 | 0.9968428 | 0.9970414 |
| 50 | 0.9687171 | 0.9661424 |
| 60 | 0.7522969 | 0.7072793 |
| 70 | 0.2295065 | 0.1698440 |
| 80 | 0.0283850 | 0.0170288 |
De lo anterior, podemos conculir que para temperaturas menores a 60°F (15.5556°C) es más probable que ocurra una falla.
Para la modelación con JAGS usaremos como distribuciones a priori, una gamma no informativa para \(\alpha\), respetando que la distribución de la candidata (exponencial) en los incisos anteriores tomaba valores en los reales positivos. Para \(\beta\) usaremos una distribución normal no informativa, puesto que el soporte de la distribución candidata (laplace) tiene soporte en todos los reales. En resumen utilizaremos:
\[\begin{align*} \alpha &\sim Gamma() \beta &\sim Normal() \end{align*}\]
## Hipérparámetros
y = challenger[,1]
x = challenger[,2]
# Información inicial
Nsim = 5000
alpha = 15.0429
beta = -0.2322
eta = alpha + beta * x
p = plogis(eta)
y_jags = rep(0,23)
for(i in 1:23){
y_jags[i] = rbinom(1,size=1,prob=p[i])
}
# Carga de datos para el modelo
data <- list(y = y_jags,
x = x,
n = 23)
# Especificando el nombre de los parámetros del modelo
param <- c('alpha','beta')
# Inicialización de los parámetros
inits = function(){
list("alpha" = rexp(1,1/15.0429),
"beta" = rlaplace(1,-0.2322,0.0765))
}
ruta = 'challenger.bug'
# Modelo
fit <- jags.model(ruta,data,inits(), n.chains = 3)
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 23
## Unobserved stochastic nodes: 2
## Total graph size: 99
##
## Initializing model
fit
## JAGS model:
##
## /*
## Logit
## */
##
## model{
## for(i in 1:n){
## y[i] ~ dbern(p[i])
## logit(p[i]) <- eta[i]
## eta[i] <- alpha + beta*x[i]
## }
##
## ### Prior
## alpha ~ dnorm(0.0, 1.0E-4)
## beta ~ dnorm(0.0, 1.0E-4)
## }
## Fully observed variables:
## n x y
update(fit,1000)
sample <- coda.samples(fit, param, n.iter=5000, thin=1)
summary(sample)
##
## Iterations = 2001:7000
## Thinning interval = 1
## Number of chains = 3
## Sample size per chain = 5000
##
## 1. Empirical mean and standard deviation for each variable,
## plus standard error of the mean:
##
## Mean SD Naive SE Time-series SE
## alpha 12.5529 5.86940 0.0479235 0.9832
## beta -0.1882 0.08466 0.0006912 0.0142
##
## 2. Quantiles for each variable:
##
## 2.5% 25% 50% 75% 97.5%
## alpha 2.1531 8.2596 12.3269 16.189 25.47368
## beta -0.3733 -0.2408 -0.1849 -0.126 -0.03797
Gráficos de la simulación
plot(sample)
par(mfrow=c(2,2))
traceplot(sample)
dic.samples(fit, n.iter=2000,thin=1, type="pD")
## Mean deviance: 28.03
## penalty 1.804
## Penalized deviance: 29.84
#
# dic.samples(fit, n.iter=2000,thin=1, type="popt")