Regresión logı́stica y cangrejos herradura 11 de enero de 2009 Empezamos leyendo los datos. > table.4.3 = read.table("..//data/crab.txt", col.names = c("C", + "S", "W", "Sa", "Wt")) La variable respuesta que nos interesa es si las dichosas hembras de los cangrejos herradura (cuya fidelidad no es precisamente la mayor de sus virtudes) tienen, al menos, un satélite. Como predictor solamente vamos a utilizar la anchura del caparazón. Construimos la variable a partir de la variable original que nos da el número de satélites. > (table.4.3$Sa.bin = ifelse(table.4.3$Sa > 0, 1, 0)) [1] [38] [75] [112] [149] 1 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 0 Ya podemos ajustar el modelo de regresión logı́stica con la maravillosa función glm. > (crab.fit.logit = glm(Sa.bin ~ W, family = binomial, data = table.4.3)) Call: glm(formula = Sa.bin ~ W, family = binomial, data = table.4.3) Coefficients: (Intercept) -12.3508 W 0.4972 Degrees of Freedom: 172 Total (i.e. Null); 171 Residual Null Deviance: 225.8 Residual Deviance: 194.5 AIC: 198.5 Construimos una variable que discretiza los valores originales de la variable W que nos da la anchura del caparazón. > table.4.3$W.fac = cut(table.4.3$W, breaks = c(0, seq(23.25, 29.25), + Inf)) Calculamos la proporción de cangrejos que tienen al menos un satélite para cada grupo de anchura de caparazón. En definitiva estamos estimando la probabilidad del valor uno en la variable respuesta. > prop = aggregate(table.4.3$Sa.bin, by = list(W = table.4.3$W.fac), + mean)$x 1 1 1 1 1 0 0 1 1 0 1 1 1 Calculamos la anchura media del caparazón en cada grupo de anchura de caparazón. > plot.x = aggregate(table.4.3$W, by = list(W = table.4.3$W.fac), + mean)$x Ponemos los ejes y las etiquetas. plot(y = table.4.3$Sa.bin, x = table.4.3$W, xlab = expression(paste("Width, ", italic(x), "(cm)")), ylab = expression(paste("Proportion having satellites,", { pi }, "(x)")), axes = F, type = "n") axis(2, at = seq(0, 1, 0.2)) axis(1, at = seq(20, 34, 2)) lines(y = prop, x = plot.x, pch = 16, type = "p") ind = order(table.4.3$W) lines(x = table.4.3$W[ind], y = predict(crab.fit.logit, type = "response")[ind], type = "l", lty = 3) 0.8 0.6 0.4 0.2 0.0 Proportion having satellites,π(x) 1.0 > + + + + > > > > > + 22 24 26 28 30 32 34 Width, x(cm) Veamos un resumen del ajuste. Los errores estándar están basados en la distribución asintótica. En la columna etiquetada z value tenemos el estadı́stico de Wald. > summary(crab.fit.logit, correlation = F) Call: glm(formula = Sa.bin ~ W, family = binomial, data = table.4.3) Deviance Residuals: Min 1Q Median -2.0281 -1.0458 0.5480 3Q 0.9066 2 Max 1.6941 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -12.3508 2.6287 -4.698 2.62e-06 *** W 0.4972 0.1017 4.887 1.02e-06 *** --Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 225.76 Residual deviance: 194.45 AIC: 198.45 on 172 on 171 degrees of freedom degrees of freedom Number of Fisher Scoring iterations: 4 El estadı́stico del cociente de verosimilitudes de que el coeficiente es nulo lo podemos obtener como > crab.fit.logit$null.deviance - crab.fit.logit$deviance [1] 31.30586 Ası́ como los intervalos de confianza para los parámetros. > library(MASS) > confint(crab.fit.logit) 2.5 % 97.5 % (Intercept) -17.8100090 -7.4572470 W 0.3083806 0.7090167 Estimamos las probabilidades de que la respuesta sea igual a uno. > crab.predict = predict(crab.fit.logit, type = "response", se = T) Representamos los intervalos de confianza. > > + + > > > + > + ind = order(table.4.3$W) plot(table.4.3$W[ind], crab.predict$fit[ind], xlim = c(20, 33), ylab = "Probabilidad de italic(x), "(cm)"))) axis(2, at = seq(0, 1, 0.2)) axis(1, at = seq(20, 32, 2)) lines(table.4.3$W[ind], crab.predict$fit[ind] lty = 3) lines(table.4.3$W[ind], crab.predict$fit[ind] lty = 3) 3 axes = F, type = "l", satélite", xlab = expression(paste("Anchura, - 1.96 * crab.predict$se[ind], + 1.96 * crab.predict$se[ind], Probabilidad de satélite 0.2 0.4 0.6 0.8 1.0 20 22 24 26 28 Anchura, x(cm) 4 30 32