使用最短路径计算连接概率

2024-04-11

我想知道 igraph 中是否有一个函数可以计算加权图中顶点之间的连接概率,其中边的权重是相邻顶点的连接概率。

我基于这样的邻接矩阵构建了一个图,其中相邻连接概率形成权重(这是针对河流网络,因此图的每个节点仅连接到单个下游节点)。

我本来希望使用类似的东西shortest.pathsigraph 中的函数,但它对权重求和而不是计算它们的乘积,我无法找到改变它的方法。

下面的例子展示了我如何从我拥有的数据构建邻接矩阵,这是顶点连接到其下游顶点(ProbConn)的概率,然后是下游顶点(下游)的标识。最下游的顶点是河口,因此它不与其他顶点相连(因此称为下游的向量以 NA 开头)。

library(igraph)

# vector of probability of connectivity to downstream vertex
ProbConn <- c(0, 1, 0.945881098491627, 0.997349787519144, 0.891475447373691,
0.993221681072185, 0.48071450525165, 0.0292543433507856, 0.0248645581575872,
1, 0.00540807765075205, 0.661465657844344, 0.108524549747512,
0.383311676351655, 0.708853495942148, 0.00150109592270933, 0.463859846404347,
0.0011491165581467, 2.87879700370202e-09, 0.536140153595653,
0.00831752330277812, 0.00185182893416988, 0.0186237313262708,
0.398961560996748, 0.582414707676981, 0.338534342155656, 1, 0.00137024127706289,
0.291146504057852, 1, 0.0743301054564134, 0.0514743607033332,
1, 1)

# the downstream vertex of each node
downstream <- c(NA, 1, 2, 3, 4, 5, 6, 2, 2, 7, 5, 8, 4, 6, 10, 3, 11, 3, 4,
11, 6, 6, 9, 9, 9, 8, 12, 5, 10, 13, 6, 6, 14, 15)

# Create the adjacency matrix from these vectors
adjacPI <- matrix(0, nrow=length(downstream), ncol=length(downstream)) # Set up the adjacency matrix to build the distance matrix

for (i in 1:length(downstream)) {
  adjacPI[i, downstream[i]] <- ProbConn[i]  # Fill the adjacency matrix
}

# create the graph reflecting the downstream connectivity
PIgraph <- graph.adjacency(adjacPI, weighted=T)
plot(PIgraph) # visualise the graph 

PIpath <- shortest.paths(PIgraph, mode="out") 
# creates  the shortest paths matrix based on summing the distances of each step along each path   

为了从最短路径矩阵 PIpath 中提取示例,顶点 10 和 34 通过顶点 15 连接。根据 PIpath 中的计算,顶点 10 和 34 之间的路径距离 (PIpath[34,10]) 为 1.708,它是顶点 34 和 15 (PIpath[34,15] = 1) 以及顶点 15 和 10 (PIpath[15, 10] = 0.708) 之间的连接概率 我希望它是一个乘积,因此之间的路径“距离” 10 和 34 是 1*0.708。

我不完全确定术语,但我正在寻找的矩阵元素将是连接顶点之间每个步骤的转移概率的乘积。本质上用乘积替换最短路径中的求和函数。

是否可以使用 igraph 中的函数来计算,或者我是否需要单独编写一些代码来执行此操作?


如果路径的链接有概率p_1, p_2, ..., p_n成功,那么(假设链接成功概率独立,我将在整个答案中这样做)整个路径成功的概率是p_1 * p_2 * ... * p_n。正如您所注意到的,这是一个产品,但最短路径可以最小化总和;将乘积转换为和的常见技巧是取对数。路径成功概率的对数为log(p_1) + log(p_2) + ... + log(p_n)。最大化(我们的目标)相当于最小化(-log(p_1)) + (-log(p_2)) + ... (-log(p_n))。由于所有概率都在 0 和 1 之间,因此它们的对数是非正的,因此它们的对数的负数也是非负的。

总之,您可以将所有权重设置为-log(p_i), where p_i是连接成功的概率,以及一对节点之间的最短路径(通过以下公式计算)shortest.paths函数于igraph)将是最大化连接概率的路径。您可以根据给定的向量将图表构建为单行图ProbConn and downstream通过切换到graph.data.frame:

PIgraph <- graph.data.frame(na.omit(cbind(from=seq_along(downstream), to=downstream,
                                          weight=-log(ProbConn))),
                            vertices=seq_along(downstream))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用最短路径计算连接概率 的相关文章

  • ggplot 图例标签内的希腊字母、符号和换行符

    我在尝试着 有换行符 自动或强制 对齐文本 左对齐或左右对齐 有希腊字母和百分号 在 gglot 图例标签内 我尝试了几种方法 但我似乎无法将我读到的所有技巧结合起来 我可以通过插入来换行 n进入标签 但这似乎不适用于希腊字母 不适用于图例
  • 将不同的 grViz 组合成一个图

    我想结合不同的DiagrammeR绘制成一个图形 生成的图如下例所示 library DiagrammeR pDia lt grViz digraph boxes and circles a graph statement graph ov
  • 使用自定义渐变填充直方图箱

    我想在 R 和 ggplot2 中创建一个直方图 其中根据连续的 x 值填充箱 大多数教程仅通过离散值或密度 计数进行着色 下列的这个例子 https stackoverflow com questions 40284227 how to
  • R data.table 连接不等式条件

    我想使用 data table 包根据多个不等式条件对数据进行子集化 data table 手册中的示例展示了如何使用字符变量执行此操作 但不显示数字不等式 我还了解了如何使用子集函数来执行此操作 但我真的很想利用 data table 二
  • R闪亮:使用闪亮的JS从数据表中获取信息

    我想读出所有列名称以及它们在数据表中显示的顺序 由于不同的原因 我无法使用 stateSave 等选项 我对 JS 没有什么把握 但我确信用它可以完成 所以我需要你帮助我 我尝试过类似的代码片段 datatable data callbac
  • 为每个因素级别添加日期时间序列

    我有一个带有因子列的数据框 s lt data frame id 901 910 s id lt as factor s id 我有一个日期时间序列 library lubridate start lt now as difftime 2
  • 在 R 中导入 csv 文件时如何保留前导零?

    当我写一个 csv来自 R 的文件 其中我的组名称以前导零值开头 前导零被保留 但是当我导入 csv前导零被删除 组名称被转换为整数 当我导入一个组时 如何保留组名称中的前导零 csvR 中的文件 Example df lt data fr
  • 删除缺失的数据值

    我删除了原始帖子 以便能够发布更大版本的数据集 实际上总共有 418 行 这是我正在进行的生存分析的数据 第一列是 ID 号 其他列标记为 V2 V20 有很多缺失的数据 用 表示 我用coxph 函数来获取以下内容 Saves survi
  • Silverlight 中的图形可视化

    我有一个表示有向图的数据结构 我正在寻找一个好的 Silverlight 可视化 以允许我从一个节点导航到另一个节点 最好带有一些漂亮的动画 有谁知道这种显示有什么好的 UI 控件或框架吗 甚至是来自另一个领域的样本 也许是社交网络 我的图
  • 如何在R中匹配具有相同主键的两个表中的数据

    我有两个表 其中包含有关人员的数据 df1 lt data frame id c 113 202 377 288 359 name c Alex Silvia Peter Jack Jonny 这为我提供了 id name 1 113 Al
  • 如何总结此R问题中的销售数量、售出酒类数量和花费金额

    我使用以下代码在 R 上上传我的数据 if file exists ames liquor rds url lt https github com ds202 at ISU materials blob master 03 tidyvers
  • 在 R 中使用逻辑 grep 抓取文本

    下午好 谢谢你帮我解答这个问题 我有兴趣抓取一组超过 5000 个 URL 的列表 我使用 lapply 和 readLines 使用下面的示例代码提取这些网页的文本 multipleURL lt c http dailymed nlm n
  • 通过 r markdown 中的循环创建代码片段

    如同如何使用R中的knitr创建一个包含代码块和文本的循环 https stackoverflow com questions 36373630 how to create a loop that includes both a code
  • rvest 和 NHL 统计数据的 CSS 选择器问题

    我想从 hockey reference com 中抓取数据 特别是从以下链接中抓取数据 https www hockey reference com leagues NHL 1991 html https www hockey refer
  • 使用 RDCOMClient 搜索 Outlook 收件箱

    我尝试使用 RDCOMClient 在 Outlook 收件箱中搜索电子邮件中的特定主题 然后获取附件 我在一封电子邮件上进行了这项工作 但由于主题包含日期元素 我需要搜索成为一个类似的子句 但不太清楚这适合我的下面的查询 outlook
  • 使用 pkg:sjPlot 函数创建一个生成部分斜体单元格的数据框

    我正在尝试创建一个简单的数据表 其中 Coral taxon 列中的属名称为斜体 而 spp 列中的属名称为斜体 属名后面的部分不大写 我尝试使用 expression 函数对 Coral taxon 的每一行进行编码 但没有成功 sum
  • 手动设置scale_fill_distiller()的比例

    我正在尝试制作一系列图表进行比较 举例来说 我想使用iris数据集来制作这样的图 其中我已过滤以仅查看 setosa 物种 library ggplot2 library dplyr iris gt filter Species setos
  • 如何定义“f_n-chi-square”函数并使用“uniroot”求置信区间?

    I want to get a 95 confidence interval for the following question 我已经写了函数f n在我的 R 代码中 我首先使用 Normal 随机采样 100 个样本 然后定义函数h
  • 当有很多列时,使用 readr::read_csv() 导入数据时覆盖列类型

    我正在尝试使用 R 中的 readr read csv 读取 csv 文件 我导入的 csv 文件大约有 150 列 我只包含示例的前几列 我希望将第二列从默认类型 我执行 read csv 时为日期 覆盖为字符或其他日期格式 GIS Jo
  • R - 与 SpatialPolygonsDataFrame 对象相交的 SpatialLinesDataFrame 列表的嵌套循环

    我有一系列需要完成的步骤SpatialLinesDataFrame 此处的 线 基于对象与多特征中各个特征的关系SpatialPolygonsDataFrame 多边形 对象 简而言之 每个线列表元素源自单个面要素内部 并且可能会也可能不会

随机推荐