Install required packages

# install.packages("rmarkdown")
# install.packages("multdyn")
# install.packages("R.matlab")
# install.packages("reshape2")
# install.packages("cowplot")
# install.packages("png")
# install.packages("testit")

Load libraries

library(multdyn)
library(R.matlab)
library(testit)
library(ggplot2)
library(cowplot)
library(reshape2)
library(png)

Variables

PATH_HOME = "/home/simon"
PATH = file.path(PATH_HOME, "Dropbox", "Data", "DGM")  # Project path
PATH_FIG  = file.path(PATH, 'figures') # path where figures will be stored
PATH_TS = file.path(PATH, 'data', 'sim', 'timeseries') # path where time series data is
PATH_NET = file.path(PATH, 'data', 'sim', 'nets') # path where network data is

5-node network simulation

Estimate networks

N=50 # Number of simulated subjects/datasets
Nn=5 # Number of nodes
# ts.int1 = readMat(file.path(PATH_TS,'Nn5_TR2_Noise01_HRF1_Mod1_Inj1_F13.mat'))$gfy2s
# ex = fw = bw = bo = list()
# for (i in 1:N) {
#   print(sprintf("Estimating subject %03d", i))
#   ex[[i]] = subject(ts.int1[,,i], method = "exhaustive")
#   fw[[i]] = subject(ts.int1[,,i], method = "forward")
#   bw[[i]] = subject(ts.int1[,,i], method = "backward")
#   bo[[i]] = subject(ts.int1[,,i], method = "both")
# }
# 
# f=file(file.path(PATH,"results", "DGM-Step.RData"))
# save(ex, fw, bw, bo, file = f, compress = T)
# close(f)
load(file.path(PATH, 'results', 'DGM-Step.RData'))

Compare stepwise

g.ex = dgm.group(ex)
g.fw = dgm.group(fw)
g.bw = dgm.group(bw)
g.bo = dgm.group(bo)
prc = array(NA,dim = c(1,3))
colnames(prc) = c("forward", "backward", "both")
prc[1] = (sum(g.ex$am==g.fw$am)-(Nn*N))/(Nn*(Nn-1)*N)
prc[2] = (sum(g.ex$am==g.bw$am)-(Nn*N))/(Nn*(Nn-1)*N)
prc[3] = (sum(g.ex$am==g.bo$am)-(Nn*N))/(Nn*(Nn-1)*N)
prc=round(prc*100, 2)
print(prc)
     forward backward both
[1,]    97.9     97.8 99.8

Stepwise both forward and backward combined is best and almost identical to exhaustive search.

10-node network ICA fMRI

Estimating stepwise 10 nodes

# load(file.path(PATH, 'results', 'RSN10-ts.RData'))
# subj_r1 = vector(mode = "list", length = N)
# subj_r2 = vector(mode = "list", length = N)
# subj_r3 = vector(mode = "list", length = N)
# subj_r4 = vector(mode = "list", length = N)
# 
# for (s in 1:N) {
#   subj_r1[[s]] = read.subject(PATH_NET_BO, sprintf("%s_Run_%03d", SUBJECTS[s], 1), Nn)
#   subj_r2[[s]] = read.subject(PATH_NET_BO, sprintf("%s_Run_%03d", SUBJECTS[s], 2), Nn)
#   subj_r3[[s]] = read.subject(PATH_NET_BO, sprintf("%s_Run_%03d", SUBJECTS[s], 3), Nn)
#   subj_r4[[s]] = read.subject(PATH_NET_BO, sprintf("%s_Run_%03d", SUBJECTS[s], 4), Nn)
#   print(sprintf("Subject %03d loaded",s))
# }
# 
# dgm.net10.bo.r1 = dgm.group(subj_r1)
# dgm.net10.bo.r2 = dgm.group(subj_r2)
# dgm.net10.bo.r3 = dgm.group(subj_r3)
# dgm.net10.bo.r4 = dgm.group(subj_r4)
# 
# f=file(file.path(PATH,"results", "DGM-RSN10_bo.RData"))
# save(dgm.net10.bo.r1, dgm.net10.bo.r2, dgm.net10.bo.r3, dgm.net10.bo.r4, file = f, compress = T)
# close(f)
load(file.path(PATH, 'results', 'DGM-RSN10_bo.RData'))
load(file.path(PATH, 'results', 'DGM-RSN10.RData'))

Compare stepwise

N=500
Nn=10
prc10 = array(NA,dim = c(1,4))
colnames(prc10) = c("run 1", "run 2", "run 3", "run 4")
prc10[1] = (sum(dgm.net10.r1$am==dgm.net10.bo.r1$am)-(Nn*N))/(Nn*(Nn-1)*N)
prc10[2] = (sum(dgm.net10.r2$am==dgm.net10.bo.r2$am)-(Nn*N))/(Nn*(Nn-1)*N)
prc10[3] = (sum(dgm.net10.r3$am==dgm.net10.bo.r3$am)-(Nn*N))/(Nn*(Nn-1)*N)
prc10[4] = (sum(dgm.net10.r4$am==dgm.net10.bo.r4$am)-(Nn*N))/(Nn*(Nn-1)*N)
prc10=round(prc10*100, 2)
print(prc10)
     run 1 run 2 run 3 run 4
[1,] 99.36 99.52 99.49 99.52

Plot

p1=ggplot(melt(prc), aes(x=Var2, y=value, fill=Var2)) + 
  geom_bar(stat="identity") +
  geom_text(aes(label=as.vector(prc)), size=4, vjust=-0.3) +
  ggtitle("5-node network") + ylim(c(0,105)) + ylab("percent") +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        legend.title=element_blank())
p2=ggplot(melt(prc10), aes(x=Var2, y=value, fill=Var2)) + 
  geom_bar(stat="identity") +
  geom_text(aes(label=as.vector(prc10)), size=4, vjust=-0.3) +
  ggtitle("10-node RSNs") + ylim(c(0,105)) + ylab("percent") +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        legend.title=element_blank())
plot_grid(p1, p2, ncol=2, rel_widths = c(1, 1))

LS0tCnRpdGxlOiAiREdNLVN0ZXB3aXNlIgphdXRob3I6ICJTaW1vbiBTY2h3YWIiCmRhdGU6ICIyNSBPY3QgMjAxNyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgSW5zdGFsbCByZXF1aXJlZCBwYWNrYWdlcyAKYGBge3J9CiMgaW5zdGFsbC5wYWNrYWdlcygicm1hcmtkb3duIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJtdWx0ZHluIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJSLm1hdGxhYiIpCiMgaW5zdGFsbC5wYWNrYWdlcygicmVzaGFwZTIiKQojIGluc3RhbGwucGFja2FnZXMoImNvd3Bsb3QiKQojIGluc3RhbGwucGFja2FnZXMoInBuZyIpCiMgaW5zdGFsbC5wYWNrYWdlcygidGVzdGl0IikKYGBgCgojIyBMb2FkIGxpYnJhcmllcyAKYGBge3IgbWVzc2FnZT1GQUxTRX0KbGlicmFyeShtdWx0ZHluKQpsaWJyYXJ5KFIubWF0bGFiKQpsaWJyYXJ5KHRlc3RpdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkocG5nKQpgYGAKCiMjIFZhcmlhYmxlcwpgYGB7cn0KUEFUSF9IT01FID0gIi9ob21lL3NpbW9uIgpQQVRIID0gZmlsZS5wYXRoKFBBVEhfSE9NRSwgIkRyb3Bib3giLCAiRGF0YSIsICJER00iKSAgIyBQcm9qZWN0IHBhdGgKUEFUSF9GSUcgID0gZmlsZS5wYXRoKFBBVEgsICdmaWd1cmVzJykgIyBwYXRoIHdoZXJlIGZpZ3VyZXMgd2lsbCBiZSBzdG9yZWQKUEFUSF9UUyA9IGZpbGUucGF0aChQQVRILCAnZGF0YScsICdzaW0nLCAndGltZXNlcmllcycpICMgcGF0aCB3aGVyZSB0aW1lIHNlcmllcyBkYXRhIGlzClBBVEhfTkVUID0gZmlsZS5wYXRoKFBBVEgsICdkYXRhJywgJ3NpbScsICduZXRzJykgIyBwYXRoIHdoZXJlIG5ldHdvcmsgZGF0YSBpcwpgYGAKIyMgNS1ub2RlIG5ldHdvcmsgc2ltdWxhdGlvbgoKIyMjIEVzdGltYXRlIG5ldHdvcmtzCmBgYHtyfQpOPTUwICMgTnVtYmVyIG9mIHNpbXVsYXRlZCBzdWJqZWN0cy9kYXRhc2V0cwpObj01ICMgTnVtYmVyIG9mIG5vZGVzCgojIHRzLmludDEgPSByZWFkTWF0KGZpbGUucGF0aChQQVRIX1RTLCdObjVfVFIyX05vaXNlMDFfSFJGMV9Nb2QxX0luajFfRjEzLm1hdCcpKSRnZnkycwoKIyBleCA9IGZ3ID0gYncgPSBibyA9IGxpc3QoKQojIGZvciAoaSBpbiAxOk4pIHsKIyAgIHByaW50KHNwcmludGYoIkVzdGltYXRpbmcgc3ViamVjdCAlMDNkIiwgaSkpCiMgICBleFtbaV1dID0gc3ViamVjdCh0cy5pbnQxWywsaV0sIG1ldGhvZCA9ICJleGhhdXN0aXZlIikKIyAgIGZ3W1tpXV0gPSBzdWJqZWN0KHRzLmludDFbLCxpXSwgbWV0aG9kID0gImZvcndhcmQiKQojICAgYndbW2ldXSA9IHN1YmplY3QodHMuaW50MVssLGldLCBtZXRob2QgPSAiYmFja3dhcmQiKQojICAgYm9bW2ldXSA9IHN1YmplY3QodHMuaW50MVssLGldLCBtZXRob2QgPSAiYm90aCIpCiMgfQojIAojIGY9ZmlsZShmaWxlLnBhdGgoUEFUSCwicmVzdWx0cyIsICJER00tU3RlcC5SRGF0YSIpKQojIHNhdmUoZXgsIGZ3LCBidywgYm8sIGZpbGUgPSBmLCBjb21wcmVzcyA9IFQpCiMgY2xvc2UoZikKCmxvYWQoZmlsZS5wYXRoKFBBVEgsICdyZXN1bHRzJywgJ0RHTS1TdGVwLlJEYXRhJykpCmBgYAoKIyMjIENvbXBhcmUgc3RlcHdpc2UKYGBge3J9CmcuZXggPSBkZ20uZ3JvdXAoZXgpCmcuZncgPSBkZ20uZ3JvdXAoZncpCmcuYncgPSBkZ20uZ3JvdXAoYncpCmcuYm8gPSBkZ20uZ3JvdXAoYm8pCgpwcmMgPSBhcnJheShOQSxkaW0gPSBjKDEsMykpCmNvbG5hbWVzKHByYykgPSBjKCJmb3J3YXJkIiwgImJhY2t3YXJkIiwgImJvdGgiKQpwcmNbMV0gPSAoc3VtKGcuZXgkYW09PWcuZnckYW0pLShObipOKSkvKE5uKihObi0xKSpOKQpwcmNbMl0gPSAoc3VtKGcuZXgkYW09PWcuYnckYW0pLShObipOKSkvKE5uKihObi0xKSpOKQpwcmNbM10gPSAoc3VtKGcuZXgkYW09PWcuYm8kYW0pLShObipOKSkvKE5uKihObi0xKSpOKQpwcmM9cm91bmQocHJjKjEwMCwgMikKcHJpbnQocHJjKQpgYGAKClN0ZXB3aXNlIGJvdGggZm9yd2FyZCBhbmQgYmFja3dhcmQgY29tYmluZWQgaXMgYmVzdCBhbmQgYWxtb3N0IGlkZW50aWNhbCB0byBleGhhdXN0aXZlIHNlYXJjaC4KCiMjIDEwLW5vZGUgbmV0d29yayBJQ0EgZk1SSQoKIyMjIEVzdGltYXRpbmcgc3RlcHdpc2UgMTAgbm9kZXMKYGBge3J9CiMgbG9hZChmaWxlLnBhdGgoUEFUSCwgJ3Jlc3VsdHMnLCAnUlNOMTAtdHMuUkRhdGEnKSkKCiMgc3Vial9yMSA9IHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBOKQojIHN1YmpfcjIgPSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gTikKIyBzdWJqX3IzID0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IE4pCiMgc3Vial9yNCA9IHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBOKQojIAojIGZvciAocyBpbiAxOk4pIHsKIyAgIHN1YmpfcjFbW3NdXSA9IHJlYWQuc3ViamVjdChQQVRIX05FVF9CTywgc3ByaW50ZigiJXNfUnVuXyUwM2QiLCBTVUJKRUNUU1tzXSwgMSksIE5uKQojICAgc3Vial9yMltbc11dID0gcmVhZC5zdWJqZWN0KFBBVEhfTkVUX0JPLCBzcHJpbnRmKCIlc19SdW5fJTAzZCIsIFNVQkpFQ1RTW3NdLCAyKSwgTm4pCiMgICBzdWJqX3IzW1tzXV0gPSByZWFkLnN1YmplY3QoUEFUSF9ORVRfQk8sIHNwcmludGYoIiVzX1J1bl8lMDNkIiwgU1VCSkVDVFNbc10sIDMpLCBObikKIyAgIHN1YmpfcjRbW3NdXSA9IHJlYWQuc3ViamVjdChQQVRIX05FVF9CTywgc3ByaW50ZigiJXNfUnVuXyUwM2QiLCBTVUJKRUNUU1tzXSwgNCksIE5uKQojICAgcHJpbnQoc3ByaW50ZigiU3ViamVjdCAlMDNkIGxvYWRlZCIscykpCiMgfQojIAojIGRnbS5uZXQxMC5iby5yMSA9IGRnbS5ncm91cChzdWJqX3IxKQojIGRnbS5uZXQxMC5iby5yMiA9IGRnbS5ncm91cChzdWJqX3IyKQojIGRnbS5uZXQxMC5iby5yMyA9IGRnbS5ncm91cChzdWJqX3IzKQojIGRnbS5uZXQxMC5iby5yNCA9IGRnbS5ncm91cChzdWJqX3I0KQojIAojIGY9ZmlsZShmaWxlLnBhdGgoUEFUSCwicmVzdWx0cyIsICJER00tUlNOMTBfYm8uUkRhdGEiKSkKIyBzYXZlKGRnbS5uZXQxMC5iby5yMSwgZGdtLm5ldDEwLmJvLnIyLCBkZ20ubmV0MTAuYm8ucjMsIGRnbS5uZXQxMC5iby5yNCwgZmlsZSA9IGYsIGNvbXByZXNzID0gVCkKIyBjbG9zZShmKQoKbG9hZChmaWxlLnBhdGgoUEFUSCwgJ3Jlc3VsdHMnLCAnREdNLVJTTjEwX2JvLlJEYXRhJykpCmxvYWQoZmlsZS5wYXRoKFBBVEgsICdyZXN1bHRzJywgJ0RHTS1SU04xMC5SRGF0YScpKQpgYGAKCiMjIyBDb21wYXJlIHN0ZXB3aXNlCmBgYHtyfQpOPTUwMApObj0xMApwcmMxMCA9IGFycmF5KE5BLGRpbSA9IGMoMSw0KSkKY29sbmFtZXMocHJjMTApID0gYygicnVuIDEiLCAicnVuIDIiLCAicnVuIDMiLCAicnVuIDQiKQpwcmMxMFsxXSA9IChzdW0oZGdtLm5ldDEwLnIxJGFtPT1kZ20ubmV0MTAuYm8ucjEkYW0pLShObipOKSkvKE5uKihObi0xKSpOKQpwcmMxMFsyXSA9IChzdW0oZGdtLm5ldDEwLnIyJGFtPT1kZ20ubmV0MTAuYm8ucjIkYW0pLShObipOKSkvKE5uKihObi0xKSpOKQpwcmMxMFszXSA9IChzdW0oZGdtLm5ldDEwLnIzJGFtPT1kZ20ubmV0MTAuYm8ucjMkYW0pLShObipOKSkvKE5uKihObi0xKSpOKQpwcmMxMFs0XSA9IChzdW0oZGdtLm5ldDEwLnI0JGFtPT1kZ20ubmV0MTAuYm8ucjQkYW0pLShObipOKSkvKE5uKihObi0xKSpOKQpwcmMxMD1yb3VuZChwcmMxMCoxMDAsIDIpCnByaW50KHByYzEwKQpgYGAKCgojIyBQbG90CmBgYHtyIGZpZy5oZWlnaHQ9Mi41LCBmaWcud2lkdGg9N30KcDE9Z2dwbG90KG1lbHQocHJjKSwgYWVzKHg9VmFyMiwgeT12YWx1ZSwgZmlsbD1WYXIyKSkgKyAKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPWFzLnZlY3RvcihwcmMpKSwgc2l6ZT00LCB2anVzdD0tMC4zKSArCiAgZ2d0aXRsZSgiNS1ub2RlIG5ldHdvcmsiKSArIHlsaW0oYygwLDEwNSkpICsgeWxhYigicGVyY2VudCIpICsKICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpCgpwMj1nZ3Bsb3QobWVsdChwcmMxMCksIGFlcyh4PVZhcjIsIHk9dmFsdWUsIGZpbGw9VmFyMikpICsgCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1hcy52ZWN0b3IocHJjMTApKSwgc2l6ZT00LCB2anVzdD0tMC4zKSArCiAgZ2d0aXRsZSgiMTAtbm9kZSBSU05zIikgKyB5bGltKGMoMCwxMDUpKSArIHlsYWIoInBlcmNlbnQiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKQoKcGxvdF9ncmlkKHAxLCBwMiwgbmNvbD0yLCByZWxfd2lkdGhzID0gYygxLCAxKSkKYGBgCgo=