Вы правы, degree
игнорирует веса независимо от ignore.eval
. Это видно в самой первой строке degree
, где мы имеем
dat <- as.edgelist.sna(dat)
, в то время как as.edgelist.sna
имеет параметр attrname
:
attrname - если x является сетевым объектом, (необязательный) атрибут edge для
использоваться для получения значений ребер.
Так что 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
.