knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

Generate network dependence

We provide two data generative process for generating network dependent outcomes--network dependence due to (1) direct transmission and (2) latent variable dependence.

Under direct transmission, peer.process provides time-evolving outcomes where $Y^{t}{i}$ depends on ${ Y^{t}{j} : j \mbox{ is an adjacent peers of } i }$.

library(knitr)
library(netdep)
library(MASS)
library(mvrtn)
library(igraph)
library(igraphdata)
# generate network
G = latent.netdep(n.node = 200, rho = 0.2, dep.factor = -1)
A = as.matrix(get.adjacency(G))
outcomes = peer.process(A, max.time = 3, mprob = 0.6, epsilon = 0.1)
names(outcomes)
result0 = make.permute.moran(A, outcomes$time0, np = 100)
result1 = make.permute.moran(A, outcomes$time1, np = 100)
result2 = make.permute.moran(A, outcomes$time2, np = 100)
result3 = make.permute.moran(A, outcomes$time3, np = 100)
kable(cbind( c("t=0", "t=1", "t=2", "t=3"),
  round(c(result0$moran, result1$moran, result2$moran, result3$moran),2),
  round(c(result0$pval.permute, result1$pval.permute, result2$pval.permute, result3$pval.permute),2)), row.names = NA, col.names = c("Transmission time", "Moran's I", "P-value (permutation)"), 
      caption = "Direct transmission")

Note from the above table that as t increases, Moran's $I$ statistic increases and p-value decreases.

Next we generate network dependent continuous outcomes via (2) latent variable dependence, and then transform those into categorical outcomes, where $\Phi$ statistic can be applicable to test network dependence.

G = latent.netdep(n.node = 200, rho = 0.4, dep.factor = -1)
subG = snowball.sampling(G, 100)$subG
A = as.matrix(get.adjacency(subG))
conti.Y = V(subG)$outcome 
cate.Y = ifelse(conti.Y < quantile(conti.Y, 0.25), 1, 4)
cate.Y = ifelse(conti.Y < quantile(conti.Y, 0.60) & conti.Y >= quantile(conti.Y, 0.25), 2, cate.Y)
cate.Y = ifelse(conti.Y < quantile(conti.Y, 0.80) & conti.Y >= quantile(conti.Y, 0.60), 3, cate.Y)
table(cate.Y)
result = make.permute.Phi(A, cate.Y, 100)
print(result$phi)
print(result$pval.permute)

Real Data

We first apply two test statistics in binary case -- faction of karate club.

library(igraphdata)
data(karate)
A = as.matrix(as_adjacency_matrix(karate, attr= "weight", sparse = T)) # weighted adjacency matrix
Y = V(karate)$Faction
table(Y) # binary
result.moran = make.permute.moran(A, Y, np = 100)
print(result.moran$moran)
print(result.moran$pval.permute)
result.phi = make.permute.Phi(A, Y, np = 100)
print(result.phi$phi)
print(result.phi$pval.permute)

Observe that Moran's $I$ and $\Phi$ print out the same statistis.

When outcome is categorical (nominal) but not binary, we can use $\Phi$.

data(UKfaculty)
A = as.matrix(as_adjacency_matrix(UKfaculty, attr= "weight", sparse = T)) # weighted adjacency matrix
Y = V(UKfaculty)$Group
table(Y)
result = make.permute.Phi(A, Y, np = 50)
print(result$phi)
print(result$pval.permute)

More details on the method and applications can be found in Arxiv paper.



youjin1207/netdep documentation built on May 30, 2019, 12:48 p.m.