igraph 中不一致的局部传递性输出
Inconsistent Local Transitivity Output in igraph
我需要确定网络中每个节点的传递性,但得到的结果不一致。
set.seed(123)
a <- rbinom(144, 1, .5)
b <- graph.adjacency(matrix(a, nrow = 12, ncol = 12), mode = "undirected")
transitivity(b, type = "local")
这提供了输出:
[1] 0.6888889 0.4909091 0.4444444 0.9333333 0.4909091 0.7500000 0.7333333 0.4666667 0.7333333 0.4222222 0.5000000
[12] 0.6944444
但是当我尝试指定单个节点时,输出中的某些值不匹配:
transitivity(b, vids = 2, type = "local")
[1] 0.75
事实上,当我尝试计算所有顶点的局部传递性时,很多都与我将 vids 参数排除在外时不同。在某些情况下,当我尝试这样做时,一切都不一样了。
transitivity(b, vids = V(b), type = "local")
[1] 0.6888889 0.7500000 0.7142857 0.9333333 0.7500000 0.7500000 0.7333333 0.7500000 0.7333333 0.6785714 0.8571429
[12] 0.6944444
如果我将 vids 设置为 NULL,它会匹配第一个输出,根本不包含 vids 参数。
结果略有不同,但如果我创建有向网络,仍然不匹配。
关于可能导致此问题的原因或我应该使用哪组结果有什么想法吗?
感谢您的帮助。
你应该知道你的图 b
不是一个简单的图,因为它包含自循环
当运行 transitivity
在这样的图形上时,您会看到 warning/error 消息
Transitivity works on simple graphs only. The result might be incorrect. igraph 1.3.0 and later will treat this as an error.
因此,如果您想以正确的方式使用transitivity
,则应首先排除自循环,例如
b <- simplify(graph.adjacency(matrix(a, nrow = 12, ncol = 12), mode = "undirected"))
然后你会看到
> transitivity(b, type = "local")
[1] 0.6888889 0.7500000 0.7142857 0.9333333 0.7500000 0.7500000 0.7333333
[8] 0.7500000 0.7333333 0.6785714 0.8571429 0.6944444
> transitivity(b, vids = V(b), type = "local")
[1] 0.6888889 0.7500000 0.7142857 0.9333333 0.7500000 0.7500000 0.7333333
[8] 0.7500000 0.7333333 0.6785714 0.8571429 0.6944444
正如 Thomas 所说,您从 transitivity(b, type = "local")
得到的结果是不正确的,因为 b
并不简单,[=27= 中的 non-simple 图不支持局部传递性计算] 1.2.x。如果使用最新版本,会有明确警告:
> transitivity(b, type = "local")
Transitivity works on simple graphs only. The result might be incorrect. igraph 1.3.0 and later will treat this as an error.
[1] 0.6888889 0.4909091 0.4444444 0.9333333 0.4909091 0.7500000 0.7333333 0.4666667
[9] 0.7333333 0.4222222 0.5000000 0.6944444
如果您没有看到此警告,请升级到 igraph 1.2.11。
为什么 transitivity(b, type='local")
和 transitivity(b, vids=V(b), type='local")
给出不同的结果?这是因为在计算所有顶点与特定顶点子集的结果时使用了内部不同的代码路径,以试图提高性能。
警告消息说“igraph 1.3.0 及更高版本会将此视为错误。”但实际上从那时起,1.3 版和 support for multigraphs has already been added(更准确地说,这已添加到 C/igraph 0.9,R/igraph 1.3 将基于该版本)中进行了大量改进。
我鼓励您尝试 R/igraph 的开发版本,它将成为 1.3.0 版本。安装说明是here;请注意,您需要安装 R 开发工具(在 Windows/Mac 上),因为包是从源代码编译的。与 1.2.x 系列相比,此版本有大量修复,在这一点上,应该被认为比“稳定”的 1.2.11.
更可靠
我需要确定网络中每个节点的传递性,但得到的结果不一致。
set.seed(123)
a <- rbinom(144, 1, .5)
b <- graph.adjacency(matrix(a, nrow = 12, ncol = 12), mode = "undirected")
transitivity(b, type = "local")
这提供了输出:
[1] 0.6888889 0.4909091 0.4444444 0.9333333 0.4909091 0.7500000 0.7333333 0.4666667 0.7333333 0.4222222 0.5000000
[12] 0.6944444
但是当我尝试指定单个节点时,输出中的某些值不匹配:
transitivity(b, vids = 2, type = "local")
[1] 0.75
事实上,当我尝试计算所有顶点的局部传递性时,很多都与我将 vids 参数排除在外时不同。在某些情况下,当我尝试这样做时,一切都不一样了。
transitivity(b, vids = V(b), type = "local")
[1] 0.6888889 0.7500000 0.7142857 0.9333333 0.7500000 0.7500000 0.7333333 0.7500000 0.7333333 0.6785714 0.8571429
[12] 0.6944444
如果我将 vids 设置为 NULL,它会匹配第一个输出,根本不包含 vids 参数。
结果略有不同,但如果我创建有向网络,仍然不匹配。
关于可能导致此问题的原因或我应该使用哪组结果有什么想法吗?
感谢您的帮助。
你应该知道你的图 b
不是一个简单的图,因为它包含自循环
当运行 transitivity
在这样的图形上时,您会看到 warning/error 消息
Transitivity works on simple graphs only. The result might be incorrect. igraph 1.3.0 and later will treat this as an error.
因此,如果您想以正确的方式使用transitivity
,则应首先排除自循环,例如
b <- simplify(graph.adjacency(matrix(a, nrow = 12, ncol = 12), mode = "undirected"))
然后你会看到
> transitivity(b, type = "local")
[1] 0.6888889 0.7500000 0.7142857 0.9333333 0.7500000 0.7500000 0.7333333
[8] 0.7500000 0.7333333 0.6785714 0.8571429 0.6944444
> transitivity(b, vids = V(b), type = "local")
[1] 0.6888889 0.7500000 0.7142857 0.9333333 0.7500000 0.7500000 0.7333333
[8] 0.7500000 0.7333333 0.6785714 0.8571429 0.6944444
正如 Thomas 所说,您从 transitivity(b, type = "local")
得到的结果是不正确的,因为 b
并不简单,[=27= 中的 non-simple 图不支持局部传递性计算] 1.2.x。如果使用最新版本,会有明确警告:
> transitivity(b, type = "local")
Transitivity works on simple graphs only. The result might be incorrect. igraph 1.3.0 and later will treat this as an error.
[1] 0.6888889 0.4909091 0.4444444 0.9333333 0.4909091 0.7500000 0.7333333 0.4666667
[9] 0.7333333 0.4222222 0.5000000 0.6944444
如果您没有看到此警告,请升级到 igraph 1.2.11。
为什么 transitivity(b, type='local")
和 transitivity(b, vids=V(b), type='local")
给出不同的结果?这是因为在计算所有顶点与特定顶点子集的结果时使用了内部不同的代码路径,以试图提高性能。
警告消息说“igraph 1.3.0 及更高版本会将此视为错误。”但实际上从那时起,1.3 版和 support for multigraphs has already been added(更准确地说,这已添加到 C/igraph 0.9,R/igraph 1.3 将基于该版本)中进行了大量改进。
我鼓励您尝试 R/igraph 的开发版本,它将成为 1.3.0 版本。安装说明是here;请注意,您需要安装 R 开发工具(在 Windows/Mac 上),因为包是从源代码编译的。与 1.2.x 系列相比,此版本有大量修复,在这一点上,应该被认为比“稳定”的 1.2.11.
更可靠