Modelos exponenciales para grafos aleatorios (y III): inferencia

Me quedé el otro día en el modelo probabilístico de los grafos aleatorios exponenciales. Quedaba una última parte y al ensayar su redacción me di cuenta de que me había metido en un huerto: la cosa es mucho más vasta de lo que a primera vista parecía.

Así que me limitaré a repasar lo más básico tratando de no meter demasiado la pata.

Tradicionalmente, se utilizaba para estimar los parámetros de un grafo la llamada técnica de la función de seudo-verosimilitud. Se ve que uno puede escribir

\log \left( \frac{P(v_{ij} = 1| y_{ij})}{P(v_{ij} = 0| y_{ij})} \right) = \sum_A \eta_A d_A(y)

donde v_{ij} es una posible arista del grafo, y_{ij} es el grafo original sin la arista v_{ij} y d_A(y) es una función —la función difererencia— que depende del tipo de configuración. Un poco más en cristiano, que la razón de probabilidades para que exista un cierto vértice puede modelarse como una ecuación lineal en los coeficientes \eta_A y eso permite estimarlos usando algo similar a regresiones logísticas.

Si vale el símil, sería equivalente a plantear un modelo logístico para predecir la existencia o no existencia de un determinado vértice.

Pero parece que esta técnica está mandada a recoger, i.e., desaconsejada, y suelen utilizarse en su lugar técnicas de Montecarlo. En particular, usando el paquete ergm de R. Como me superan los detalles de este asunto entero, me limitaré a recorrer con cierta minuciosidad el ejemplo que aparece en la función central del paquete, ergm.

Para ello, primero cargamos el paquete e importamos un conjunto de datos, flo.

library(ergm)
data(flo)

flo es una matriz de incidencia: contiene ceros y unos y estos últimos indican que una determinada pareja de familias florentinas mantuvieron en su día vínculos matrimoniales. A partir de dicha matriz se puede crear una red:

flomarriage <- network(flo, directed = FALSE)
flomarriage

Y también añadir atributos a sus nodos (en este caso, la riqueza relativa de las familias):

flomarriage %v% "wealth" <- c(10,36,27,146,55,44,20,8,42,103,48,49,10,48,32,3)
flomarriage

Obviamente, las redes pueden representarse gráficamente haciendo

plot( flomarriage )
plot(flomarriage, vertex.cex=flomarriage %v% "wealth" / 20)

para obtener (en la segunda sentencia) algo así como

La parte interesante llega ahora: plantear un modelo que, por ejemplo, indique si las familias tienen propensión a enlazarse cuando la diferencia de riqueza entre ellas es grande. Por supuesto, controlando por el número de enlaces totales que hay en el modelo, que es el significado del térmimo edges:

gest <- ergm(flomarriage ~ edges + absdiff("wealth"))
summary(gest)

La salida es

==========================
Summary of model fit
==========================

Formula: flomarriage ~ edges + absdiff("wealth")

Iterations: 20

Monte Carlo MLE Results:
Estimate Std. Error MCMC % p-value
edges -1.457666 0.354532 NA absdiff.wealth -0.004176 0.007387 NA 0.573
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Null Deviance: 166.355 on 120 degrees of freedom
Residual Deviance: 107.798 on 118 degrees of freedom
Deviance: 58.557 on 2 degrees of freedom

AIC: 111.8 BIC: 117.37

en la que diría yo que el coeficiente (negativo) de edges indica que la densidad del grafo es relativamente pequeña (que es un grafo con pocos vértices, vamos) y que descontado ese efecto, la diferencia de riqueza entre las familias no parece tener mayor efecto.

Los términos que aparecen a la derecha de la fórmula del modelo representan configuraciones y el paquete implementa muchas de ellas: kstar(n) para el número de estrellas de n vértices, transitive, degree, cycle,… y así hasta treinta o cuarenta de ellas.

Los lectores interesados en el asunto pueden encontrar gratificante el ejercicio consistente en relacionar el coeficiente obtenido para el parámetro edges al modelar redes creadas con sentencias del tipo

mi.red <- network(25, directed=FALSE, density=0.1)

haciendo variar el parámetro density.