Sección 5 Redes bayesianas

Los paquetes que usaremos en esta sección son:

  • CRAN: tidyverse (dplyr, ggplot2, purrr), bnlearn, BiocManager, igraph, gRain.

  • Bioconductor: Rgraphviz, RBGL

install.packages("BiocManager")
BiocManager::install("Rgraphviz")

Y las referencias son Koller and Friedman (2009), Ross (1998) y Wasserman (2010).

## Warning: package 'forcats' was built under R version 3.5.2

Intoducción: Modelos gráficos

Un modelo gráfico es una red de variables aleatorias donde:

  • Nodos representan variables aleatorias.

  • Arcos (dirigidos o no) representan dependencia

Los dos esquemas generales para representar dependencias/independiencias (condicionales) de forma gráfica son los modelos dirigidos (redes bayesianas) y no dirigidos (redes markovianas).

En este módulo nos enfocaremos en modelos dirigidos veamos un ejemplo de una red de seguros de auto.

En este ejemplo nos interesa entender los patrones de dependencia entre variables como edad, calidad de conductor y tipo de accidente:

#>   GoodStudent        Age   SocioEcon RiskAversion VehicleYear ThisCarDam
#> 1       False      Adult       Prole  Adventurous       Older   Moderate
#> 2       False     Senior       Prole     Cautious     Current       None
#> 3       False     Senior UpperMiddle   Psychopath     Current       None
#> 4       False Adolescent      Middle       Normal       Older       None
#> 5       False Adolescent       Prole       Normal       Older   Moderate
#> 6       False      Adult UpperMiddle       Normal     Current   Moderate
#>   RuggedAuto Accident   MakeModel DrivQuality    Mileage Antilock
#> 1   EggShell     Mild     Economy        Poor TwentyThou    False
#> 2   Football     None     Economy      Normal TwentyThou    False
#> 3   Football     None FamilySedan   Excellent     Domino     True
#> 4   EggShell     None     Economy      Normal  FiftyThou    False
#> 5   Football Moderate     Economy        Poor  FiftyThou    False
#> 6   EggShell Moderate   SportsCar        Poor  FiftyThou     True
#>   DrivingSkill SeniorTrain ThisCarCost Theft   CarValue HomeBase AntiTheft
#> 1  SubStandard       False     TenThou False   FiveThou     City     False
#> 2       Normal        True    Thousand False    TenThou     City      True
#> 3       Normal       False    Thousand False TwentyThou     City     False
#> 4       Normal       False    Thousand False   FiveThou   Suburb     False
#> 5  SubStandard       False     TenThou False   FiveThou     City     False
#> 6  SubStandard       False HundredThou False TwentyThou   Suburb      True
#>      PropCost OtherCarCost OtherCar  MedCost Cushioning Airbag  ILiCost
#> 1     TenThou     Thousand     True Thousand       Poor  False Thousand
#> 2    Thousand     Thousand     True Thousand       Good   True Thousand
#> 3    Thousand     Thousand    False Thousand       Good   True Thousand
#> 4    Thousand     Thousand     True Thousand       Fair  False Thousand
#> 5     TenThou     Thousand    False Thousand       Fair  False Thousand
#> 6 HundredThou  HundredThou     True  TenThou       Poor   True Thousand
#>   DrivHist
#> 1     Many
#> 2     Zero
#> 3      One
#> 4     Zero
#> 5     Many
#> 6     Many

Aprendemos la estructura de la red:

insurance_gm <- hc(insurance_dat, blacklist = blacklist)
graphviz.plot(insurance_gm)
#> Loading required namespace: Rgraphviz

insurance.fit <- bn.fit(insurance_gm, data = insurance_dat, 
                        method = 'bayes', iss = 1)

¿Cómo interpretar esta gráfica?

Vemos por ejemplo como mucho de la asociación entre edad y tipo de accidente desaparece cuando condicionamos a calidad de conductor.

prop.table(table(insurance$Age, insurance$Accident), margin = 1)
#>             
#>                Mild Moderate   None Severe
#>   Adolescent 0.1214   0.1172 0.5734 0.1881
#>   Adult      0.0844   0.0780 0.7331 0.1044
#>   Senior     0.0593   0.0493 0.8137 0.0778
prop.table(table(insurance$Age, insurance$Accident, insurance$DrivQuality), 
           margin = c(1, 3))
#> , ,  = Excellent
#> 
#>             
#>                 Mild Moderate    None  Severe
#>   Adolescent 0.01163  0.00194 0.98256 0.00388
#>   Adult      0.01118  0.00437 0.98154 0.00292
#>   Senior     0.00449  0.00359 0.98833 0.00359
#> 
#> , ,  = Normal
#> 
#>             
#>                 Mild Moderate    None  Severe
#>   Adolescent 0.01676  0.01341 0.96144 0.00838
#>   Adult      0.02236  0.01110 0.96012 0.00641
#>   Senior     0.02531  0.01395 0.95558 0.00517
#> 
#> , ,  = Poor
#> 
#>             
#>                 Mild Moderate    None  Severe
#>   Adolescent 0.19847  0.19507 0.28687 0.31959
#>   Adult      0.20812  0.20861 0.29054 0.29273
#>   Senior     0.19283  0.17492 0.31928 0.31296

También podemos entender cómo depende calidad de conductor de edad y aversión al riesgo (modelo local para DrvQuality):

prop_tab_q <- prop.table(table(insurance$DrivQuality, insurance$RiskAversion, insurance$Age), c(2, 3))
prop_tab_q
#> , ,  = Adolescent
#> 
#>            
#>             Adventurous Cautious Normal Psychopath
#>   Excellent      0.1832   0.1667 0.0444     0.2195
#>   Normal         0.1762   0.3519 0.4349     0.0732
#>   Poor           0.6406   0.4815 0.5207     0.7073
#> 
#> , ,  = Adult
#> 
#>            
#>             Adventurous Cautious Normal Psychopath
#>   Excellent      0.2882   0.2295 0.0964     0.2516
#>   Normal         0.2413   0.4704 0.6071     0.1355
#>   Poor           0.4705   0.3001 0.2965     0.6129
#> 
#> , ,  = Senior
#> 
#>            
#>             Adventurous Cautious Normal Psychopath
#>   Excellent      0.2515   0.3751 0.1582     0.2500
#>   Normal         0.1871   0.4920 0.5459     0.1136
#>   Poor           0.5613   0.1329 0.2959     0.6364

df_q <- data.frame(prop_tab_q)
names(df_q) <- c('DrvQuality', 'RiskAversion', 'Age', 'Prop')
ggplot(df_q, aes(x = Age, y = Prop, colour = RiskAversion, 
                 group = RiskAversion)) + 
  geom_line() + facet_wrap(~DrvQuality) +
  geom_point()

Otras asociaciones con DrvQuality podemos entenderlas a través de estas dos variables: edad y aversión al riesgo. Veremos cómo modelar estas estructuras (además de usar las tablas, que corresponden a estimación de máxima verosimilitud sin restricciones, podemos usar por ejemplo GLMs).

¿Por qué modelos gráficos?

  • Usando modelos gráficos podemos representar de manera compacta y atractiva distribuciones de probabilidad entre variables aleatorias.

  • Auxiliar en el diseño de modelos.
  • Fácil combinar información proveniente de los datos con conocimiento de expertos.

  • Proveen un marco general para el estudio de modelos más específicos. Muchos de los modelos probabilísticos multivariados clásicos son casos particulares del formalismo general de modelos gráficos (mezclas gaussianas, modelos de espacio de estados ocultos, análisis de factores, filtro de Kalman,…).

  • Juegan un papel importante en el diseño y análisis de algoritmos de aprendizaje máquina.

Referencias

Koller, Daphne, and Nir Friedman. 2009. Probabilistic Graphical Models: Principles and Techniques - Adaptive Computation and Machine Learning. The MIT Press.

Ross, Sheldon M. 1998. A First Course in Probability. Fifth. Upper Saddle River, N.J.: Prentice Hall.

Wasserman, Larry. 2010. All of Statistics: A Concise Course in Statistical Inference. Springer Publishing Company, Incorporated.