首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Statnet的加权网络中心度测度

基于Statnet的加权网络中心度测度
EN

Stack Overflow用户
提问于 2019-01-16 11:50:08
回答 1查看 969关注 0票数 2

我在R中创建了一个加权网络,它同时使用into和statnet,我现在正在研究使用statnet的加权网络的中心性度量,但是我获得的中心性度量就好像statnet没有考虑到我的边的值一样。这里有一个小例子来说明我的问题,使用程度中心度度量。

我创建了我的网络,使用igraph:

代码语言:javascript
复制
nodes <- data.frame(id=c(1,2,3,4,5))
edges <- data.frame(source=c(1,1,2,2,3),
                    target=c(2,3,3,5,4),
                    weight=c(1,2,1,2,1)) 
library(igraph)
network <- graph_from_data_frame(d=edges, vertices=nodes, directed=FALSE)

然后我需要使用statnet包,所以我用以下方式对它进行了转换

代码语言:javascript
复制
  network_statnet <- asNetwork(network)
  detach("package:igraph", unload=TRUE)
  library(statnet)

然后,我想计算度中心性,首先不考虑边值(degree_unweighted),然后考虑边值(degree_weighted)。

代码语言:javascript
复制
degree_unweighted<-degree(network_statnet, gmode="graph", ignore.eval=TRUE)
degree_weighted<-degree(network_statnet, gmode="graph", ignore.eval=FALSE)

但我的结论是同样的中心性措施。我不知道为什么statnet在指定ignore.eval=FALSE时不考虑边的值。我和其他中心度量(中间性、紧密性、特征向量)也有同样的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-16 12:28:17

你说得对,degree忽略权值而不考虑ignore.eval。它在degree的第一行中是可见的,我们有

代码语言:javascript
复制
dat <- as.edgelist.sna(dat)

as.edgelist.sna有一个参数attrname

吸引名-如果x是一个网络对象,则使用(可选的) edge属性来获取边缘值。

因此,degree实际上似乎甚至没有尝试使用任何权重。要解决这个问题,我们可以通过增加使用权重的可能性来重新定义这个函数,如

代码语言:javascript
复制
myDegree <- function (dat, g = 1, nodes = NULL, gmode = "digraph", diag = FALSE, 
          tmaxdev = FALSE, cmode = "freeman", rescale = FALSE, ignore.eval = FALSE, attrname = NULL) 
{
  dat <- as.edgelist.sna(dat, attrname = attrname)
  if (is.list(dat)) 
    return(sapply(dat[g], degree, g = 1, nodes = nodes, gmode = gmode, 
                  diag = diag, tmaxdev = tmaxdev, cmode = cmode, rescale = rescale))
  n <- attr(dat, "n")
  if (gmode == "graph") 
    cmode <- "indegree"
  if (tmaxdev) {
    if (gmode == "digraph") 
      deg <- switch(cmode, indegree = (n - 1) * (n - 1 + 
                                                   diag), outdegree = (n - 1) * (n - 1 + diag), 
                    freeman = (n - 1) * (2 * (n - 1) - 2 + diag))
    else deg <- switch(cmode, indegree = (n - 1) * (n - 2 + 
                                                      diag), outdegree = (n - 1) * (n - 2 + diag), freeman = (n - 
                                                                                                                1) * (2 * (n - 1) - 2 + diag))
  }
  else {
    m <- NROW(dat)
    cm <- switch(cmode, indegree = 0, outdegree = 1, freeman = 2)
    if (!(cmode %in% c("indegree", "outdegree", "freeman"))) 
      stop("Unknown cmode in degree.\n")
    deg <- .C("degree_R", as.double(dat), as.integer(m), 
              as.integer(cm), as.integer(diag), as.integer(ignore.eval), 
              deg = as.double(rep(0, n)), PACKAGE = "sna", NAOK = TRUE)$deg
    if (rescale) 
      deg <- deg/sum(deg)
    if (!is.null(nodes)) 
      deg <- deg[nodes]
  }
  deg
}

这就给了

代码语言:javascript
复制
(degree_unweighted <- myDegree(network_statnet, gmode = "graph", ignore.eval = TRUE))
# [1] 2 3 3 1 1
(degree_weighted <- myDegree(network_statnet, gmode = "graph", ignore.eval = FALSE, attrname = "weight"))
# [1] 3 4 4 1 2

恐怕您还需要对其他函数(如betweenness )进行同样的调整。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54216470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档