Capítulo 5 Modelos lineales generalizados

En el capítulo anterior exploramos el modelo básico que nos permite responder a la pregunta: ¿puede ser la variable de interés predicha por un conjunto de variables explicativas?

Sin embargo, para poder utilizar dicho modelo, es necesario que la variable respuesta sea continua y cumpla las hipótesis estándar del modelo lineal (datos normales, varianza constante, etc.)

Si la variable de interés es, por ejemplo binaria podemos ajustar un modelo de regresión logística en donde lo que predecimos son las probabilidades de la ocurrencia del evento medido con la variable binaria.

En 1944, Berkson utilizó por primera vez la regresión logística como una forma de solucionar el problema de explicar una variable dicotómica a través de una variable continua. En este caso, la función logit hace que en lugar de trabajar con valores de la variable respuesta entre \((0, 1)\), trabajemos con una variable respuesta que puede tomar cualquier valor.

No fue hasta 1972 cuando John Nelder introdujo los modelos lineales generalizados (GLM por sus siglas en inglés), de ahí que en general se considere a la regresión logística como algo distinto a los GLM, cuando lo que ocurre es que tanto la regresión múltiple como la logística, de Poisson, ordinal, etcétera, son casos particulares de un GLM.

Para entender lo que es un GLM, volvamos al modelo de regresión múltiple, en este modelos suponemos que:

\[Y=\beta_{0}+\beta_{1}X_{1}+\beta_{2}X_{2}+\cdots+\beta_{k}X_{k}+\epsilon\]

\[E[Y]=\beta_{0}+\beta_{1}X_{1}+\beta_{2}X_{2}+\cdots+\beta_{k}X_{k}\]

Es decir, que existe una relación lineal entre las \(X\) y \(E[Y]\) (el valor medio de Y dado un cierto valor de las variables explicativas).

Si las observaciones son binarias, entonces:

\[P(Y = 1) = p\]

\[P(Y = 0) = 1-p\]

Y \(E[Y] = 0\times P(Y = 0) + 1 \times P(Y = 1) = p\), por lo tanto un modelo de regresión múltiple relacionará directamente la probabilidad de que ocurra un suceso con las variables explicativas, lo cual no es lo que se busca al ajustar un modelo de regresión lineal.

Lo que hacen los GLM es establecer esa relación lineal no entre la media de la variable respuesta y los predictores, sino entre una función de la media de variable respuesta y los predictores, es decir:

\[g(E[Y])=\beta_{0}+\beta_{1}X_{1}+\beta_{2}X_{2}+\cdots+\beta_{k}X_{k}\]

Según de qué tipo sea la varible \(Y\), así será la función \(g(\cdot)\).

Entonces se puede decir que un GLM tiene 3 componentes:

  • Componente aleatorio: La variable respuesta \(Y\) . Para poder utilizar un GLM, la distribución de \(Y\) ha de pertenecer a la familia exponencial, es decir, su función de densidad ha de poder escribirse como:

\[f(y;\theta,\phi)=exp\{\frac{y\theta-b(\theta)}{a(\phi)}+c(y,\phi)\}\]

donde \(a(\cdot)\), \(b(\cdot)\) y \(c(\cdot)\) son funciones específicas. El parámetro \(\theta\) es lo que se llama parámetro canónico de localización y \(\phi\) es un parámetro de dispersión. Pertenecen a la familia exponecial la distribución Normal, Bernouilli, Binomial, Poisson, Exponecial, Gamma, entre otras.

  • Componente sistemático: Las variables predictoras \(X_i \ \ i = 1,...,k\)

  • Función liga: La función que relaciona la media, \(E[Y]\), con las variables predictoras \(X\). En el caso del modelo de regresión ordinaria, \(\mu = \nu\), por lo tanto la función liga es la identidad.

Hay muchas opciones par la función liga. La función liga canonica es una función que transforma la media en el parámetro canónico \(\theta\)

\[g(E[Y])=\theta\]

Entoces \(g(\cdot)\) es la función liga canónica.

La siguiente tabla muestra las funciones link canónicas para las distribuciones más comunes usadas en los GLMs:

Distribución Liga canónica
Normal \(X \beta = E[Y]\) (identidad)
Binomial \(X \beta = ln(\frac{P}{1-P})\) (logística)
Poisson \(X \beta = ln(E[Y])\) (logarítmica)
Exponencial \(X \beta = \frac{1}{E[Y]})\) (recíproca)
Gamma \(X \beta = \frac{1}{E[Y]})\) (recíproca)

La diferencia que hay entre usar la función liga y usar una transformación, es que la función liga transforma la media, \(E[Y]\), y no los datos, \(Y\).

Los GLM generalizan la regresión ordinaria de dos modos: permitiendo que la variable de respuesta \(Y\) tenga distribuciones diferentes a la normal y, por otro lado, incluyendo distintas funciones liga de la media, lo cual resulta muy útil para datos categóricos.

5.1 Regresión logística

El modelo de regresión logistica es un GLM donde la distribución de probabilidad es Bernoulli o Binomial, y la función liga es el logit (ya que relaciona a la media, que en una Bernouilli es la probabilidad con el predictor lineal). Por lo tanto la estimación de los parámetros y los contrastes de hipótesis utilizan la teoría desarrollada para los GLMs.

Estos modelos se utilizan cuando se desea conocer la relación entre

  • Una variable dependiente cualitativa, dicotómica.
  • Una o más variables explicativas independientes, llamadas covariables ya sean cualitativas o cuantitativas

Por tanto, el objetivo de la regresión logística no es, como en regresión lineal, predecir el valor de la variable \(Y\) a partir de una o varias variables predictoras, sino que queremos predecir la probabilidad de que ocurra \(Y\) conocidos los valores de las variables \(X_i's\).

Recordemos que las covariables cualitativas deben transformarse en las covariables cualitativas dicotómicas ficticias necesarias (variables dummy). De manera que al hacer esta transformación cada categoría de la variable entrará en el modelo de forma individual.

5.2 Modelo de regresión logísitica simple

Para este modelo supondremos que nuestra respuesta, \(Y\), es explicada únicamente por una covariable, \(X\). Asumimos que la variable independiente \(Y\) está codificada como un 0 o un 1.

Entonces, escribimos nuestro modelo como:

\[ln(\frac{p}{1-p})=\beta_{0}+\beta_{1}X\] \[\frac{p}{1-p}=e^{\beta_{0}+\beta_{1}X}\] \[p=e^{\beta_{0}+\beta_{1}X}-p\times e^{\beta_{0}+\beta_{1}X}\] \[p(1+e^{\beta_{0}+\beta_{1}X})=e^{\beta_{0}+\beta_{1}X}\] \[p=\frac{e^{\beta_{0}+\beta_{1}X}}{1+e^{\beta_{0}+\beta_{1}X}}\]

Y:

\[1-p=\frac{1}{1+e^{\beta_{0}+\beta_{1}X}}\]

Los valores posibles de estas ecuaciones varían entre 0 y 1. Un valor cercano a 0 significa que es muy improbable que \(Y\) haya ocurrido, y un valor cercano a 1 significa que es muy probable que tuviese lugar.

Similar a regresión lineal los valores de los parámetros se estiman utilizando el método de máxima verosimilitud que selecciona los coeficientes que hacen más probable que los valores observados ocurran.

Para este análisis tenemos la razón de momios (odds ratio), que corresponde a la razón entre las posibilidades de respuesta.

\[OR=\frac{\frac{P(Y=1|X=1)}{1-P(Y=1|X=1)}}{\frac{P(Y=1|X=0)}{1-P(Y=1|X=0)}}\]

El valor nulo para la razón de momios es el 1. Un \(OR = 1\) implica que las dos categorías comparadas son iguales.

El valor mínimo posible es 0 y el máximo teóricamente posible es infinito.

Un OR inferior a la unidad se interpreta como que el desenlace es menos frecuente en la categoría o grupo que se ha elegido como de interés con respecto al otro grupo o categoría de referencia. Un OR = 3 se interpreta como una ventaja 3 veces superior de una de las categorías \(X = 1\) relativamente a la otra categoría \(X=0\).

5.3 Modelo de regresión logísitica multiple

Análogo a lo que observamos en los modelos de regresión lineal, el modelo de regresión logística se puede facilmente generalizar de un modelo simple a un múltiple.

\[ln(\frac{p}{1-p})=\beta_{0}+\beta_{1}X_1+\beta_{2}X_{2}+...\beta_{k}X_{k}\] \[p=P(Y)=\frac{1}{1+e^{-(\beta_{0}+\beta_{1}X_1+\beta_{2}X_{2}+...\beta_{k}X_{k})}}\]

De nuevo los valores posibles de estas ecuaciones varían entre 0 y 1.

El propósito del análisis es predecir la probabilidad de que un evento \(Y\) ocurra para el \(i-eismo\) individuo. Para dicha \(i-ésima\) persona, \(Y\) será 0 (la respuesta no ocurre) o 1 (la respuesta ocurre), y el valor predicho, \(\mathbb{P}(Y)\), tendrá un valor 0 (no hay probabilidad de que el resultado ocurra) o 1 (el resultado seguro que ocurre).

5.3.1 Regresión logística simple en R

En el siguiente ejercicio se busca analizar si los productos salen o no defectuosos de acuerdo de la temperatura de la máquina que los produce.

Los datos son los siguientes:

temperatura <-c(66,70,69,68,67,72,73,70,57,63,70,78,67,53,67,75,70,81,76,79,75,76,58)
defecto <-c( 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1)

Con ambos vectores construimos un dataframe:

datos <- data.frame(temperatura = temperatura, defecto = defecto)
rm(temperatura, defecto)

Resumen visual de los datos:

colores <- NULL
colores[datos$defecto == 0] <- "green"
colores[datos$defecto == 1] <- "red"
plot(datos$temperatura, datos$defecto, 
     pch = 21, bg = colores, xlab = "Temperatura", 
     ylab = "Prob.defecto")
legend("bottomleft", c("No defecto", "Si defecto"), 
       pch = 21, col = c("green", "red"))

Creamos el modelo de regresión logística (modelo de regresión lineal generalizado y parametrizamos por familia binomial).

reg <- glm(defecto ~ temperatura, data = datos, family = binomial)

Tabla resumen:

summary(reg)
## 
## Call:
## glm(formula = defecto ~ temperatura, family = binomial, data = datos)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -0.84513  -0.38010  -0.09632  -0.02831   2.41364  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)  
## (Intercept)  32.3381    17.6301   1.834   0.0666 .
## temperatura  -0.5028     0.2643  -1.902   0.0571 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 24.0850  on 22  degrees of freedom
## Residual deviance:  9.8032  on 21  degrees of freedom
## AIC: 13.803
## 
## Number of Fisher Scoring iterations: 7

Creamos una nueva variable al dataframe de nuestros datos con las probabilidades de pertenencia a la clase 1 predichas por el modelo.

datos$predict<-reg$fitted.values

Dibujamos la recta de probabilidad para cada una de las temperaturas:

datos_probab <- data.frame(temperatura = seq(50, 85, 0.1))

datos.predict <- predict(reg, datos_probab, type = "response")  


plot(datos$temperatura, datos$defecto, pch = 21, bg = colores,  xlab = "Temperatura", ylab = "Prob.defecto")
legend("bottomleft", c("No defecto", "Si defecto"), 
       pch = 21, col = c("green", "red"))
lines(datos_probab$temperatura, datos.predict, 
      col = "blue", lwd = 2)

Bondad de Ajuste:

dev <- reg$deviance
nullDev <- reg$null.deviance
modelChi <- nullDev - dev
modelChi
## [1] 14.28173
chidf <- reg$df.null - reg$df.residual
chisq.prob <- 1 - pchisq(modelChi, chidf)
chisq.prob
## [1] 0.0001573848

chisq.prob es el p-value de la estadística “modelChi”, para valores pequeños se dice que el modelo es estadisticamente significativo.

5.3.2 Ejercicio.

Se tiene la siguiente tabla donde se eligen varios niveles de ronquidos y se ponen en relación con una enfermedad cardíaca. Se toman como puntuaciones relativas de ronquidos los valores \(\{0, 2, 4, 5\}\).

Ronquido Presencia de enfermedad cardiaca Ausencia de enfermedad cardiaca
Nunca 24 1355
Ocasional 35 603
Casi cada noche 21 192
Cada noche 30 224

Fijamos los niveles de manera ordinal:

roncas <-  c(0, 2, 4, 5)

frecuencia <-  cbind (SI=c(24 , 35, 21, 30) , NO=c (1355 ,603 , 192 , 224))

logit.irls <- glm( frecuencia~roncas , family = binomial ( link = logit ))

summary ( logit.irls )$ coefficients
##               Estimate Std. Error    z value      Pr(>|z|)
## (Intercept) -3.8662481 0.16621436 -23.260614 1.110885e-119
## roncas       0.3973366 0.05001066   7.945039  1.941304e-15

El modelo queda de la siguiente forma:

\[ln(\frac{p}{1-p})=-3.87+.40X\]

Como \(\beta = 0.40 > 0\) entonces la probabilidad de ataque cardíaco aumenta cuando los niveles de ronquidos se incrementan.

Con un nivel de ronquido \(X=0\) obtenemos:

\[ln(\frac{p}{1-p})=-3.87\] y

p <- exp(-3.87)/(1+exp(-3.87))

print(p)
## [1] 0.02043219

La probabilidad de tener la enfermedad es 2.04%.

Mientras que si \(X=5\) obtenemos:

\[ln(\frac{p}{1-p})=-3.87+.40*5=-1.87\] y

p <- exp(-1.87)/(1+exp(-1.87))

print(p)
## [1] 0.1335417

La probabilidad de tener la enfermedad aumenta a 13.35%.

  • Calcular la probabilidad de presentar la enfermedad cardíaca cuando el nivel de ronquido es Ocasional.

  • ¿Cuántas veces más probable es la ocurrencia de la enfermedad cardíaca cuando el nivel de ronquidos es cada noche en comparación con ocasional?

5.3.3 Regresión logística múltiple en R

Los datos corresponden a información sobre la respuesta a anuncios en redes sociales, se tienen datos de género, edad, salario de los individuos asi como la información de si se realizó o no la compra del producto anunciado.

datos <- read.csv("example_data/social_network_ads.csv", header = TRUE)

Descriptivos básicos de los datos:

str(datos)
## 'data.frame':	400 obs. of  5 variables:
##  $ User.ID        : int  15624510 15810944 15668575 15603246 15804002 15728773 15598044 15694829 15600575 15727311 ...
##  $ Gender         : chr  "Male" "Male" "Female" "Female" ...
##  $ Age            : int  19 35 26 27 19 27 27 32 25 35 ...
##  $ EstimatedSalary: int  19000 20000 43000 57000 76000 58000 84000 150000 33000 65000 ...
##  $ Purchased      : int  0 0 0 0 0 0 0 1 0 0 ...
summary(datos)
##     User.ID            Gender               Age        EstimatedSalary 
##  Min.   :15566689   Length:400         Min.   :18.00   Min.   : 15000  
##  1st Qu.:15626764   Class :character   1st Qu.:29.75   1st Qu.: 43000  
##  Median :15694342   Mode  :character   Median :37.00   Median : 70000  
##  Mean   :15691540                      Mean   :37.66   Mean   : 69743  
##  3rd Qu.:15750363                      3rd Qu.:46.00   3rd Qu.: 88000  
##  Max.   :15815236                      Max.   :60.00   Max.   :150000  
##    Purchased     
##  Min.   :0.0000  
##  1st Qu.:0.0000  
##  Median :0.0000  
##  Mean   :0.3575  
##  3rd Qu.:1.0000  
##  Max.   :1.0000

Resumen de cuantos elementos hay en cada caso para la variable de compra del producto:

table(datos$Purchased)
## 
##   0   1 
## 257 143

Creación del modelo de regresión logística(modelo de regresión lineal generalizado y parametrizamos por binomial) aplicando a datos[,-1] estamos dejando fuera la variable “User.ID”:

modelo <- glm(Purchased ~ ., data = datos[,-1], family = binomial)
summary(modelo)
## 
## Call:
## glm(formula = Purchased ~ ., family = binomial, data = datos[, 
##     -1])
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.9109  -0.5218  -0.1406   0.3662   2.4254  
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)     -1.278e+01  1.359e+00  -9.405  < 2e-16 ***
## GenderMale       3.338e-01  3.052e-01   1.094    0.274    
## Age              2.370e-01  2.638e-02   8.984  < 2e-16 ***
## EstimatedSalary  3.644e-05  5.473e-06   6.659 2.77e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 521.57  on 399  degrees of freedom
## Residual deviance: 275.84  on 396  degrees of freedom
## AIC: 283.84
## 
## Number of Fisher Scoring iterations: 6

Bondad de ajuste:

dev <- modelo$deviance
nullDev <- modelo$null.deviance
modelChi <- nullDev - dev
modelChi
## [1] 245.7297
chidf <- modelo$df.null - modelo$df.residual
chisq.prob <- 1 - pchisq(modelChi, chidf)
chisq.prob
## [1] 0

El modelo queda de la siguiente forma:

\[ln(\frac{p}{1-p})=-12.78+.33*Genero+.237*Edad+0.000036*Salario\]

La prueba Ji-Cuadrada para la significancia del modelo da un p-value de cero, por lo tanto el modelo propuesto con las variables de género, edad y salario resulta ser significativo.

Agregamos a los datos la columna de probabilidad de compra calculada con nuestro modelo:

datos <- cbind(datos, modelo$fitted.values)
plot(modelo$fitted.values, col = as.factor(datos$Gender),
     main="Probabilidad de compra por género",
     ylab="probabilidad de compra")

plot(modelo$fitted.values, datos$Age, col = as.factor(datos$Gender),
     main="Probabilidad de compra vs edad coloreado por edad",
     xlab="probabilidad de compra",ylab="edad")

plot(modelo$fitted.values, datos$EstimatedSalary,
     main="Probabilidad de compra vs salario",
     xlab="probabilidad de compra",ylab="salario")

Observamos que de las 3 variables consideradas, la que parece tener más efecto en la probabilidad de compra es la edad.

Veamos ahora algunas probabilidades. Según nuestro modelo ¿cuál es la probabilidad de compra de una mujer 55 años con salario de 80,000?

1/(1+exp(-(-12.78+.33*0+.237*55+0.000036*80000)))
## [1] 0.9583136

¿Y el de una mujer de 35 años con el mismo salario?

1/(1+exp(-(-12.78+.33*0+.237*35+0.000036*80000)))
## [1] 0.167284

Mientrás que la probabilidad de compra de una mujer de 55 años con salario de 80,000 es \(96\%\) una mujer con el mismo salario pero 20 años mas joven tendrá una probabilidad de sólo \(17\%\) de comprar el producto anunciado.

  • Calcular la probailidad de que un hombre de 45 años con salario de 50,000 compre el producto anunciado.

  • ¿Cuántas veces más probable es que un hombre de 45 años con salario de 100,000 compre el producto que un hombre de la misma edad pero con salario de 50,000?

5.4 Regresión Multinomial

Hasta ahora hemos revisado el caso en el que la variable respuesta era dicotómica. Ahora nos centramos en el caso en el que la variable de interés tiene más de dos categorías, por ejemplo, afiliación política; resultado de un partido de fútbol; marcas de teléfonos celulares, etc.

Por simplicidad, se ilustrará la metodología para el caso de tres categorías, ya que la generalización a más de tres es inmediata.

Supongamos que codificamos las tres categorías de la variable respuesta como 0, 1 y 2. En el caso de regresión logística, el logit es:

\[ln(\frac{p}{1-p})=ln(\frac{P[Y=1]}{P[Y=0]})\]

Ahora el modelo necesita dos funciones logit ya que tenemos tres categorías, y necesitamos decidir que categorías queremos comparar. Lo más general es utilizar \(Y = 0\) como referencia y formar logits comparándola con \(Y = 1\) y \(Y = 2\).

Supongamos que tenemos k variables explicativas, entonces:

\[ln(\frac{P[Y=1]}{P[Y=0]})=\beta_{10}+\beta_{11}X_1+\beta_{12}X_{2}+...\beta_{1k}X_{k}\] \[ln(\frac{P[Y=2]}{P[Y=0]})=\beta_{20}+\beta_{21}X_1+\beta_{22}X_{2}+...\beta_{2k}X_{k}\]

Y ahora tenemos el doble de coeficientes que en el caso de regresión logística.

Las probabilidades se calcularán como:

\[P[Y=0|X]=\frac{1}{1+e^{g_1(X)}+e^{g_2(X)}}\] \[P[Y=1|X]=\frac{e^{g_1(X)}}{1+e^{g_1(X)}+e^{g_2(X)}}\] \[P[Y=2|X]=\frac{e^{g_2(X)}}{1+e^{g_1(X)}+e^{g_2(X)}}\] \[g_1(X)=\beta_{10}+\beta_{11}X_1+\beta_{12}X_{2}+...\beta_{1k}X_{k}\] \[g_2(X)=\beta_{20}+\beta_{21}X_1+\beta_{22}X_{2}+...\beta_{2k}X_{k}\]

5.4.1 Regresión Multinomial en R

Datos “rh_satisfaction” corresponde a información del área de recursos humanos de una empresa que mide el nivel de satisfacción de sus empleados (en escala de 1 a 5).

También se tiene algunas características de los empleados (edad, area, salario, etc). El primer análisis a realizar que queremos analizar es la satisfacción de los empleados a través del salario y la edad. Para ello aplicaremos primero una regresión para cada variable por separado y posteriormente un modelo con ambas.

La función para realizar la regresión multinomial es multinom, la cual es similar a la de los comandos para regresión logística. Esta función está en la librería nnet.

Cargamos la libreria y los datos:

library(nnet)

datos <- read.csv("example_data/hr_satisfaction.csv", header=TRUE)

Ajustemos el modelo de regresión multinominal para la satisfacción de los empleados con la variable de salario.

multi1 <- multinom(satisfied~salary, data = datos)
## # weights:  15 (8 variable)
## initial  value 804.718956 
## iter  10 value 801.134736
## final  value 800.932439 
## converged
print(multi1)
## Call:
## multinom(formula = satisfied ~ salary, data = datos)
## 
## Coefficients:
##   (Intercept)       salary
## 2  -0.1080096 3.069240e-06
## 3  -0.2193869 2.708006e-06
## 4  -0.1515928 6.556397e-06
## 5  -0.4102788 1.026791e-05
## 
## Residual Deviance: 1601.865 
## AIC: 1617.865

Tenemos entonces 4 ecuaciones y el análisis está tomando la categoría 1 como la base para construir los modelos logit como vimos en la teoría.

Uno de los usos de este modelo puede ser el calcular probabilidades especifícas para ciertos niveles de satisfacción que sean de interés. Por ejemplo la probabilidad de que un empleado con salario de 50,000 (la media es 50,416.06) esté muy satisfecho en la empresa es \(21\%\) y se calcula de la siguiente forma:

s <- 50000

denom <- 1+exp(-0.108+.0000031*s)+exp(-0.219+.0000027*s) + exp(-0.152+.0000066*s)+exp(-0.410+.0000103*s)

exp(-0.410+.0000103*s)/denom
## [1] 0.2106376

Mientras que la probabilidad de que este empleado esté completamente insatisfecho será:

1/denom
## [1] 0.1896422

Ahora ajustemos el modelo de regresión multinominal para la satisfacción de los empleados con la variable de edad.

multi2 <- multinom(satisfied~age, data = datos)
## # weights:  15 (8 variable)
## initial  value 804.718956 
## iter  10 value 798.978325
## final  value 798.956315 
## converged
multi2
## Call:
## multinom(formula = satisfied ~ age, data = datos)
## 
## Coefficients:
##   (Intercept)          age
## 2  -0.0680823  0.002780933
## 3  -0.4380887  0.008846122
## 4   0.6359941 -0.011962449
## 5   1.1775667 -0.028143304
## 
## Residual Deviance: 1597.913 
## AIC: 1613.913

La probabilidad de que un empleado de edad 40 años esté muy satisfecho en la empresa es 20% y se calcula de la siguiente forma:

e <- 40

denom <- 1+exp(-0.068+.0028*e)+exp(-0.438+.0088*e) + exp(0.636-.0120*e)+exp(1.178-.0281*e)

exp(1.178-.0281*e)/denom
## [1] 0.2034909

Finalmente ajustamos el modelo de regresión con las variables explicativas de salario y edad.

multi3 <- multinom(satisfied~salary+age, data = datos)
## # weights:  20 (12 variable)
## initial  value 804.718956 
## iter  10 value 799.192997
## final  value 797.372424 
## converged
multi3
## Call:
## multinom(formula = satisfied ~ salary + age, data = datos)
## 
## Coefficients:
##   (Intercept)       salary          age
## 2  -0.2315138 3.109419e-06  0.003091909
## 3  -0.5872992 2.836453e-06  0.009138518
## 4   0.2954069 6.368488e-06 -0.011320961
## 5   0.6390753 9.838360e-06 -0.027078238
## 
## Residual Deviance: 1594.745 
## AIC: 1618.745

Con este modelo entonces podemos calcular la probabilidad de que un empleado de edad 25 años esté muy satisfecho en la empresa es \(27\%\) y se calcula de la siguiente forma:

e <- 25
s <- 50000

denom <- 1+exp(-0.232+.0000031*s+0.003*e)+exp(-0.587+.0000028*s+0.009*e) + exp(0.295+.0000063*s-0.011*e)+exp(0.640+.0000098*s-0.027*e)

exp(0.640+.0000098*s-0.027*e)/denom
## [1] 0.2730235

Mientras que la probabilidad de estar completamente insatisfecho será:

1/denom
## [1] 0.1732192
  • Calcular la probabilidad de un empleado de 50 años con salario de 65,000 asigne un nivel de satisfacción de 3.

  • Ajustar un modelo con las variables de salario y educación.

  • Calcular la probabilidad de que un empleado con estudios de postgrado con salario de 65,000 este completamente satisfecho con la empresa.

  • Si quisiera analizar la satisfacción por departamento ¿qué procedimiento propondría usar?

5.5 Modelos para conteos

En muchos casos las variables respuesta son conteos, y en ocasiones estos recuentos aparecen al resumir en tablas de contingencia otras variables.

Hay cuatro razones por las que sería erroneo utlizar un modelo de regresión normal para datos de conteo :

  • Puede dar lugar a predicciones negativas.
  • La varianza de la variable respuesta no es independiente de la media.
  • Los errores no siguen una distribución Normal.
  • Los ceros que aparecen en la variable respuesta dan problemas a la hora de transformar la variables.

Sin embargo, si la variable es de conteo pero los datos toman valores elevados, entonces si podría ser posible utilizar la distribución Normal.

El modelo más simple para cuando la variable de respuesta son recuentos es asumir que el componente aleatorio \(Y\) sigue una distribución de Poisson. Esta distribución es unimodal y su propiedad más destacada es que la media y la varianza coinciden.

\[E(Y)=Var(Y)=\mu\]

De modo que cuando el número de recuentos es mayor en media, también tienden a tener mayor variabilidad.

La principal diferencia entre la distribución de Poisson y la Binomial, es que, aunque ambas cuentan el número de veces que ocurre algo, en la distribución de Poisson no sabemos cuántas veces no ocurrio, y en la Binomial sí lo sabemos.

Supongamos que estamos haciendo un estudio sobre cuantas larvas de insectos hay en ciertos árboles, los datos de los que disponemos corresponden al número de larvas por hoja \((Y)\). Habrá hojas que no tengan ninguna, y otras que tenga hasta 5 ó 6. Si el número medio de larvas por hoja es \(\mu\), la probabilidad de observar \(y_0\) larvas por hoja viene dada por la siguiente ecuación:

\[P(y_0)=\frac{e^{\mu}\mu^{y_0}}{y_0!}\]

Donde \(\mu\) se puede aproximar con \(\mu=np\), para \(n\) grande y \(p\) pequeño. Es decir, que una distribución de Poisson se obtiene a partir de una Binomial con \(p\) pequeño y \(n\).

Entonces el modelo GLM para los conteos se basará en modelar la relación entre la media muestral \(\mu\) y las variables explicativas.

\[\mu=\beta_{0}+\beta_{1}X_{1}+\beta_{2}X_{2}+\cdots+\beta_{k}X_{k}\]

Por las características de la variable (son conteos) buscamos que la parte derecha de la ecuación sólo tome valores positivos. Por esta razón habitualmente se usa el logaritmo de la media como la función liga, de modo que el modelo log-lineal se puede expresar como:

\[log(\mu) = log(E[Y])=\beta_{0}+\beta_{1}X_{1}+\beta_{2}X_{2}+\cdots+\beta_{k}X_{k}\]

de modo que al despejar \(\mu\) obtenemos:

\[\mu = e^{\beta_{0}+\beta_{1}X_{1}+\beta_{2}X_{2}+\cdots+\beta_{k}X_{k}}\]

5.5.1 Sobredispersión en GLM Poisson

En una distribución de Poisson, la media y la varianza son iguales, pero en la práctica, los datos de conteo muestran mayor variabilidad de la que se espera en un modelo binomial o Poisson. En el caso de este último, es común que la varianza sea mucho mayor que la media \(\mathbb{V}\left(Y\right)>>\mathbb{E}\left(Y\right)=\mu\), este fenómeno se conoce como sobredispersión.

Por ejemplo, podemos suponer que cada individuo tienen igual probabilidad de padecer cierta enfermedad; no obstante, siendo más realistas, es claro que que estas probabilidades varían debido a factores genéticos, de salubridad y de localización geográfica, entre otros, propiciando mayor variabilidad sobre el número de sujetos enfermos en un periodo determinado, que los que puede predecir el modelo Poisson asociado.

Una forma de medir la sobredispersión en los datos es ajustando una distribución quasipoisson, la cual ajustará el modelo con distribución Poisson pero no asumirá varianza igual a la media y calculará el parámetro de dispersión.

5.5.2 GLM Poisson R

Entre los cangrejos cacerola se sabe que cada hembra tiene un macho en su nido, pero puede tener más machos concubinos. Considerando que deseamos relacionar la variable respuesta, el número de concubinos, con las variables explicativas son: color, estado de la espina central, peso y anchura del caparazón, procederemos a ajustar un modelo lineal a los datos.

En un primer análisis sólo consideramos la anchura del caparazón como variable explicativa.

tabla <- read.csv ( "http://www.hofroe.net/stat557/data/crab.txt" , header =TRUE, sep = "\t" )

plot.tabla <-  aggregate (rep (1,nrow (tabla)), list (Sa= tabla$Satellite , W=tabla$Width), sum)

plot(tabla$Width,tabla$Satellite, xlab="Ancho de caparazón", ylab="Número de Concubinos", bty="L", axes = FALSE, type ="n")
axis (2, at =1:15)
axis (1, at=seq (20 , 34, 2))
text (y= plot.tabla$Sa , x= plot.tabla$W, labels = plot.tabla$x)

Ahora agruparemos los datos según cortes específicos en la variable de ancho de caparazón (Width) para poder ver visualmente el ajuste del modelo de regresión.

Discretizamos el ancho del caparazón

tabla$W.fac = cut( tabla$Width , breaks =c(0, seq (23.25 , 29.25), Inf ))

Calculamos el numero medio de concubinos para cada categoria según el ancho del caparazón:

plot.y <- aggregate ( tabla$Satellite , by= list (W= tabla$W.fac), mean )$x

Determinamos la media del ancho del caparazon por categoría:

plot.x <- aggregate ( tabla$Width , by = list (W= tabla$W.fac ), mean )$x

Representamos las medias de anchura y la media del numero de concubinos:

plot (x = plot.x , y = plot.y , ylab = " Numero de Concubinos ", xlab = " Anchura (cm) ", bty = "L", axes = FALSE, type = "p", pch = 16)
axis(2, at =0:5)
axis(1, at=seq (20 , 34, 2))

En este caso podemos observar una relación lineal entre la media del número de concubinos y la media del ancho del caparazón por categoría.

Ahora ajustamos el modelo lineal entre el número de concubinos y el ancho del caparazón definiendo una función de distribución Poisson.

m1 <- glm(Satellite~Width , family = poisson , data = tabla )

summary( m1 )
## 
## Call:
## glm(formula = Satellite ~ Width, family = poisson, data = tabla)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.8526  -1.9884  -0.4933   1.0970   4.9221  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -3.30476    0.54224  -6.095  1.1e-09 ***
## Width        0.16405    0.01997   8.216  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 632.79  on 172  degrees of freedom
## Residual deviance: 567.88  on 171  degrees of freedom
## AIC: 927.18
## 
## Number of Fisher Scoring iterations: 6

Recordando que para medir el ajuste del modelo utilizamos la devianza, en donde la devianza nula es la desviación para el modelo que no depende de ninguna variable. Miéntras que la devianza residual es la diferencia entre la desviación del modelo que no depende de ninguna variable menos la del modelo que incluye a la variable “Width”. La diferencia entre ambas se distribuirá como una distribución Ji-cuadrada con 1 grado de libertad.

Bondad de Ajuste:

dev <- m1$deviance
nullDev <- m1$null.deviance
modelChi <- nullDev - dev
modelChi
## [1] 64.91309
chisq.prob <- 1 - pchisq(modelChi, 1)
chisq.prob
## [1] 7.771561e-16

Se puede rechazar claramente la hipótesis nula. Por lo que concluimos que hay un aportación significativa de la variable de ancho del caparazón al modelo del número de concubinos.

El modelo queda de la siguiente forma:

\[ln(\mu)=-3.30+0.16*Width\]

Y los valores estimados por el modelo se pueden encontrar en m1$fitted.values. Y se puede predecir la media del números de concubinos para un valor de ancho de caparazón dado, por ejemplo, para una anchura igual a 26.3:

predict.glm ( m1 , type = "response", newdata = data.frame( Width = 26.3 ))
##        1 
## 2.744581

Entonces siguiendo este modelo, decimos que los cangrejos hembra con ancho de caparazón del 26.3cm tienen en promedio 2.7 parejas.

Podriamos ajustar ahora el modelo con las variables de peso, color y estado de la espina. Se deja al lector el ejercicio de utilizando el algoritmo stepAIC encontrar el mejor modelo para el número de concubinos.

5.6 GLM binomial negativa

Una distribución que puede usarse como alternativa a una Poisson es la . Dado que su varianza es más grande que su media, constituye una excelente alternativa para modelar datos de conteo sobredispersos, que son muy comunes en aplicaciones reales.

Si una variable aleatoria \(Y\) se distribuye como una binomial negativa, entonces la función de probabilidad es:

\[P(y|k,\mu)=\frac{\Gamma(y+k)}{\Gamma(k)\Gamma(y+1)}\left( \frac{k}{\mu+k} \right)^k\left( 1-\frac{k}{\mu+k} \right)^y\]

con \(y=0,1,2,...\) donde \(k\) y \(\mu\) son los parámetros de la distribución y se tiene que

\[E(Y)=\mu\]

\[Var(Y)=\mu+\frac{\mu^2}{k}\]

El parámetro \(\frac{1}{k}\) es un parámetro de dispersión, de modo que si \(\frac{1}{k} \rightarrow 0\) entonces \(Var(Y)\rightarrow \mu\) y la distribución binomial negativa converge a una distribución Poisson.

Por otro lado, para un valor fijo de \(k\) esta distribución pertenece a la familia exponencial natural, de modo que se puede definir un modelo GLM binomial negativo. En general, se usa una función liga de tipo logaritmo.

La regresión binomial negativa se puede utilizar para datos sobredispersos de recuentos, es decir cuando la varianza condicional es mayor que la media condicional. Se puede considerar como una generalización de la regresión de Poisson, ya que tiene su misma estructura de medias y además un parámetro adicional para el modelo de sobredispersión.

Si la distribución condicional de la variable observada es más dispersa, los intervalos de confianza para la regresión binomial negativa es probable que sean más estrechos que los correspondientes a un modelo de regresión de Poisson.

5.6.1 GLM Binomial Negativa en R

Usando los mismos datos de los cangrejos ahora ajustaremos un modelo con distribución binomial negativa:

require( MASS )

m2 <-  glm.nb(Satellite~Width , data = tabla )

summary( m2 )
## 
## Call:
## glm.nb(formula = Satellite ~ Width, data = tabla, init.theta = 0.90456808, 
##     link = log)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.7798  -1.4110  -0.2502   0.4770   2.0177  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -4.05251    1.17143  -3.459 0.000541 ***
## Width        0.19207    0.04406   4.360  1.3e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(0.9046) family taken to be 1)
## 
##     Null deviance: 213.05  on 172  degrees of freedom
## Residual deviance: 195.81  on 171  degrees of freedom
## AIC: 757.29
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  0.905 
##           Std. Err.:  0.161 
## 
##  2 x log-likelihood:  -751.291

En este caso el modelo queda de la siguiente forma:

\[ln(\mu)=-4.05+0.19*Width\]

Observamos que tanto la devianza como el coeficiente de Akaike son menores en comparación con el modelo que usa una distribución Poisson.

Adicionalmente habiamos visto que los datos indicaban que la varianza era poco mas de tres veces la media. Por estas razones para este ejemplo se puede decir que un modelo con distribución binomial negativa es mas adecuado.

5.6.2 Ejercicio

La base de datos “productos.csv” contiene información sobre el número de productos financieros que posee cada cliente, adicional a esa información se tiene la edad, género, número de ofertas, antigüedad y el número de créditos que tiene. Deseamos obtener información respecto a la relación entre el número de productos y el resto de las variables que nos permitan incrementar la venta de productos.

  • Ajustar un modelo al número de productos financieros en función de la edad del cliente.

  • Asumiendo una distribución Poisson

  • Calcular con la distribución quasiPoisson el valor del parámetro de dispersión para estos datos.

  • ¿Qué puede concluir de este modelo?

  • ¿Valdrá la pena cambiar a una distribución binomial negativa?

  • Encontrar el mejor modelo que explique el número de productos financieros a partir de todas las variables disponibles.

  • ¿Qué recomendación puede dar al área de mercadotecnia que esta buscando incrementar el número de productos por cliente?

5.7 Exponencial

Se dice que la variable respuesta \(Y\) es de tipo Exponencial cuando hemos observado el tiempo transcurrido hasta que ocurre un evento de interés como resultado de un conjunto de variables predictoras que pueden ser de tipo numérico o categórico. En este caso similar al caso de conteos también se asume que \(Y\) sólo toma valores positivos y es continua.

En este caso la función liga utilizada es el recíproco, de modo que el modelo lineal se puede expresar como:

\[\frac{1}{E[Y]}=\beta_{0}+\beta_{1}X_{1}+\beta_{2}X_{2}+\cdots+\beta_{k}X_{k}\]

5.7.1 GLM Exponencial en R

Los datos de este ejemplo corresponden a la información de un banco qué busca entender la transición de sus clientes hacia un estado de alto riesgo de crédito. Con la finalidad de entender mejor el momento en que el cliente pasa a un estado de alto riesgo crediticio por falta de pago, el banco hizo un seguimiento a una muestra representativa de sus clientes.

Deseamos identificar cuáles de las características de los clientes influyen en la transición de un estado de bajo riesgo a alto riesgo.

datos <- read.csv("example_data/default.csv", header=TRUE)

Breve análisis exploratorio:

str(datos)
## 'data.frame':	1000 obs. of  17 variables:
##  $ duration              : int  6 48 12 42 24 36 24 36 12 30 ...
##  $ credit_history        : chr  "critical/other existing credit" "existing paid" "critical/other existing credit" "existing paid" ...
##  $ purpose               : chr  "radio/tv" "radio/tv" "education" "furniture/equipment" ...
##  $ credit_amount         : int  1169 5951 2096 7882 4870 9055 2835 6948 3059 5234 ...
##  $ installment_commitment: int  4 2 2 2 3 2 3 2 2 4 ...
##  $ personal_status       : chr  "male single" "female div/dep/mar" "male single" "male single" ...
##  $ residence_since       : int  4 2 3 4 4 4 4 2 4 2 ...
##  $ property_magnitude    : chr  "real estate" "real estate" "real estate" "life insurance" ...
##  $ age                   : int  67 22 49 45 53 35 53 35 61 28 ...
##  $ other_payment_plans   : chr  "none" "none" "none" "none" ...
##  $ housing               : chr  "own" "own" "own" "for free" ...
##  $ existing_credits      : int  2 1 1 1 2 1 1 1 1 2 ...
##  $ job                   : chr  "skilled" "skilled" "unskilled resident" "skilled" ...
##  $ num_dependents        : int  1 1 2 2 2 2 1 1 1 1 ...
##  $ own_telephone         : chr  "yes" "none" "none" "none" ...
##  $ foreign_worker        : chr  "yes" "yes" "yes" "yes" ...
##  $ default               : int  0 1 0 0 1 0 0 0 0 1 ...
summary(datos)
##     duration    credit_history       purpose          credit_amount  
##  Min.   : 4.0   Length:1000        Length:1000        Min.   :  250  
##  1st Qu.:12.0   Class :character   Class :character   1st Qu.: 1366  
##  Median :18.0   Mode  :character   Mode  :character   Median : 2320  
##  Mean   :20.9                                         Mean   : 3271  
##  3rd Qu.:24.0                                         3rd Qu.: 3972  
##  Max.   :72.0                                         Max.   :18424  
##  installment_commitment personal_status    residence_since
##  Min.   :1.000          Length:1000        Min.   :1.000  
##  1st Qu.:2.000          Class :character   1st Qu.:2.000  
##  Median :3.000          Mode  :character   Median :3.000  
##  Mean   :2.973                             Mean   :2.845  
##  3rd Qu.:4.000                             3rd Qu.:4.000  
##  Max.   :4.000                             Max.   :4.000  
##  property_magnitude      age        other_payment_plans   housing         
##  Length:1000        Min.   :19.00   Length:1000         Length:1000       
##  Class :character   1st Qu.:27.00   Class :character    Class :character  
##  Mode  :character   Median :33.00   Mode  :character    Mode  :character  
##                     Mean   :35.55                                         
##                     3rd Qu.:42.00                                         
##                     Max.   :75.00                                         
##  existing_credits     job            num_dependents  own_telephone     
##  Min.   :1.000    Length:1000        Min.   :1.000   Length:1000       
##  1st Qu.:1.000    Class :character   1st Qu.:1.000   Class :character  
##  Median :1.000    Mode  :character   Median :1.000   Mode  :character  
##  Mean   :1.407                       Mean   :1.155                     
##  3rd Qu.:2.000                       3rd Qu.:1.000                     
##  Max.   :4.000                       Max.   :2.000                     
##  foreign_worker        default   
##  Length:1000        Min.   :0.0  
##  Class :character   1st Qu.:0.0  
##  Mode  :character   Median :0.0  
##                     Mean   :0.3  
##                     3rd Qu.:1.0  
##                     Max.   :1.0

Selección de observaciones en donde si hubo falta de pago:

datos <- datos[datos$default==1,]

Construcción de la variable del tiempo transcurrido al default:

datos$meses_default <- datos$duration-datos$installment_commitment

hist(datos$meses_default)

Lo primero será ajustar un modelo que explique el tiempo en que occure la falta de pago en función de la variable tenencia de teléfono propio.

N.B. La distribución exponencial es un caso particular de la distribución gamma y por esa razón en la función glm sólo aparece la familia Gamma

m1 <- glm(meses_default ~ own_telephone, data = datos, family = Gamma)

summary(m1)
## 
## Call:
## glm(formula = meses_default ~ own_telephone, family = Gamma, 
##     data = datos)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.7845  -0.6226  -0.1556   0.2734   1.5773  
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       0.049933   0.002235   22.34  < 2e-16 ***
## own_telephoneyes -0.009344   0.003234   -2.89  0.00414 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Gamma family taken to be 0.374624)
## 
##     Null deviance: 123.08  on 299  degrees of freedom
## Residual deviance: 120.01  on 298  degrees of freedom
## AIC: 2327.4
## 
## Number of Fisher Scoring iterations: 5

Bondad de ajuste:

dev <- m1$deviance
nullDev <- m1$null.deviance
modelChi <- nullDev - dev
modelChi
## [1] 3.07052
chidf <- m1$df.null - m1$df.residual
chisq.prob <- 1 - pchisq(modelChi, chidf)
chisq.prob
## [1] 0.07972398

La prueba de bondad de ajuste da una probabilidad de \(7\%\) que es menor al \(10\%\) y puede considerarse suficiente para decir que el modelo con esta variable si aporta información estadísticamente significativa.

El modelo queda de la siguiente forma:

\[\frac{1}{E(Y)}=0.050-0.009*TeléfonoPropio\]

Con este modelo podriamos calcular, en promedio, en cuantos meses de iniciado el crédito se presentará el no pago en función de si el teléfono es propio o no.

table(m1$fitted.values) %>% 
  knitr::kable()
Var1 Freq
20.0267380435668 187
24.6371681425079 113

Recordando que el objetivo del ejercicio es entender mejor la relación entre las caracteristicas de los clientes y su riesgo crediticio nos podemos plantear las siguientes preguntas:

  • ¿A qué se debe que sólo tenemos 2 estimaciones de tiempo?

  • ¿Con estos datos un modelo en donde la variable explicativa es la edad, es mejor?

  • ¿Cómo podemos mejorar el modelo y/o las estimaciones de los tiempo de falta de pago?

5.8 Gamma

Como se mencionó en la sección anterior las distribución exponencial es un caso particular de la distribución gamma. En general cuando la variable de respuesta es de tipo numérico, pero sólo puede tomar valores positivos de forma asimétrica, es decir, se encuentra concentrada en un conjunto de valores y su frecuencia disminuye cuando aumenta el valor de la respuesta, se dice que la variable se distribuye gamma.

La distribución gamma sólo está definida para valores mayores a cero, por lo que si la variable de respuesta \(Y\) toma valores negativos o cero, para poder utilizar esta distribución será necesario realizar una transformación de los datos, sumando una constante lo suficientemente grande que haga todas las obervaciones positivas.

Análogo al caso exponencial, la función liga utilizada es el recíproco, de modo que el modelo lineal se expresa como:

\[\frac{1}{E[Y]}=\beta_{0}+\beta_{1}X_{1}+\beta_{2}X_{2}+\cdots+\beta_{k}X_{k}\]

5.8.1 GLM Gamma en R

La base de datos que utilizaremos para este ejemplo, corresponde a las reclamaciones recibidas por cierta aseguradora para su producto de seguro de automóviles. Los siniestros corresponden al primer trimestre de 2015 y se registraron además del monto total reclamado, características del asegurado asi como del siniestro.

La aseguradora busca modelar el monto total reclamado en función de las otras variables medidas para con ello mejorar su cálculo de primas e identificación de grupos que deberian tener sobreprima.

Cargamos los datos y realizamos un breve análisis exploratorio de los datos.

datos <- read.csv("example_data/insurance_claims.csv", header = TRUE)

str(datos)
## 'data.frame':	1000 obs. of  22 variables:
##  $ months_as_customer         : int  328 228 134 256 228 256 137 165 27 212 ...
##  $ age                        : int  48 42 29 41 44 39 34 37 33 42 ...
##  $ policy_number              : int  521585 342868 687698 227811 367455 104594 413978 429027 485665 636550 ...
##  $ policy_state               : chr  "OH" "IN" "OH" "IL" ...
##  $ policy_deductable          : int  1000 2000 2000 2000 1000 1000 1000 1000 500 500 ...
##  $ policy_annual_premium      : num  1407 1197 1413 1416 1584 ...
##  $ insured_sex                : chr  "MALE" "MALE" "FEMALE" "FEMALE" ...
##  $ insured_education_level    : chr  "MD" "MD" "PhD" "PhD" ...
##  $ insured_occupation         : chr  "craft-repair" "machine-op-inspct" "sales" "armed-forces" ...
##  $ insured_hobbies            : chr  "sleeping" "reading" "board-games" "board-games" ...
##  $ insured_relationship       : chr  "husband" "other-relative" "own-child" "unmarried" ...
##  $ incident_date              : chr  "25/01/2015" "21/01/2015" "22/02/2015" "10/01/2015" ...
##  $ incident_type              : chr  "Single Vehicle Collision" "Vehicle Theft" "Multi-vehicle Collision" "Single Vehicle Collision" ...
##  $ collision_type             : chr  "Side Collision" "?" "Rear Collision" "Front Collision" ...
##  $ incident_severity          : chr  "Major Damage" "Minor Damage" "Minor Damage" "Major Damage" ...
##  $ authorities_contacted      : chr  "Police" "Police" "Police" "Police" ...
##  $ incident_hour_of_the_day   : int  5 8 7 5 20 19 0 23 21 14 ...
##  $ number_of_vehicles_involved: int  1 1 3 1 1 3 3 3 1 1 ...
##  $ auto_make                  : chr  "Saab" "Mercedes" "Dodge" "Chevrolet" ...
##  $ auto_model                 : chr  "92x" "E400" "RAM" "Tahoe" ...
##  $ auto_year                  : int  2004 2007 2007 2014 2009 2003 2012 2015 2012 1996 ...
##  $ total_claim_amount         : int  71610 5070 34650 63400 6500 64100 78650 51590 27700 42300 ...
summary(datos)
##  months_as_customer      age        policy_number    policy_state      
##  Min.   :  0.0      Min.   :19.00   Min.   :100804   Length:1000       
##  1st Qu.:115.8      1st Qu.:32.00   1st Qu.:335980   Class :character  
##  Median :199.5      Median :38.00   Median :533135   Mode  :character  
##  Mean   :204.0      Mean   :38.95   Mean   :546239                     
##  3rd Qu.:276.2      3rd Qu.:44.00   3rd Qu.:759100                     
##  Max.   :479.0      Max.   :64.00   Max.   :999435                     
##  policy_deductable policy_annual_premium insured_sex       
##  Min.   : 500      Min.   : 433.3        Length:1000       
##  1st Qu.: 500      1st Qu.:1089.6        Class :character  
##  Median :1000      Median :1257.2        Mode  :character  
##  Mean   :1136      Mean   :1256.4                          
##  3rd Qu.:2000      3rd Qu.:1415.7                          
##  Max.   :2000      Max.   :2047.6                          
##  insured_education_level insured_occupation insured_hobbies   
##  Length:1000             Length:1000        Length:1000       
##  Class :character        Class :character   Class :character  
##  Mode  :character        Mode  :character   Mode  :character  
##                                                               
##                                                               
##                                                               
##  insured_relationship incident_date      incident_type     
##  Length:1000          Length:1000        Length:1000       
##  Class :character     Class :character   Class :character  
##  Mode  :character     Mode  :character   Mode  :character  
##                                                            
##                                                            
##                                                            
##  collision_type     incident_severity  authorities_contacted
##  Length:1000        Length:1000        Length:1000          
##  Class :character   Class :character   Class :character     
##  Mode  :character   Mode  :character   Mode  :character     
##                                                             
##                                                             
##                                                             
##  incident_hour_of_the_day number_of_vehicles_involved  auto_make        
##  Min.   : 0.00            Min.   :1.000               Length:1000       
##  1st Qu.: 6.00            1st Qu.:1.000               Class :character  
##  Median :12.00            Median :1.000               Mode  :character  
##  Mean   :11.64            Mean   :1.839                                 
##  3rd Qu.:17.00            3rd Qu.:3.000                                 
##  Max.   :23.00            Max.   :4.000                                 
##   auto_model          auto_year    total_claim_amount
##  Length:1000        Min.   :1995   Min.   :   100    
##  Class :character   1st Qu.:2000   1st Qu.: 41813    
##  Mode  :character   Median :2005   Median : 58055    
##                     Mean   :2005   Mean   : 52762    
##                     3rd Qu.:2010   3rd Qu.: 70593    
##                     Max.   :2015   Max.   :114920

Eliminar las columnas que contienen información específica:

datos <- datos[,c(-3,-12)]

Ajustaremos un primer modelo con la variable de género del asegurado:

m1 <- glm(total_claim_amount ~ insured_sex, data = datos, family = Gamma)
summary(m1)
## 
## Call:
## glm(formula = total_claim_amount ~ insured_sex, family = Gamma, 
##     data = datos)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -3.2500  -0.2192   0.0987   0.3053   0.8796  
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     1.875e-05  4.049e-07   46.30   <2e-16 ***
## insured_sexMALE 4.519e-07  6.027e-07    0.75    0.454    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Gamma family taken to be 0.2504562)
## 
##     Null deviance: 599.52  on 999  degrees of freedom
## Residual deviance: 599.38  on 998  degrees of freedom
## AIC: 23578
## 
## Number of Fisher Scoring iterations: 5

Bondad de ajuste:

dev <- m1$deviance
nullDev <- m1$null.deviance
modelChi <- nullDev - dev
modelChi
## [1] 0.1409954
chidf <- m1$df.null - m1$df.residual
chisq.prob <- 1 - pchisq(modelChi, chidf)
chisq.prob
## [1] 0.7072934

La prueba de bondad de ajuste nos dice que el modelo es malo ya que la explicación de la varianza ganada con el modelo no es estadísticamente significativa.

Intentemos ahora con la variable de edad

m2 <- glm(total_claim_amount ~ age, data = datos, family = Gamma)
summary(m2)
## 
## Call:
## glm(formula = total_claim_amount ~ age, family = Gamma, data = datos)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -3.2383  -0.2181   0.0940   0.3057   0.8563  
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  2.175e-05  1.313e-06  16.571   <2e-16 ***
## age         -7.125e-08  3.228e-08  -2.208   0.0275 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Gamma family taken to be 0.2506544)
## 
##     Null deviance: 599.52  on 999  degrees of freedom
## Residual deviance: 598.31  on 998  degrees of freedom
## AIC: 23576
## 
## Number of Fisher Scoring iterations: 5

Bondad de ajuste:

dev <- m2$deviance
nullDev <- m2$null.deviance
modelChi <- nullDev - dev
modelChi
## [1] 1.207078
chidf <- m2$df.null - m2$df.residual
chisq.prob <- 1 - pchisq(modelChi, chidf)
chisq.prob
## [1] 0.2719116

¿Es un buen modelo?, ¿Es mejor que el modelo de género?

Probar con la variable de tipo de siniestro.

m3 <- glm( total_claim_amount ~ incident_type, data = datos, family = Gamma)

summary(m3)
## 
## Call:
## glm(formula = total_claim_amount ~ incident_type, family = Gamma, 
##     data = datos)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -2.44568  -0.18206  -0.01135   0.17050   0.80416  
## 
## Coefficients:
##                                         Estimate Std. Error t value
## (Intercept)                            1.622e-05  2.108e-07  76.967
## incident_typeParked Car                1.722e-04  5.471e-06  31.470
## incident_typeSingle Vehicle Collision -7.070e-07  2.944e-07  -2.401
## incident_typeVehicle Theft             1.650e-04  4.976e-06  33.162
##                                       Pr(>|t|)    
## (Intercept)                             <2e-16 ***
## incident_typeParked Car                 <2e-16 ***
## incident_typeSingle Vehicle Collision   0.0165 *  
## incident_typeVehicle Theft              <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Gamma family taken to be 0.07073018)
## 
##     Null deviance: 599.520  on 999  degrees of freedom
## Residual deviance:  80.724  on 996  degrees of freedom
## AIC: 21492
## 
## Number of Fisher Scoring iterations: 5

Bondad de ajuste:

dev <- m3$deviance
nullDev <- m3$null.deviance
modelChi <- nullDev - dev
modelChi
## [1] 518.7961
chidf <- m3$df.null - m3$df.residual
chisq.prob <- 1 - pchisq(modelChi, chidf)
chisq.prob
## [1] 0

¿Qué podemos decir de este modelo?, ¿Nos sirve este modelo para clasificar la sobreprima?

¿Podemos encontrar un mejor modelo?