We ignore all self-loops upon reading a particular network. Although this works fine for CPM (as self-loops have no effect there) this is not entirely correct for modularity. In particular, the problem is that the nodeWeights are calculated using getTotalEdgeWeightPerNodeHelper, but this is called only after we have removed the self-loops. In other words, the nodeWeights reflect the degree without the self-loops.
|
this.nodeWeights = (nodeWeights != null) ? nodeWeights.clone() : (setNodeWeightsToTotalEdgeWeights ? getTotalEdgeWeightPerNodeHelper() : nl.cwts.util.Arrays.createDoubleArrayOfOnes(nNodes)); |
In addition, we do consider self-loops when calculating the "proper" resolution parameter:
|
double resolution2 = useModularity ? (resolution / (2 * network.getTotalEdgeWeight() + network.getTotalEdgeWeightSelfLinks())) : resolution; |
Both issues should be corrected in order to make modularity work correctly when self-loops are present in a network.
We ignore all self-loops upon reading a particular network. Although this works fine for CPM (as self-loops have no effect there) this is not entirely correct for modularity. In particular, the problem is that the
nodeWeightsare calculated usinggetTotalEdgeWeightPerNodeHelper, but this is called only after we have removed the self-loops. In other words, thenodeWeightsreflect the degree without the self-loops.networkanalysis/src/main/java/nl/cwts/networkanalysis/Network.java
Line 1371 in 42fdd9e
In addition, we do consider self-loops when calculating the "proper" resolution parameter:
networkanalysis/src/main/java/nl/cwts/networkanalysis/run/RunNetworkClustering.java
Line 405 in 42fdd9e
Both issues should be corrected in order to make modularity work correctly when self-loops are present in a network.