Regresión logística

A continuación se mostrará un modelado de regresion logistica para el tema de los camarones, para poder hacer una estimación de la probabilidad de una variable binaria en función de una variable cuantitativa. Todo esto mediante un proceso que nos ayudará a determinar los resultados.

Caso de estudio: Camarones

Se analizara una empresa que produce camarón, en la cual a los camarones se le dan cierta cantidad de comida con el objetivo que lleguen a 12 gramos, lo cual se vería traducido en una buena cosecha.

Imagen representativa de camarones

Importar datos

library(pacman)
p_load("prettydoc", "DT", "xfun","readr")
camarones <- read_csv("camarones.csv")
## Rows: 12 Columns: 2
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (2): AlimentoDiario, Exito
## 
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
datatable(camarones)

Datos recolectados de 12 estanques distintos

La columna “AlimentoDiario” representa los kilos de comida diarios durante la última semana de alimentación del estanque, en la columna “éxito” se pone 1 cuando los camarones tienen sus 12 gramos y la venta se puede realizar y con un 0 en el caso contrario, en esta tabla se obtuvó que 3 de los estanques tuvieron éxito.

Tabla de frecuencia de los datos

tabla <- table(camarones$Exito)
tabla
## 
## 0 1 
## 9 3

Ilustrando gráficamente

colores <- NULL 
colores[camarones$Exito == 1] <- "green"
colores[camarones$Exito == 0] <- "red"
plot(camarones$AlimentoDiario, camarones$Exito, pch=21, bg=colores,
     xlab="Cantidad de alimento diario", ylab="Probabilidades de éxito")
legend('bottomleft', c('Éxito', 'Sin éxito'), pch = 21, col = c('green', 'red'))

Haciendo incapie en estas observaciones, se determina que la cantidad de alimento dado al estanque es influyente. Pueden haber muchos factores externos que no permitan el crecimiento de los camarones.

Regresión logística

La variable AlimentoDiario será empleada para el modelo de regresión logistica y se determinará si el éxito es verdadero.

regresion <- glm(Exito ~ AlimentoDiario, data = camarones, family=binomial)
summary(regresion)
## 
## Call:
## glm(formula = Exito ~ AlimentoDiario, family = binomial, data = camarones)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -1.28965  -0.68424  -0.39705  -0.00008   2.00729  
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)
## (Intercept)    -35.1229    25.8776  -1.357    0.175
## AlimentoDiario   0.1194     0.0901   1.325    0.185
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 13.496  on 11  degrees of freedom
## Residual deviance: 11.311  on 10  degrees of freedom
## AIC: 15.311
## 
## Number of Fisher Scoring iterations: 5

Predicción para valores nuevos con el modelo ajustado

Representando la funcion logistica se calcula la probabilidad de fallo estimadas. Para eso se creará un vector de alimentos entre 250 y 350 kilos.

datos_nuevos <- data.frame(AlimentoDiario = seq(250, 300, 1))
datos_nuevos
##    AlimentoDiario
## 1             250
## 2             251
## 3             252
## 4             253
## 5             254
## 6             255
## 7             256
## 8             257
## 9             258
## 10            259
## 11            260
## 12            261
## 13            262
## 14            263
## 15            264
## 16            265
## 17            266
## 18            267
## 19            268
## 20            269
## 21            270
## 22            271
## 23            272
## 24            273
## 25            274
## 26            275
## 27            276
## 28            277
## 29            278
## 30            279
## 31            280
## 32            281
## 33            282
## 34            283
## 35            284
## 36            285
## 37            286
## 38            287
## 39            288
## 40            289
## 41            290
## 42            291
## 43            292
## 44            293
## 45            294
## 46            295
## 47            296
## 48            297
## 49            298
## 50            299
## 51            300

calculo de las nuevas probabilidades

probabilidades_nuevas <- predict(regresion, datos_nuevos, type="response")
probabilidades_nuevas
##           1           2           3           4           5           6 
## 0.005057235 0.005694741 0.006412092 0.007219149 0.008126955 0.009147866 
##           7           8           9          10          11          12 
## 0.010295693 0.011585859 0.013035568 0.014663985 0.016492425 0.018544562 
##          13          14          15          16          17          18 
## 0.020846632 0.023427652 0.026319639 0.029557817 0.033180821 0.037230872 
##          19          20          21          22          23          24 
## 0.041753922 0.046799751 0.052421995 0.058678083 0.065629069 0.073339313 
##          25          26          27          28          29          30 
## 0.081876000 0.091308444 0.101707168 0.113142702 0.125684103 0.139397160 
##          31          32          33          34          35          36 
## 0.154342290 0.170572147 0.188128986 0.207041842 0.227323661 0.248968480 
##          37          38          39          40          41          42 
## 0.271948870 0.296213806 0.321687180 0.348267152 0.375826503 0.404214109 
##          43          44          45          46          47          48 
## 0.433257569 0.462766946 0.492539476 0.522365017 0.552031926 0.581333034 
##          49          50          51 
## 0.610071349 0.638065168 0.665152328

Por defecto esta probabilidad se calcula como: $ log p_{i}/(1-p_{i}) $

colores[camarones$Exito == 1] <- "green"
colores[camarones$Exito == 0] <- "red"
plot(camarones$AlimentoDiario, camarones$Exito, pch=21, bg=colores,
     xlab="Cantidad de alimento diario", ylab="Probabilidades de éxito")
legend('bottomleft', c('Éxito', 'Sin éxito'), pch = 21, col = c('green', 'red'))
lines(datos_nuevos$AlimentoDiario, probabilidades_nuevas, col="blue", lwd=1)

Los datos pueden ser analizados en la siguiente gráfica

Descarga este código

xfun::embed_file("A4U1.Rmd")

Download A4U1.Rmd