Измерения центральности во взвешенной сети с использованием Statnet в R

Этот код, похоже, выполняет то, о чем вы просите.

for value in range(1,1000):
    if value % 3 == 0 or value % 5 == 0:
        print(value)

Или что-то вроде

for value in range(1,1000):
    if value % 3 == 0 or value % 5 == 0:
        some_list.append(value)

Или любое количество вещей.

1
задан Julius Vainora 16 January 2019 в 12:28
поделиться

1 ответ

Вы правы, degree игнорирует веса независимо от ignore.eval. Это видно в самой первой строке degree, где мы имеем

dat <- as.edgelist.sna(dat)

, в то время как as.edgelist.sna имеет параметр attrname:

attrname - если x является сетевой объект, (необязательный) атрибут края, который будет использоваться для получения значений границ.

Так что degree на самом деле даже не пытается использовать какие-либо веса. Чтобы исправить это, мы можем переопределить эту функцию, добавив возможность использовать веса, как в

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
}

Это затем дает

(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.

0
ответ дан Julius Vainora 16 January 2019 в 12:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: