Una red dinámica hace referencia a una red que cambia a lo largo del tiempo. Del instante \(t\) al \(t+1\) pueden aparecer o desaparecer nodos o aristas.
El adjetivo “dinámico” se ha aplicado en el contexto de redes para describir tres aspectos diferentes de un sistema en evolución:
Si ambos tipos de dinámica se presentan juntas se dice que la red co-evoluciona.
Conceptualmente, definimos una red dinámica como un grafo indexado en el tiempo \[G(t)=\left(V(t), E(t)\right)\]
con \(t\) variando de forma discreta o continua.
En varias ocasiones es conveniente dejar el conjunto de vértices constante a lo largo del tiempo, en cuyo caso escribimos \(V(t)=V\) para todo \(t\).
La información de una red temporal se puede recopilar de diferentes maneras, lo que conduce a varios tipos diferentes de datos:
Hay tres marcos generales de modelado para el análisis de datos de redes temporales en el campo de las redes sociales.
Modelos estocásticos orientados al actor (SAOM): permiten modelar la co-evolución de atributos nodales y dinámicas de aristas. Además, se formulan como modelos de tiempo continuo, aunque típicamente se estiman par datos de tiempo discreto.
Modelos de eventos relacionales: son modelos de tiempo continuo para la dinámica de los nodos y los enlaces, por lo que pueden asumir la independencia de las díadas y explotar la metodología de la regresión logística.
Modelos de grafos aleatorios exponenciales temporales (TERGMs): representan dinámicas de los enlaces únicamente, y se formulan en tiempo discreto.
Con los diferentes tipos de redes dinámicas mencionadas vienen así mismo varias formas en las que estas redes pueden visualizarse.
Bajo esta representación es importante mantener cierta “estabilidad” a lo largo de las visualizaciones manteniendo las posiciones de los vértices invariantes.
Consideremos los 3 paneles de los datos Sampson.
data(samplk)
samp.list <- list(samplk1,samplk2,samplk3)
samp.dyn <- networkDynamic(network.list = samp.list, start = 1)## Onsets and termini not specified, assuming each network in network.list should have a discrete spell of length 1
## Argument base.net not specified, using first element of network.list instead
## Created net.obs.period to describe network
## Network observation period info:
## Number of observation spells: 1
## Maximal time range observed: 1 until 4
## Temporal mode: discrete
## Time unit: step
## Suggested time increment: 1
library(sna)
coord <- gplot.layout.fruchtermanreingold(
as.matrix.network.adjacency(samp.dyn), layout.par = list())
par(mfrow = c(2,2), oma=c(1,1,1,1), mar=c(4,1,3,1))
plot(network.extract(samp.dyn, at = 1), coord = coord,main = "Tiempo 1",
displaylabels = T, label.cex = 0.6, vertex.cex = 2, pad = 0)
plot(network.extract(samp.dyn, at = 2), coord = coord,main = "Tiempo 2",
displaylabels = T, label.cex = 0.6, vertex.cex = 2, pad = 0)
plot(network.extract(samp.dyn, at = 3), coord = coord,main = "Tiempo 3",
displaylabels = T, label.cex = 0.6, vertex.cex = 2, pad = 0)
plot(samp.dyn, coord = coord,main = "Colapsada",
displaylabels = T, label.cex = 0.6, vertex.cex = 2, pad = 0)Esta representación, aunque sencilla, no es la más útil si queremos información sobre los cambios temporales en las amistades entre monjes del monasterio, así como cuando los datos son lo suficientemente ricos temporalmente que graficar cada ‘slice’ se vuelve insostenible.
Para obtener un rápido resumen visual de cómo cambia la estructura con el tiempo, podemos renderizar la red dinámica como una animación
library(ndtv)
# Datos incluidos en el paquete
data(short.stergm.sim)
render.d3movie(short.stergm.sim,
plot.par=list(displaylabels=T),
output.mode = 'htmlWidget')## slice parameters:
## start:0
## end:25
## interval:1
## aggregate.dur:1
## rule:latest
Este método, no obstante, no se recomienda del todo para redes muy granes, debido al costo computacional.
Otra herramienta interesante de visualización es el cronograma de proximidad. En este gráfico, los nodos se posicionan en el eje-y de acuerdo a su proximidad en términos de distancias geodésicas. Es útil ya que los cambios de posición de los nodos nos habla de cambios en la estructura de la red.
proximity.timeline(short.stergm.sim,default.dist = 6,
mode = 'sammon',labels.at = 17,vertex.cex = 4)## collapsing slice networks ...
## computing vertex positions using 1D sammon layout ...
## computing positions for slice 1
## computing positions for slice 2
## computing positions for slice 3
## computing positions for slice 4
## computing positions for slice 5
## computing positions for slice 6
## computing positions for slice 7
## computing positions for slice 8
## computing positions for slice 9
## computing positions for slice 10
## computing positions for slice 11
## computing positions for slice 12
## computing positions for slice 13
## computing positions for slice 14
## computing positions for slice 15
## computing positions for slice 16
## computing positions for slice 17
## computing positions for slice 18
## computing positions for slice 19
## computing positions for slice 20
## computing positions for slice 21
## computing positions for slice 22
## computing positions for slice 23
## computing positions for slice 24
## computing positions for slice 25
## rendering splines for each vertex ...
Note que es fácil identificar que la familia ‘Lamberteschi’ se desprende de su grupo de a partir de \(t=15\), volviéndose un nodo aislado por aproximadamente 5 periodos de tiempo.
Nota: El eje \(y\) de este gráfico toma valores negativos ya que este representa la posición en un espacio unideimensional que aproxima las distancias geodésicas de la red. Nos cercanos en \(y\) tienden a estar próximos en la red, y el signo (+ o -) no tiene interpretación, ya que lo que importa son las diferencias entre posiciones. Por ejemplo, un conjunto de nodos A, B y C toma los valores en el eje \(y\) de -4, -3 y 5. Esto se interpreta como que A y B están cerca geodésicamente y C está alejado de ambos.
Veamos un ejemplo de análisis descriptivo de una red dinámica nos basaremos en Kolaczyk (2020).
El objeto hc contiene información de 75
personas acerca de registros de contactos cara a cara entre pacientes y
diversos tipos de trabajadores de la salud en la unidad geriátrica de un
hospital en Lyon, Francia, en 2010, desde la 1 p. m. del lunes 6 de
diciembre hasta las 2 p. m. del viernes 10 de
diciembre.
Un objetivo principal de este estudio fue obtener información sobre el patrón de contactos en un entorno hospitalario de este tipo y la forma en que podría transmitirse la infección.
## Time ID1 ID2 S1 S2
## 1 140 15 31 MED ADM
## 2 160 15 22 MED MED
## 3 500 15 16 MED MED
## 4 520 15 16 MED MED
## 5 560 16 22 MED MED
## 6 580 16 22 MED MED
# Numero de personas por status
ID.stack <- c(hc$ID1,hc$ID2)
Status.stack <- c(as.character(hc$S1), as.character(hc$S2))
my.t <- table(ID.stack,Status.stack)
v.status <- character(nrow(my.t))
for(i in (1:length(v.status))){
v.status[i] <- names(which(my.t[i,]!=0))}
table(v.status)## v.status
## ADM MED NUR PAT
## 8 11 27 29
# Numero de relaciones entre status
status.t <- table(hc$S1,hc$S2)
status.t <- status.t + t(status.t)
diag(status.t) <- round(diag(status.t)/2)
status.t##
## ADM MED NUR PAT
## ADM 279 459 2596 441
## MED 459 5660 1769 1471
## NUR 2596 1769 12695 6845
## PAT 441 1471 6845 209
Representación:
tmp.es <- paste(hc$S1, "-", hc$S2, sep = "")
e.status <- character(dim(hc)[[1]])
e.status[tmp.es=="ADM-ADM"] <- "ADM-ADM"
e.status[tmp.es=="MED-MED"] <- "MED-MED"
e.status[tmp.es=="NUR-NUR"] <- "NUR-NUR"
e.status[tmp.es=="PAT-PAT"] <- "PAT-PAT"
e.status[(tmp.es=="ADM-MED") | (tmp.es=="MED-ADM")] <- "ADM-MED"
e.status[(tmp.es=="ADM-NUR") | (tmp.es=="NUR-ADM")] <- "ADM-NUR"
e.status[(tmp.es=="ADM-PAT") | (tmp.es=="PAT-ADM")] <- "ADM-PAT"
e.status[(tmp.es=="MED-NUR") | (tmp.es=="NUR-MED")] <- "MED-NUR"
e.status[(tmp.es=="MED-PAT") | (tmp.es=="PAT-MED")] <- "MED-PAT"
e.status[(tmp.es=="NUR-PAT") | (tmp.es=="PAT-NUR")] <- "NUR-PAT"
my.hc <- data.frame(Time = hc$Time/(60*60), ID1 = hc$ID1, ID2 = hc$ID2,
Status = e.status)
# Histogramas
library(lattice)
histogram(~Time|Status, data = my.hc, xlab="Horas", layout = c(5,2),
ylab = "Porcentaje del total")Histogramas de contactos en el conjunto de datos hospitalarios hc, agrupados según el estado del par que interactúa.
Veamos la caracterización de una red dinámica utilizando los datos de contacto del hospital, donde, el objetivo es comprender cómo podría transmitirse la infección entre individuos en este entorno.
# Distribucion del grado por cada periodo de tiempo
all.deg <- sapply(g.sl12, igraph::degree)
sl.lab <- sapply(1:8, function(i) paste(12*(i-1), "-", 12*i, "hrs", sep=""))
deg.df <- data.frame(Degree = as.vector(all.deg),
Slice = rep(sl.lab,each=75),
Estado = rep(V(g.week)$Status, times=8))
library(ggplot2)
p = qplot(factor(Degree), data = deg.df, geom = "bar", fill = Estado)
p + facet_grid(Slice~.) + xlab("Grado") + ylab("Frec.")Distribuciones de grados para los datos de contacto del hospital, una por cada una de las ocho redes estáticas correspondientes a periodos consecutivos de 12 horas
Se aprecia una moda importante en cero en cada gráfico de barras. Esto es, durante cualquier período de 12 horas, una fracción considerable de las 75 personas estudiadas no participó en ningún contacto registrado.
La gran mayoría de los pacientes tienen contactos con un número comparativamente menor de personas.
El personal del hospital tiende a tener contactos con un mayor número de personas.
# Por grado
# Top 5 de nodos de mayor grado por periodo
top.deg <- lapply(1:8,function(i) {all.deg[,i][rank(all.deg[,i])>=70]})
# Numero de periodos en los que un nodo estuvo en el top 5 de mayor grado
tab <- table(unlist(lapply(1:8,function(i)
as.numeric(names(top.deg[[i]])))))
# Nodos y numero de periodos de 12h en el top 5 de mayor grado
sort(tab, decreasing = TRUE)##
## 7 15 17 19 23 1 5 11 13 21 24 26 27 29 37 64 8 10 22 25 31 34 36 63
## 4 4 3 3 3 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1
Los nodos 7 y 15 estuvieron en el top 5 de mayor grado en cuatro de los ocho periodos consecutivos de 12 horas. Como se verá a continuación, estos nodos hacen referencia a una enfermera y un médico, respectivamente.
## [1] "NUR" "MED"
# Tiempo promedio por contacto en cada periodo de 12h
all.str <- sapply(g.sl12, strength)
# Tiempo de contacto/ grado
all.r <- all.str/all.deg| Nodo | Periodo 1 | Periodo 2 | Periodo 3 | Periodo 4 | Periodo 5 | Periodo 6 | Periodo 7 | Periodo 8 |
|---|---|---|---|---|---|---|---|---|
| 7 | 2.00 | 25.79 | 11.1 | 32.73 | 14.20 | 33.19 | 8.33 | 37.34 |
| 15 | 29.71 | 26.33 | 17.0 | 12.48 | 19.27 | 15.30 | 19.40 | 12.93 |
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 1.00 5.00 10.43 12.06 15.73 47.35 261
Esta enfermera y este médico tienden a tener una tasa de contactos igual o superior a la media, es decir, entran en contacto con muchas más personas de lo habitual en esta sala del hospital.
En consecuencia, estos dos individuos son candidatos naturales para ser considerados como potenciales propagadores.
# Distancia promedio a los demas nodos por cada periodo de tiempo
sp.len <- lapply(1:8, function(i) {
spl <- distances(g.sl12[[i]],v = c(7,15), to = V(g.sl12[[i]]), weights = NA)
spl[spl==Inf] <- NA
spl
})
# Tabla
ave.spl <- sapply(1:8,function(i) apply(sp.len[[i]], 1, mean, na.rm=T))| Nodo | Periodo 1 | Periodo 2 | Periodo 3 | Periodo 4 | Periodo 5 | Periodo 6 | Periodo 7 | Periodo 8 |
|---|---|---|---|---|---|---|---|---|
| 7 | 3.05 | 1.27 | 1.79 | 1.12 | 1.8 | 1.33 | 2 | 1.24 |
| 15 | 1.72 | 1.51 | 2.48 | 1.35 | 1.36 | 1.26 | 1.61 | 1.36 |
# Distancia promedio de los caminos mas cortos por periodo de tiempo
round(sapply(g.sl12,mean_distance),digits=2)## [1] 3.80 3.26 4.47 4.33 3.69 3.56 4.06 3.50
La enfermera y el médico parecen estar más cerca de los demás en la red la mayor parte del tiempo, lo que podría tener un efecto perjudicial en la contención de la infección, si alguno de ellos se contagiara.
Los modelos TERGMs son extensiones de los ERGMs para el modelamiento de redes dinámicas en tiempo discreto.
Los TERGMs postulan dos o más modelos para las dinámicas de las aristas. Cada uno de estos es, por si solo, un ERGM que opera sobre un conjunto específico de nodos y enlaces.
Al abordar los Modelos Temporales de Grafos Aleatorios Exponenciales (TERGMs), el punto de partida fundamental es decidir cómo conceptualizamos el cambio de la red de un momento a otro. Naturalmente, existen dos marcos de modelado principales que definen esta transición: los Modelos Conjuntos y los Modelos Separables (STERGMs)
Los modelos conjuntos representan la evolución de la red como un proceso único y unificado. En este enfoque, se utiliza una sola fórmula para explicar el paso de la red del tiempo \(t\) al tiempo \(t+1\). La suposición subyacente es que los mismos procesos sociales y factores estructurales (como la reciprocidad o la transitividad) impulsan tanto la creación de nuevos vínculos como la terminación de los existentes.
“Separable” aquí significa que se supone que la formación de aristas es independiente de la disolución de estas dentro de cada paso del tiempo (\(t\) a \(t+1\)), y dependiente de Markov entre los pasos (la formación de una arista en \(t\) puede influenciar a la disolución de una arista adyacente en \(t+1\)). Esto permite que los factores que influyen en la formación sean diferentes de aquellos que influyen en la disolución.
En el contexto de las amistades, esto significa que, estadísticamente, el modelo asume que el proceso de “quiénes se hacen amigos hoy” no tiene nada que ver con el proceso de los que están “peleando y rompiendo hoy”. Así mismo, si bien la formación y la disolución son independientes dentro de un paso temporal, hay dependencia entre los pasos temporales.
Formalmente considere la evolución de una red en el tiempo \(t\) al tiempo \(t+1\).
Se define la red de formación \(\mathbf{Y}^+\) como aquella que contiene todos los enlaces existentes en \(\mathbf{Y}^t\) junto con los que se forman entre \(t\) y \(t+1\). Así: \[\mathbf{Y}^t\subseteq \mathbf{Y}^+,\] donde \(\mathbf{Y}^t\) es la red inicial.
Dada \(\mathbf{Y}^t = \boldsymbol{y}^t\), la red de formación \(\mathbf{Y}^+\) es generada de un ERGM:
\[\textsf{Pr}(\mathbf{Y}^+=\boldsymbol{y}^+|\mathbf{Y}^{t};\boldsymbol{\theta}^+)=\frac{\exp\{\boldsymbol{\theta}^{+\top}\mathbf{g}^+(\boldsymbol{y}^+)\}}{\kappa}, \quad \boldsymbol{y^+}\in \mathcal{Y}^+(\boldsymbol{y}^t)\] donde:
La red de disolución \(\mathbf{Y}^-\) (bajo un abuso de notación) se puede representar como \(\mathbf{Y}^-=\mathbf{Y}^t-D\), donde \(D\) es el conjunto de enlaces que se disuelven de la red entre \(t\) y \(t+1\): \[\mathbf{Y}^-\subseteq \mathbf{Y}^t.\]
Esta es simultáneamente generada por un ERGM, como sigue: \[\textsf{Pr}(\mathbf{Y}^-=\boldsymbol{y}^-|\mathbf{Y}^{t};\boldsymbol{\theta}^-)=\frac{\exp\{\boldsymbol{\theta}^{-\top}\mathbf{g}^-(\boldsymbol{y}^-)\}}{\kappa}, \quad \boldsymbol{y^-}\in \mathcal{Y}^-(\boldsymbol{y}^t),\] donde:
Nota: \(\mathbf{Y}^-\) contiene los enlaces que sobreviven tras la disolución, no los enlaces que desaparecen.
La red observada en el siguiente periodo se obtiene agregando los nuevos enlaces formados y eliminando los enlaces disueltos: \[\mathbf{Y}^{t+1}=\mathbf{Y}^t \cup (\mathbf{Y}^+-\mathbf{Y}^t)-(\mathbf{Y}^t-\mathbf{Y}^-). \]
Dado que \(\mathbf{Y}^t\subseteq\mathbf{Y}^+\), la expresión anterior puede simplificarse a:
\[\mathbf{Y}^{t+1}=\mathbf{Y}^+-(\mathbf{Y}^t-\mathbf{Y^-}), \] o equivalentemente: \[\mathbf{Y}^{t+1}=\mathbf{Y}^-\cup(\mathbf{Y}^+-\mathbf{Y}^t), \]
Si \(\mathbf{Y}^+\) es condicionalmente independiente de \(\mathbf{Y}^-\) dada \(\mathbf{Y}^{t}\) entonces la probabilidad de transición se expresa como: \[\textsf{Pr}(\mathbf{Y}^{t+1}=\boldsymbol{y}^{t+1}|\mathbf{Y}^t=\boldsymbol{y}^t)= \textsf{Pr}(\mathbf{Y}^+=\boldsymbol{y}^+|\mathbf{Y}^t=\boldsymbol{y}^t; \boldsymbol{\theta}^+)\times \textsf{Pr}(\mathbf{Y}^-=\boldsymbol{y}^-|\mathbf{Y}^t=\boldsymbol{y}^t; \boldsymbol{\theta}^-)\] lo que permite estimar separadamente los parámetros de formación y de disolución.
Una transición entre dos redes: \[\mathbf{Y}^{t}\longrightarrow\mathbf{Y}^{t+1},\] puede analizarse desde varias perspectivas:
Los operadores Form(), Persist(),
Diss(), Change() y Cross()
responden a estas preguntas, representando un tipo específico de
dinámica de los enlaces.
| Operador | A qué responde |
|---|---|
Form() |
De todas las díadas que podían formar un enlace, ¿cuáles efectivamente lo formaron? |
Persist() |
De los vínculos que existen en \(t\), ¿cuáles lograron sobrevivir hasta \(t+1\)? |
Diss() |
De los enlaces existentes, ¿cuáles desaparecieron en \(t+1\)? |
Change() |
¿Qué tan probable es que un par de nodos cambie su estado entre dos momentos? |
Cross() |
¿Qué enlaces existen en \(t+1\)? |
Form()Modela exclusivamente la formación de enlaces entre tiempos. Es por esto que solo considera los pares de nodos que están vacíos en \(t\), ignorando los enlaces ya existentes. Esta se puede interpretar como \[\textsf{Pr}(Y_{ij}^{t+1}=1|Y_{ij}^{t}=0)=\frac{\text{enlaces formados}}{\text{díadas vacías en }t}\]
Persist()Modela la permanencia de los enlaces existentes de \(t\) a \(t+1\). Esta se interpreta como \[\textsf{Pr}(Y_{ij}^{t+1}=1|Y_{ij}^{t}=1)=\frac{\text{enlaces persistentes}}{\text{enlaces existentes en }t}\]
Diss()Modela exclusivamente la disolución de enlaces entre tiempos. Razón por la cual solo considera los pares de nodos no vacíos en \(t\). Se interpreta como: \[\textsf{Pr}(Y_{ij}^{t+1}=0|Y_{ij}^{t}=1)=\frac{\text{enlaces disueltos}}{\text{enlaces existentes en }t}\]
Este operador es complementario con persist(), ya que \(\text{Pr(persistencia)}+ \text{Pr(disolución)}=1\). Así mismo, un coeficiente positivo indica que cierta característica incrementa la probabilidad de ruptura del enlace.
Change()Mide la inestabilidad general de la red. No importa si el cambio fue una formación o una disolución; sólo importa que el estado del vínculo haya cambiado. Se interpreta como \[\textsf{Pr}(Y_{ij}^{t+1}\neq Y_{ij}^{t})=\frac{\text{díadas que cambiaron}}{\text{todas las díadas}}\]
Cross()Este último operador es el más diferente de todos, ya que no modela transiciones sino a la red observada directamente en el tiempo \(t+1\). Este es simplemente la densidad de la red en el tiempo \(t+1\), en su caso más simple: \[\textsf{Pr}(Y_{ij}^{t+1}=1)=\frac{\text{enlaces en }t+1}{\text{todas las díadas posibles}}\]
Ignora completamente el estado previo de la red y se concentra únicamente en explicar la estructura observada en el instante actual, de ahí viene su nombre cross-sectional (transversal).
Si bien los operadores se pueden mezclar de diferentes maneras, hay dos combinaciones naturales que se utilizan con mayor frecuencia:
Form() + Diss() (un modelo
‘separable’)
Cross() + Change() (un modelo
‘conjunto’)
Hay dos opciones para el argumento estimate en un modeo
TERGM:
CMLE (estimación condicional de máxima
verosimilitud): para ajustar un modelo a redes dinámicas tipo
panel
EGMME (método generalizado de estimación de momentos
en equilibrio): apara ajustar un modelo a una sola red transversal con
información de la duración de los enlaces.
Para datos tipo panel
La forma canónica de datos para modelar procesos dinámicos de red consiste en observaciones de una red completa en dos o más puntos en el tiempo en el mismo conjunto de nodos.
Como primer ejemplo, se muestra el modelo separable
Form() + Persist() (este último se elije sobre
el operador de disolución ya que el signo de persistencia tiene el mismo
impacto que el operador de formación)
library(tergm)
set.seed(123)
samp.fit.fp <- tergm(samp.list ~
Form(~edges+mutual+cyclicalties+transitiveties) +
Persist(~edges+mutual+cyclicalties+transitiveties),
estimate = "CMLE",
times = c(1:3)
)
summary(samp.fit.fp)## Call:
## tergm(formula = samp.list ~ Form(~edges + mutual + cyclicalties +
## transitiveties) + Persist(~edges + mutual + cyclicalties +
## transitiveties), estimate = "CMLE", times = c(1:3))
##
## Monte Carlo Conditional Maximum Likelihood Results:
##
## Estimate Std. Error MCMC % z value Pr(>|z|)
## Form(1)~edges -3.4766 0.3450 0 -10.076 <1e-04 ***
## Form(1)~mutual 2.0370 0.4160 0 4.896 <1e-04 ***
## Form(1)~cyclicalties -0.1366 0.1949 0 -0.701 0.4833
## Form(1)~transitiveties 0.3915 0.2391 0 1.637 0.1016
## Persist(1)~edges 0.2035 0.3055 0 0.666 0.5054
## Persist(1)~mutual 0.8017 0.5214 0 1.537 0.1242
## Persist(1)~cyclicalties -0.2036 0.2542 0 -0.801 0.4232
## Persist(1)~transitiveties 0.5309 0.2647 0 2.005 0.0449 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Null Deviance: 848.4 on 612 degrees of freedom
## Residual Deviance: 375.4 on 604 degrees of freedom
##
## AIC: 391.4 BIC: 426.7 (Smaller is better. MC Std. Err. = 1.537)
No hay muchos términos significativos aquí. Esto se debe en parte a que esta es una pequeña red dispersa, con solo dos cambios observados, por lo que la cantidad de información disponible para probar estos efectos es mínima.
Vemos que una relación es más propensa a formarse si en \(t+1\) cierra una díada mutua. El log-odds condicional incrementa en un 2.04, lo que quiere decir que la probabilidad relativa de que se forme un vínculo es 7.67 mayor si ese vínculo va a completar una relación recíproca, en comparación con uno que no lo hace.
Los coeficientes para tríadas transitivas son positivos y levemente significativos para formación y persistencia. Los coeficientes para tríadas cíclicas son negativos, pero no significativos.
set.seed(123)
samp.fit.cc <- tergm(samp.list ~
Cross(~edges+mutual+cyclicalties+transitiveties) +
Change(~edges+mutual+cyclicalties+transitiveties),
estimate = "CMLE",
times = c(1:3)
)
summary(samp.fit.cc)## Call:
## tergm(formula = samp.list ~ Cross(~edges + mutual + cyclicalties +
## transitiveties) + Change(~edges + mutual + cyclicalties +
## transitiveties), estimate = "CMLE", times = c(1:3))
##
## Monte Carlo Conditional Maximum Likelihood Results:
##
## Estimate Std. Error MCMC % z value Pr(>|z|)
## Cross(1)~edges -1.89693 0.24203 0 -7.837 <1e-04 ***
## Cross(1)~mutual 1.65992 0.39289 0 4.225 <1e-04 ***
## Cross(1)~cyclicalties -0.03647 0.17644 0 -0.207 0.8362
## Cross(1)~transitiveties 0.46345 0.20483 0 2.263 0.0237 *
## Change(1)~edges -1.65568 0.23339 0 -7.094 <1e-04 ***
## Change(1)~mutual -0.28897 0.50759 0 -0.569 0.5691
## Change(1)~cyclicalties -0.09086 0.18241 0 -0.498 0.6184
## Change(1)~transitiveties 0.46223 0.24422 0 1.893 0.0584 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Null Deviance: 848.4 on 612 degrees of freedom
## Residual Deviance: 379.5 on 604 degrees of freedom
##
## AIC: 395.5 BIC: 430.8 (Smaller is better. MC Std. Err. = 1.394)
Nuevamente, una arista es más propensa a estar presente en la red si
es parte de una díada mutua; el log-odds condicional aumenta un 1.66 lo
que se traduce en que es 5.36 veces más probable encontrar un vínculo si
este es mutuo. Recordemos que Cross describe la estrutura
de la red, por lo que es corecto pensar que hay mucha reciprocidad en la
red, sin importar el intervalo de tiempo en la que se mire. No sorprende
esta interpretación ya que en el primer modelo las díadas mutuas tienden
a formarse y a persistir en el tiempo.
El efecto de la reciprocidad en Change es negativo
aunque no significativo. Si fuese significativo se interpretaría como
que los vínculos sociales que forman parte de un par mutuo son más
estables en el tiempo, que los que no lo son.
Para redes transversales
Ahora, imaginamos otro escenario en el que se observó una sola red transversal con información retrospectiva sobre la duración de las aristas. ¿Cómo estimar los modelos de formación y persistencia cuando solo se cuenta con una red? … Imponiendo supuestos de equilibrio:
Balance de flujos: la tasa a la que se forman nuevos vínculos es igual a la tasa a la que desaparecen los enlaces existentes (disolución), por lo que ambos procesos se compensan entre si.
Estabilidad en las estadísticas: las propiedades globales de la red (densidad total, número de triángulos, reciprocidad, etc.) permanecen constantes a lo largo del tiempo
Si se asume que un proceso está en equilibrio, se tiene que \[\text{prevalencia}=\text{incidencia}\times\text{duración},\]
donde la prevalencia es la cantidad total de aristas existentes en la red transversal, la incidencia se refiere a la tasa de aparición de nuevos vínculos, y la duración es la información que se tiene sobre las aristas de ante mano.
La incidencia es lo que alimenta la red. Si conoces la prevalencia (la foto) y la duración de los vínculos (la persistencia), el modelo EGMME puede calcular matemáticamente cuál tuvo que ser la incidencia (tasa de formación) necesaria para mantener la red en ese nivel de equilibrio
Considere que se estudia una red de amistad y, por encuestas, se sabe que una amistad dura, en promedio, 10 años (donde cada paso de tiempo \(t\) es de 1 año).
En un modelo simple para la disolución, solo usando
edges, existe una relación directa entre la probabilidad de
persistencia \(p\) y la duración
esperada \(d\): \(d=\frac{1}{1-p}\)
Si \(d=10\), entonces: \[10=\frac{1}{1-p}\rightarrow 1-p= 0.1 \rightarrow p=0.9\] Esto significa que, para que una amistad dure 10 años, cada año debe tener un \(90\%\) de probabilidad de sobrevivir.
Este se convierte a escala log-odds para que sea el coeficiente \(\theta_{\text{pers}}\) que conocemos: \[\theta_{\text{persistencia}}=\ln \left(\frac{p}{1-p}\right)=\ln\left(\frac{0.9}{0.1}\right)=\ln(9)\approx 2.197\]
Nota: El coeficiente de disolución no es nada más que \(-2.197\)
Ya sabiendo que tan rápido “mueren” las amistades (disolución), el modelo debe encontrar ahora que tan rápido se forman para que la red se mantenga igual a la ‘foto’ observada.
Supongase que la red transversal tiene una densidad del \(5\%\) (prevalencia). El modelo EGMME se pregunta: “Si estoy perdiendo el 10% de mis vínculos en cada paso de tiempo, ¿cuántos vínculos nuevos debo crear para que la densidad se quede estancada en el 5%?”.
El modelo, empieza con coeficientes de formación al azar, con estos simula redes y calcula sus densidades. Sigue este proceso, hasta acercarse lo más posible al \(5\%\).
SAOM: Modelo Estocástico Orientado al Actor. (Luke, 2015)
Se basa en un proceso de Markov, es decir, la probabilidad de que una red cambie de estado depende únicamente de su estado actual.
Los enlaces pueden variar.
Queremos distinguir efectos de la influencia social y la selección social.
Los datos de Coevolve se presentan en forma de una lista
de cuatro redes igraph.
Se trata de redes de amistad entre 37 estudiantes y estado de tabaquismo en cuatro momentos del tiempo.
library(igraph)
library(UserNetR)
library(RSiena)
# Datos de red de amistad (4 periodos de tiempo)
data(Coevolve)
fr_w1 <- igraph::upgrade_graph(Coevolve$fr_w1)
fr_w2 <- igraph::upgrade_graph(Coevolve$fr_w2)
fr_w3 <- igraph::upgrade_graph(Coevolve$fr_w3)
fr_w4 <- igraph::upgrade_graph(Coevolve$fr_w4)## [1] 37 37 37 37
## [1] 179 179 179 179
Visualización:
# Grafico
colors <- c("darkgreen", "lightskyblue2") # azul: fumador, verde: no fumador
shapes <- c("circle", "square") # circulo: mujer, cuadrado: hombre
# Layout Kamada-Kawai
coord <- layout_with_kk(fr_w1)
# Visualizacion (4 periodos de tiempo)
par(mfrow = c(2,2), mar = c(1,1,2,9), xpd = TRUE)
plot(fr_w1, vertex.color = colors[V(fr_w1)$smoke+1],
vertex.shape = shapes[V(fr_w1)$gender],
vertex.size = 10, main = "Oleada 1", vertex.label = NA,
edge.arrow.size = 0.2, layout = coord)
plot(fr_w2, vertex.color = colors[V(fr_w2)$smoke+1],
vertex.shape = shapes[V(fr_w2)$gender],
vertex.size = 10, main = "Oleada 2", vertex.label = NA,
edge.arrow.size = 0.2, layout = coord)
plot(fr_w3, vertex.color = colors[V(fr_w3)$smoke+1],
vertex.shape = shapes[V(fr_w3)$gender],
vertex.size = 10, main = "Oleada 3", vertex.label = NA,
edge.arrow.size = 0.2, layout = coord)
plot(fr_w4, vertex.color = colors[V(fr_w4)$smoke+1],
vertex.shape = shapes[V(fr_w4)$gender],
vertex.size = 10, main = "Oleada 4", vertex.label = NA,
edge.arrow.size = 0.2, layout = coord)
# Leyenda lateral
legend("right", inset = c(-0.45, 0),
legend = c("No fumador", "Fumador", "Mujer", "Hombre"),
col = c("darkgreen", "lightskyblue2", "black", "black"),
pch = c(16, 16, 1, 0), pt.cex = 1.5, bty = "n")
Cambios en el tiempo de la red
Coevolve (Índice de
Jaccard: 0.8)
Podemos observar que la estructura topológica de la red es similar cuando pasamos del tiempo \(t\) a \(t+1\), pues el índice de Jaccard, el cual mide la similitud entre redes, es de 0.8, como no es exactamente 1, las redes no son idénticas. Este es un escenario adecuado para ajuste del modelo SAOM, pues el cambio es gradual, si estamos en presencia de cambios abruptos (Jaccard menor a 0.3), diremos que el cambio no es gradual, y esto dificultará el análisis.
| Oleada | Orden | Densidad | Grado.ent..medio | Fumadores | Modularidad |
|---|---|---|---|---|---|
| 1 | 37 | 0.134 | 4.838 | 8 | 0.001 |
| 2 | 37 | 0.134 | 4.838 | 10 | 0.044 |
| 3 | 37 | 0.134 | 4.838 | 12 | 0.077 |
| 4 | 37 | 0.134 | 4.838 | 14 | 0.129 |
Podemos que el estado de fumador aumenta con el tiempo de forma lineal. Es más, sigue exactamente este patrón:
\[ \text{Fumadores}(t) = 2t + 6, \quad t = 1,2,3,4 \]
# Convertir matrices de adyacencia a tipo "matrix"
matw1 <- as.matrix(as_adjacency_matrix(fr_w1))
matw2 <- as.matrix(as_adjacency_matrix(fr_w2))
matw3 <- as.matrix(as_adjacency_matrix(fr_w3))
matw4 <- as.matrix(as_adjacency_matrix(fr_w4))## [1] FALSE
Veamos la especificación de las variables previo al ajuste del modelo SAOM:
Variable de comportamiento (dependiente): atributo de un nodo que cambia con el tiempo (estado de fumador)
coCovar: atributo de un nodo que no cambia con el
tiempo (género).
varCovar: atributo que sí cambia con el
tiempo.
Dependiente: lazos de amistad.
Nota: las matrices de adyacencia deben ser tipo matrix cuando se construya el arreglo.
# Apilar matrices
# n = 37 individuos
# 4 momentos en el tiempo
# Arreglo con matrices de adyacencia
fr4wav <- sienaDependent(array(c(matw1, matw2, matw3, matw4),
dim = c(37,37,4)), sparse = FALSE)
# Genero (constante)
gender_vect <- V(fr_w1)$gender
gender <- coCovar(gender_vect, centered = FALSE)
# Estado de fumador (comportamiento)
smoke <- array(c(V(fr_w1)$smoke,V(fr_w2)$smoke,
V(fr_w3)$smoke,V(fr_w4)$smoke), dim = c(37,4))
smokebeh <- sienaDependent(smoke, type = "behavior")
# Lazos de amistad (dependiente)
friend <- sienaDataCreate(fr4wav, smokebeh, gender)Dado que estamos explorando un modelo coevolutivo,
examinaremos los efectos sobre la probabilidad de formación de
vínculos (fr4wav) y los efectos sobre los
cambios en el comportamiento
(smokebeh).
# Especificacion de efectos
frndeff <- getEffects(friend)
# Ver effectsDocumentation(frndeff) (824 efectos)# HIPOTESIS: (6 en total)
# 1. Homofilia de genero
frndeff <- includeEffects(frndeff, sameX,
interaction1 = "gender", name = "fr4wav")## effectNumber effectName shortName include fix test initialValue parm
## 1 336 same gender sameX TRUE FALSE FALSE 0 0
# 2. Según el hábito de fumar del individuo, este tiene mayor o menor probabilidad
# de formar una amistad (egoX). (seleccion social)
frndeff <- includeEffects(frndeff, egoX,
interaction1 = "smokebeh", name = "fr4wav")## effectNumber effectName shortName include fix test initialValue parm
## 1 464 smokebeh ego egoX TRUE FALSE FALSE 0 0
# 3. La probabilidad de formar una amistad esta relacionada con el hábito de fumar de los compañeros (altX).
frndeff <- includeEffects(frndeff, altX,
interaction1 = "smokebeh", name = "fr4wav")## effectNumber effectName shortName include fix test initialValue parm
## 1 449 smokebeh alter altX TRUE FALSE FALSE 0 0
# 4. Homofilia de tabaquismo
frndeff <- includeEffects(frndeff, sameX,
interaction1 = "smokebeh", name = "fr4wav")## effectNumber effectName shortName include fix test initialValue parm
## 1 520 same smokebeh sameX TRUE FALSE FALSE 0 0
# 5. La probabilidad de cambiar de comportamiento está relacionada con la similitud
# promedio del hábito de fumar entre todos los individuos vinculados (avSim) (influencia social)
frndeff <- includeEffects(frndeff, avSim,
interaction1 = "fr4wav", name = "smokebeh")## effectNumber effectName shortName include fix test
## 1 724 smokebeh average similarity avSim TRUE FALSE FALSE
## initialValue parm
## 1 0 0
# 6. Tendencia a que los lazos de amistad sean recíprocos
frndeff <- includeEffects(frndeff, recip,
name = "fr4wav")## effectNumber effectName shortName include fix test initialValue parm
## 1 18 reciprocity recip TRUE FALSE FALSE 0 0
## If you use this algorithm object, siena07 will create/use an output file coevolve.txt .
# Semilla
set.seed(999)
# nbrNodes = 3: usa 3 de 4 nucleos del computador
# returnDeps = TRUE: para ver graficos de bondad de ajuste y simulaciones
RSmod1 <- siena07(myalgorithm, data = friend,
effects = frndeff, batch = TRUE,
verbose = FALSE, useCluster = TRUE,
initC = TRUE, nbrNodes = 3, returnDeps = TRUE)##
## Start phase 0
## theta: 2.004 2.004 2.004 -0.808 0.000 0.000 0.000 0.000 0.000 0.208 0.208 0.208 0.562 0.000
##
## Start phase 1
## Phase 1 Iteration 1 Progress: 0%
## Phase 1 Iteration 4 Progress: 0%
## Phase 1 Iteration 10 Progress: 0%
## Phase 1 Iteration 25 Progress: 0%
## Phase 1 Iteration 40 Progress: 0%
## theta: 1.7875 1.8964 1.8750 -0.8904 0.1693 0.0482 0.0449 -0.0250 0.0070 0.2393 0.2190 0.2155 0.6579 1.0000
##
## Start phase 2.1
## Phase 2 Subphase 1 Iteration 1 Progress: 25%
## Phase 2 Subphase 1 Iteration 2 Progress: 25%
## theta 1.4302 1.7547 1.5825 -1.0773 0.4704 0.1674 0.1111 -0.0806 0.0420 0.2724 0.2410 0.2104 0.8269 1.9288
## ac 2.283 0.930 1.908 1.184 1.960 1.634 -3.128 1.039 1.260 -0.600 -5.859 -0.478 -1.138 1.329
## Phase 2 Subphase 1 Iteration 3 Progress: 25%
## Phase 2 Subphase 1 Iteration 4 Progress: 25%
## theta 0.878 1.341 1.114 -1.523 0.955 0.456 0.277 -0.195 0.188 0.350 0.276 0.266 1.682 4.482
## ac 1.8568 1.0195 1.8172 1.1326 1.9105 1.6650 -2.9685 1.0488 1.2742 0.0311 -1.7520 -0.3367 -1.0310 1.0752
## Phase 2 Subphase 1 Iteration 5 Progress: 25%
## Phase 2 Subphase 1 Iteration 6 Progress: 25%
## theta 0.782 1.131 1.071 -1.894 1.184 0.675 0.406 -0.235 0.359 0.366 0.316 0.340 2.484 6.889
## ac 1.1546 1.0328 1.5656 1.1522 1.5150 1.6760 -2.2616 1.0487 0.9603 -0.0842 -1.3836 -0.3329 -0.7847 1.1461
## Phase 2 Subphase 1 Iteration 7 Progress: 25%
## Phase 2 Subphase 1 Iteration 8 Progress: 25%
## theta 0.944 1.189 1.145 -2.225 1.244 0.882 0.476 -0.271 0.539 0.410 0.334 0.365 3.121 8.672
## ac 1.232 0.961 1.559 1.136 1.269 1.567 -0.951 1.005 1.009 -0.330 -1.304 -0.238 -0.225 0.754
## Phase 2 Subphase 1 Iteration 9 Progress: 25%
## Phase 2 Subphase 1 Iteration 10 Progress: 26%
## theta 1.153 1.023 1.060 -2.463 1.070 1.010 0.537 -0.294 0.793 0.314 0.292 0.355 3.347 8.892
## ac 1.151 0.955 1.537 1.125 1.236 1.505 -1.410 1.026 1.032 -0.503 -0.844 -0.196 -0.559 0.758
## theta 1.1404 1.1221 1.1336 -3.1354 0.8443 1.4590 0.7464 -0.0793 1.2447 0.2997 0.3748 0.3609 6.9419 19.5822
## ac 0.0915 0.1746 0.3693 0.7998 0.8163 0.4477 0.0370 0.0740 0.0519 -0.2711 -0.0967 -0.0396 0.0179 0.1147
## theta: 1.1404 1.1221 1.1336 -3.1354 0.8443 1.4590 0.7464 -0.0793 1.2447 0.2997 0.3748 0.3609 6.9419 19.5822
##
## Start phase 2.2
## Phase 2 Subphase 2 Iteration 1 Progress: 33%
## Phase 2 Subphase 2 Iteration 2 Progress: 33%
## Phase 2 Subphase 2 Iteration 3 Progress: 33%
## Phase 2 Subphase 2 Iteration 4 Progress: 33%
## Phase 2 Subphase 2 Iteration 5 Progress: 33%
## Phase 2 Subphase 2 Iteration 6 Progress: 33%
## Phase 2 Subphase 2 Iteration 7 Progress: 33%
## Phase 2 Subphase 2 Iteration 8 Progress: 33%
## Phase 2 Subphase 2 Iteration 9 Progress: 33%
## Phase 2 Subphase 2 Iteration 10 Progress: 33%
## theta 1.1346 1.1320 1.1211 -3.0716 0.8380 1.4184 0.7165 -0.0711 1.2134 0.3101 0.3699 0.3480 7.1181 19.8062
## ac -0.10100 -0.02267 -0.07416 0.00865 0.08278 0.04741 -0.02965 0.15427 0.02463 -0.17435 0.01673 0.01701 -0.01058 0.12173
## theta: 1.1346 1.1320 1.1211 -3.0716 0.8380 1.4184 0.7165 -0.0711 1.2134 0.3101 0.3699 0.3480 7.1181 19.8062
##
## Start phase 2.3
## Phase 2 Subphase 3 Iteration 1 Progress: 41%
## Phase 2 Subphase 3 Iteration 2 Progress: 41%
## Phase 2 Subphase 3 Iteration 3 Progress: 41%
## Phase 2 Subphase 3 Iteration 4 Progress: 41%
## Phase 2 Subphase 3 Iteration 5 Progress: 41%
## Phase 2 Subphase 3 Iteration 6 Progress: 41%
## Phase 2 Subphase 3 Iteration 7 Progress: 41%
## Phase 2 Subphase 3 Iteration 8 Progress: 41%
## Phase 2 Subphase 3 Iteration 9 Progress: 41%
## Phase 2 Subphase 3 Iteration 10 Progress: 41%
## theta 1.1443 1.1373 1.1346 -3.0478 0.8421 1.4179 0.6979 -0.0856 1.1774 0.3027 0.3730 0.3497 7.4799 20.2595
## ac 0.02697 -0.04932 0.00656 0.11967 -0.07553 0.12176 -0.00985 0.04249 0.00895 0.05614 0.03492 -0.02556 -0.01613 0.05810
## theta: 1.1443 1.1373 1.1346 -3.0478 0.8421 1.4179 0.6979 -0.0856 1.1774 0.3027 0.3730 0.3497 7.4799 20.2595
##
## Start phase 2.4
## Phase 2 Subphase 4 Iteration 1 Progress: 51%
## Phase 2 Subphase 4 Iteration 2 Progress: 51%
## Phase 2 Subphase 4 Iteration 3 Progress: 51%
## Phase 2 Subphase 4 Iteration 4 Progress: 51%
## Phase 2 Subphase 4 Iteration 5 Progress: 51%
## Phase 2 Subphase 4 Iteration 6 Progress: 51%
## Phase 2 Subphase 4 Iteration 7 Progress: 51%
## Phase 2 Subphase 4 Iteration 8 Progress: 51%
## Phase 2 Subphase 4 Iteration 9 Progress: 51%
## Phase 2 Subphase 4 Iteration 10 Progress: 51%
## theta 1.1411 1.1344 1.1262 -3.0678 0.8368 1.4221 0.7149 -0.0754 1.2050 0.3108 0.3765 0.3561 6.9482 19.9796
## ac -0.04466 0.05859 0.12891 -0.09815 -0.01110 -0.10218 0.02771 0.04015 0.04192 0.01481 0.04692 -0.00575 -0.04456 -0.04922
## theta: 1.1411 1.1344 1.1262 -3.0678 0.8368 1.4221 0.7149 -0.0754 1.2050 0.3108 0.3765 0.3561 6.9482 19.9796
##
## Start phase 3
## Phase 3 Iteration 1 Progress 67%
Cómo interpretar:
En la columna Estimate veremos cómo contribuye el
efecto de interés a la probabilidad de formación de
enlaces. Si el signo es positivo, la probabilidad
aumenta, si es negativo, disminuye.
Los t-ratio dan cuenta de la falta de
convergencia, es decir, esperamos que sean
pequeños (menores a 0.15).
Para determinar si un efecto es significativo o no, tendremos que calcular \(\frac{\text{Estimate}}{\text{Std. Error}}\) el cual se distribuye \(t\), pero asintóticamente se comporta como una normal estándar, luego se verá si es mayor que 1.96 o no. Si lo es, diremos que el efecto es significativo al 95% de confianza.
## Estimates, standard errors and convergence t-ratios
##
## Estimate Standard Convergence
## Error t-ratio
## Network Dynamics
## 1. rate constant fr4wav rate (period 1) 1.1411 ( 0.2009 ) -0.0080
## 2. rate constant fr4wav rate (period 2) 1.1344 ( 0.2589 ) 0.0753
## 3. rate constant fr4wav rate (period 3) 1.1262 ( 0.2054 ) 0.0197
## 4. eval outdegree (density) -3.0678 ( 0.4092 ) -0.0073
## 5. eval reciprocity 0.8368 ( 0.2365 ) -0.0118
## 6. eval same gender 1.4221 ( 0.3029 ) -0.0192
## 7. eval smokebeh alter 0.7149 ( 0.3748 ) 0.0252
## 8. eval smokebeh ego -0.0754 ( 0.3003 ) -0.0017
## 9. eval same smokebeh 1.2050 ( 0.4437 ) -0.0057
##
## Behavior Dynamics
## 10. rate rate smokebeh (period 1) 0.3108 ( 0.1782 ) -0.0158
## 11. rate rate smokebeh (period 2) 0.3765 ( 0.2742 ) 0.0306
## 12. rate rate smokebeh (period 3) 0.3561 ( 0.1936 ) 0.0305
## 13. eval smokebeh linear shape 6.9482 ( 49.4802 ) 0.0049
## 14. eval smokebeh average similarity 19.9796 ( 149.7879 ) -0.0139
##
## Overall maximum convergence ratio: 0.1029
##
##
## Total of 2281 iteration steps.
##
## Covariance matrix of estimates (correlations below diagonal)
##
## 0.040 0.005 -0.001 0.001 0.000 0.003 -0.002 -0.001 -0.004 0.003 -0.002 -0.003 -0.732 -2.287
## 0.101 0.067 -0.001 0.010 -0.003 -0.005 0.001 -0.011 -0.003 0.008 -0.031 -0.013 -7.523 -23.090
## -0.031 -0.017 0.042 0.005 -0.001 -0.002 -0.003 0.001 -0.004 0.001 0.000 -0.004 0.172 0.351
## 0.006 0.095 0.065 0.167 -0.002 -0.079 -0.068 -0.020 -0.133 0.004 -0.014 -0.004 -1.116 -3.511
## 0.002 -0.042 -0.023 -0.018 0.056 -0.011 -0.004 -0.009 -0.012 -0.001 0.000 -0.001 0.039 0.197
## 0.043 -0.068 -0.037 -0.634 -0.150 0.092 0.000 0.005 0.006 -0.004 0.015 0.007 2.983 9.187
## -0.022 0.006 -0.036 -0.446 -0.049 -0.003 0.141 -0.002 0.101 0.000 -0.012 -0.007 -2.771 -8.626
## -0.022 -0.139 0.014 -0.164 -0.124 0.056 -0.018 0.090 0.032 -0.006 0.016 0.004 3.749 11.342
## -0.042 -0.022 -0.039 -0.732 -0.113 0.042 0.608 0.244 0.197 0.002 -0.006 -0.002 -3.019 -9.279
## 0.073 0.175 0.016 0.057 -0.013 -0.078 0.004 -0.118 0.031 0.032 -0.010 -0.004 -2.922 -8.708
## -0.043 -0.435 -0.005 -0.125 0.004 0.185 -0.113 0.193 -0.047 -0.212 0.075 0.015 8.570 26.457
## -0.078 -0.258 -0.105 -0.051 -0.030 0.111 -0.093 0.077 -0.028 -0.115 0.292 0.037 3.819 11.832
## -0.074 -0.587 0.017 -0.055 0.003 0.199 -0.149 0.252 -0.138 -0.331 0.632 0.399 2448.290 7399.333
## -0.076 -0.595 0.011 -0.057 0.006 0.202 -0.154 0.252 -0.140 -0.326 0.644 0.408 0.998 22436.421
##
## Derivative matrix of expected statistics X by parameters:
##
## 29.221 0.000 0.000 1.510 -4.767 -1.360 -0.205 -1.430 4.353 -0.338 0.000 0.000 -0.447 0.502
## 0.000 28.603 0.000 -0.523 -3.546 -2.925 1.075 -1.716 2.786 0.000 0.042 0.000 0.217 -0.233
## 0.000 0.000 27.656 -0.110 -1.706 -0.620 1.527 -0.238 3.090 0.000 0.000 -0.475 -1.024 0.617
## 2.226 0.475 0.638 100.665 64.649 85.932 -2.646 -4.755 66.215 0.019 0.620 0.280 -0.072 0.913
## -0.939 -0.458 0.434 32.722 59.599 30.843 -1.132 -0.236 21.909 0.264 0.228 0.267 0.975 0.327
## 0.529 -0.875 0.488 85.957 61.254 85.161 -2.372 -3.521 55.966 0.254 0.592 0.214 -0.179 0.980
## 0.077 0.661 0.501 1.085 -0.482 0.705 15.543 2.637 -7.869 0.308 0.456 0.135 1.039 -0.353
## 0.114 -0.200 0.674 -2.670 1.619 -1.797 2.608 16.733 -7.996 -0.028 0.373 0.058 0.043 -0.143
## 2.524 1.206 0.866 67.066 44.006 56.516 -9.239 -7.846 59.577 -0.319 -0.228 -0.166 -0.731 0.547
## -1.707 0.000 0.000 -2.822 -0.045 -1.912 0.604 2.261 -5.196 11.109 0.000 0.000 4.439 2.410
## 0.000 1.129 0.000 4.742 1.912 2.926 1.826 1.890 -2.279 0.000 10.293 0.000 6.601 0.182
## 0.000 0.000 4.164 -1.313 -0.577 -1.421 2.914 2.676 -6.913 0.000 0.000 10.766 7.967 -0.315
## -0.070 -0.313 -0.120 -0.339 0.106 -0.181 0.181 0.383 -0.573 0.186 0.251 0.161 1.614 -0.772
## 0.027 0.131 0.037 0.121 -0.035 0.060 -0.061 -0.142 0.215 -0.058 -0.096 -0.060 -0.545 0.271
##
## Covariance matrix of X (correlations below diagonal):
##
## 34.083 1.910 -1.209 3.732 -7.305 -0.085 -0.176 -1.045 6.946 -0.287 0.230 -0.458 -0.261 0.509
## 0.056 33.707 -1.025 1.256 -6.446 -1.619 0.887 -1.084 2.984 -0.081 0.083 0.161 0.374 -0.820
## -0.037 -0.031 31.681 2.346 -1.134 0.885 1.801 1.076 4.881 0.317 0.155 -0.311 -0.397 0.559
## 0.063 0.021 0.041 103.567 66.290 89.536 -4.793 -2.391 67.559 0.403 0.308 0.347 -1.895 4.081
## -0.112 -0.100 -0.018 0.584 124.354 65.441 -5.364 1.561 42.098 1.029 -0.010 0.291 1.601 2.112
## -0.002 -0.030 0.017 0.931 0.621 89.284 -4.765 -1.498 57.357 0.603 0.288 0.355 -1.555 3.399
## -0.007 0.033 0.070 -0.103 -0.105 -0.110 21.102 3.330 -12.774 0.297 0.972 0.546 4.317 -2.071
## -0.039 -0.041 0.042 -0.051 0.030 -0.034 0.158 21.134 -9.977 0.438 1.652 0.602 4.214 -2.245
## 0.140 0.061 0.102 0.783 0.446 0.716 -0.328 -0.256 71.792 -1.080 -2.388 -1.975 -5.922 3.748
## -0.026 -0.007 0.030 0.021 0.049 0.034 0.034 0.050 -0.067 3.594 -0.044 0.085 2.635 -0.346
## 0.019 0.007 0.013 0.015 0.000 0.015 0.101 0.172 -0.135 -0.011 4.366 0.009 3.354 -0.706
## -0.041 0.015 -0.029 0.018 0.014 0.020 0.063 0.069 -0.123 0.024 0.002 3.601 3.218 -0.809
## -0.010 0.015 -0.016 -0.042 0.032 -0.037 0.212 0.206 -0.157 0.313 0.362 0.382 19.708 -9.614
## 0.027 -0.043 0.030 0.122 0.058 0.109 -0.137 -0.149 0.135 -0.056 -0.103 -0.130 -0.659 10.796
Interpretación:
La formación de amistades es más probable con personas del mismo género y el mismo hábito de fumar.
Los efectos de tabaquismo de las personas y del ego no son significativos.
El estado de fumador aumenta con el tiempo de forma lineal. No se cataloga como efecto significativo en el modelo, porque el poder de detección para este efecto crece en el orden \(O(n)\), siendo \(n\) el número de nodos de la red, y dado que son pocos actores (además de pocos instantes de tiempo observados), el error estándar de la estimación es muy alto.
Se evaluará la bondad de ajuste sobre del modelo sobre el grado de entrada, propiedad de las redes simuladas que no se incluyó formalmente como predictor en el modelo ajustado.
##
## 1 2 3 4 5 6 7 8 9 10
## 2 3 7 6 5 4 6 2 1 1
# Evaluar bondad de ajuste
gofi <- sienaGOF(RSmod1, IndegreeDistribution,
levls = 1:10, verbose = FALSE, join = TRUE,
varName="fr4wav")
# Grafico de bondad de ajuste sobre grados de entrada (1 a 10)
plot(gofi, ylab = "Estadística",
main = "Bondad de ajuste de la distribución del grado de entrada")El modelo reproduce correctamente el grado de popularidad de los actores.
El valor-p de alrededor de 0.8 hace referencia a la ubicación de la distancia de Mahalanobis de la estadística de interés observada, con respecto a la media de la misma en las redes simuladas. Se espera que el valor-p sea cercano a 1, porque eso nos dirá que la distancia de Mahalanobis con respecto a la media es casi 0, es decir, la estadística observada y la media de la misma, dada por las simulaciones, son muy cercanas.
library(igraph)
el <- RSmod1$sims[[500]][[1]][[1]][[3]]
sb <- RSmod1$sims[[500]][[1]][[2]][[3]]
fr_w4_sim <- graph_from_data_frame(el,directed = TRUE)
V(fr_w4_sim)$smoke <- sb
V(fr_w4_sim)$gender <- V(fr_w4)$gender
colors <- c("darkgreen","lightskyblue2")
coord <- layout_with_kk(fr_w4)
# Visualizacion de observada vs. simulada
layout(matrix(c(1, 2,
3, 3), nrow = 2, byrow = TRUE),
heights = c(10, 1))
# Gráfico 1
par(mar = c(1,1,3,1))
plot(fr_w4,
vertex.color = colors[V(fr_w4)$smoke+1],
vertex.shape = shapes[V(fr_w4)$gender],
vertex.size = 10,
main = "Observada - Oleada 4",
vertex.label = NA,
edge.arrow.size = 0.2,
layout = coord)
# Gráfico 2
par(mar = c(1,1,3,1))
plot(fr_w4_sim,
vertex.color = colors[V(fr_w4_sim)$smoke+1],
vertex.shape = shapes[V(fr_w4_sim)$gender],
vertex.size = 10,
main = "Simulada - Oleada 4",
vertex.label = NA,
edge.arrow.size = 0.2,
layout = coord)
# Panel para la leyenda
par(mar = c(0,0,0,0))
plot.new()
legend("center",
legend = c("No fumador", "Fumador", "Mujer", "Hombre"),
col = c("darkgreen", "lightskyblue2", "black", "black"),
pch = c(16, 16, 1, 0), horiz = TRUE, pt.cex = 1.4, bty = "n")Comparación de red observada y red simulada
A simple vista la red parece provenir del mismo proceso generador dado por el modelo.
Kolaczyk, E. D. (2020). Statistical analysis of network data with R. New York, Springer. https://link.springer.com/book/10.1007/978-3-030-44129-6
Luke, D. A. (2015). A user’s guide to network analysis in R. New York, Springer. https://link.springer.com/book/10.1007/978-3-319-23883-8
Statnet Development Team. (2025). Temporal exponential random graph models (tergms) for dynamic network modeling in statnet. Descargado 2026-06-18, de https://statnet.org/workshop-tergm/tergm_tutorial.html