Updated version of NCT now on GitHub


The NCT package is updated! I added example code of the new functionalities in the help file and hope this will tackle most of the questions.

You can now use NCT in combination with the estimateNetwork() function. This enables using various network estimation methods (e.g., mgm). Also, you can find example code for assessing differences in various centrality measures (e.g., bridge centrality). You can find the most recent version on GitHub. I copied the example code below for your convenience.


### Simulate binary datasets under null hypothesis:
### underlying network structures are similar
# Input:
N <- 6 # Number of nodes
nSample <- 500 # Number of samples

# Ising parameters:
Graph <- matrix(sample(0:1,N^2,TRUE,prob = c(0.8, 0.2)),N,N) * runif(N^2,0.5,2)
Graph <- pmax(Graph,t(Graph))
Graph[4,1] <- Graph[4,1]*-1
Graph[1,4] <- Graph[1,4]*-1
Graph[5,1] <- Graph[5,1]*-1
Graph[1,5] <- Graph[1,5]*-1
Graph[6,1] <- Graph[6,1]*-1
Graph[1,6] <- Graph[1,6]*-1
diag(Graph) <- 0
Thresh <- -rowSums(Graph) / 2

# Simulate:
data1 <- IsingSampler(nSample, Graph, Thresh)
data2 <- IsingSampler(nSample, Graph, Thresh)
colnames(data1) <- colnames(data2) <- c('V1', 'V2', 'V3', 'V4', 'V5', 'V6')

### Compare networks of data sets using NCT ###
## Networks can be compared by either (1) feeding the data directly into NCT (whereby 
## you need to specify arguments such as "gamma" and "binary.data") or (2) by using 
## estimateNetwork() (bootnet package) and feeding that output into NCT. For the latter 
## option, we refer to the help file of  estimateNetwork() for its usage. Below, both 
## options are illustrated. We recommend using estimateNetwork(), since this function 
## has implemented many network estimation methods.

## gamma = 0 (in estimateNetwork this hyperparameter is called "tuning"; to illustrate 
# how to specify a different value than the default)
## iterations (it) set to 10 to save time
## Note: Low number of iterations can give unreliable results; should be 1000 at least

## Testing whether there are differences in the three aspects that are validated 
# (network invariance, global strength, edge weight)
## 2 edges are tested here: between variable 1 and 2, and between 3 and 6 (can be 
# "list(c(2,1),c(6,3))" as well)

## (1) Feeding data directly into NCT
NCT_a <- NCT(data1, data2, gamma=0, it=10, binary.data = TRUE, 
             test.edges=TRUE, edges=list(c(1,2),c(3,6)))
## Plot results of global strength invariance test (not reliable with only 10 
# permutations!)
plot(NCT_a, what="strength")

## (2) Feeding the estimateNetwork() output into NCT
est_1 <- estimateNetwork(data1, default = "IsingFit", tuning = 0)
est_2 <- estimateNetwork(data2, default = "IsingFit", tuning = 0)
## When using estimateNetwork() output, there is no need to specify gamma and binary.data 
## This yields similar output as NCT_a
NCT_b <- NCT(est_1, est_2, it=10, test.edges=TRUE, 

## Next, an example of testing whether there are differences in node strength 
# when data is paired (e.g., a group which is measured pre- and post-treatement). 
# Also, here you can see how to specify that you want to take the sign of node strength 
# into account (by default, the absolute value is taken and, therefore, the sign is 
# ignored).

## abs = FALSE
NCT_c = NCT(est_1, est_2, paired = TRUE, abs = FALSE, test.edges = TRUE, 
edges = list(c(1,2),c(3,6)), test.centrality = TRUE, 
centrality = c("strength"), nodes = "all", it=10)

## Finally, an example how to test for differences in centrality (e.g., expectedInfluence)

NCT_d = NCT(est_1, est_2, paired = TRUE, abs = FALSE, test.edges = TRUE, 
edges = list(c(1,2),c(3,6)), test.centrality = TRUE, 
centrality = c("expectedInfluence"), nodes = "all", it=10)

Paper about the Network Comparison Test is now in press!


Although the paper about the Network Comparison Test (NCT) was around for quite a long time, it took a while to finish it due to all kinds of circumstances. Finally, it is now accepted for publication in Psychological Methods. Click here for the accepted version. The final article will be available, upon publication, via its DOI: 10.1037/met0000476. Here, you can find Supplemental Material A.

Thanks to all co-authors (Riet van Bork, Lynn Boschloo, Jolanda Kossakowski, Pia Tio, Robert Schoevers, Denny Borsboom and Lourens Waldorp. And thanks to John C. Lokman for his design work on the figure shown here (Figure 2).

Our Lancet Psychiatry review and position paper about urban mental health published

Proud to announce that our review and position paper from UvA’s Centre for Urban Mental Health is now published in The Lancet Psychiatry:

Advancing urban mental health research: from complexity science to actionable targets for intervention

In this interdisciplinary paper, we present a new framework for investigating mental health in cities. You can find the paper here.

van der Wal, J. M., van Borkulo, C. D., Deserno, M. K., Breedvelt, J., Lees, M., Lokman, J. C., Borsboom, D., Denys, D., van Holst, R. J., Smidt, M. P., Stronks, K., Lucassen, P. J., van Weert, J., Sloot, P., Bockting, C. L., & Wiers, R. W. (2021). Advancing urban mental health research: from complexity science to actionable targets for intervention. The lancet. Psychiatry, S2215-0366(21)00047-X. Advance online publication. https://doi.org/10.1016/S2215-0366(21)00047-X

NWO Veni grant!

Very happy that I have been awarded a €250k Veni grant for developing a multi-timescale network modelling framework!

To reduce the burden of depression, symptoms should be studied at the appropriate timescales. Current methods cannot handle variables with different measurement frequencies. This project aspires to develop a multi-timescale network modeling framework to cross current methodological borders to simultaneously investigate symptoms at the time scales at which they evolve.

Therefore, these three objectives are crucially important:

  1. Develop a formal theoretical model for depression, which is essential to determine what data is needed to study depression
  2. Develop a network estimation method that crosses current methodological borders to allow the estimation of network structure among fast and slow-changing variables in one network
  3. Empirically test the formal theoretical model with the multi-timescale network estimation method by collecting and analyzing unique data with longitudinal measurements on different timescales and existing datasets

I would like to thank all colleagues, reviewers, and committee members who took the time to provide their valuable feedback and insights. Looking forward to work on this project in the years to come!

NetLogo revisited

Since it is possible again to run NetLogo models in your browser, I would like to publish one of my good old NetLogo models: Vulnerability to Depression. The nice thing about it is that you can play around and let the model run while adjusting several things. For example, you can adjust the connection strength, you can exert stress on the network, and you can apply a ‘shock’ to the system as if you are administering electroconvulsive therapy. On the Model Info page (see the tab at the bottom), you can find a lot of info and suggestions to explore this model. Especially the hysteresis effect is worth exploring. You can find a link to the model here. Have fun!

Van Swinderen Prize 2018

On December 18, the Van Swinderen Prize was awarded during the 1821st meeting of the Royal Physics Society Groningen for best thesis and being able to reach out to a general (academic) public. Based on presentations of the four nominees on their research, I won the second prize and received € 1000!

Updated version of NCT

OctocatThe NetworkComparisonTest package has now been updated on GitHub (link here) to version 2.1.1. In this new version, I added an argument “p.adjust.methods”. With this argument you can specify how to control for multiple edge testing to control type I error. You can choose one of “holm”, “hochberg”, “hommel”, “bonferroni”, “BH”, “BY”, “fdr”, or “none”. If you do not specify this argument, it uses the default “none”.

In the older version, a Holm-Bonferroni correction was applied. However, when doing exploratory analyses, one might be interested in the uncorrected p-values. If you are doing hypothesis testing, you can now choose your own method of correction. See the help page of the p.adjust() function in R for more information about the different methods.

If you encounter problems or bugs, please let me know: cvborkulo@gmail.com. I will upload the new version to CRAN soon.