0

我目前正在研究动态时间网络。

标题:时间发送者接收者

      1    1       2
      1    1       3
      2    2       1
      2    2       1
      3    1       2
      3    1       2

以上是我的数据集的示例。节点之间有 3 个时间段(会话)和边缘列表。我想按每个时间段计算中心性度量。我正在考虑编写一个脚本来计算同一时间段内的中心性度量。但是我只是想知道是否有可以处理这个问题的 R 库。

有谁知道吗?

金聂

我尝试编写基于 Time 的子集数据代码,如下所示:

uniq <-unique(unlist(df$Time))

uniq
[1] 1 2 3

for (i in 1:length(uniq)){

  t[i]<-subset(df, Time==uniq[i])

  net[i] <-as.matrix(t[i])

  netT[i]<-net[i][,-3]  #removing time column

  #### getting edgelist

  netT[i][,1]=as.character(net[i][,1])

  netT[i][,2]=as.character(net[i][,2])

  g [i]=graph.edgelist(netT [i], directed=T)

  g[i] 
}

但是,我收到一条错误消息( Error in t[i] <- subset(df, Time == uniq[i]) : object of type 'closure' is not subsubtable)你知道为什么吗?我对 R 有点陌生,所以很难弄清楚。我猜 t[i] 是问题所在。我不知道如何将 t[i] 分配为数据框。

4

2 回答 2

1

networkDynamic R 库对这类事情很有帮助(免责声明:我是包维护者)

library(networkDynamic)

# a data frame with your input data
raw<-data.frame(time=c(1,1,2,2,3,3),
              sender=c(1,1,2,2,1,1),
            receiver=c(2,3,1,1,2,2))

# add another time column to define a start and end time for each edge spell
raw2<-cbind(raw$time,raw$time+1,raw$sender,raw$receiver)

# create a networkDynamic object using this edge timing info
nd<-networkDynamic(edge.spells=raw2)

# load the sna library with static network measures
library(sna)

# apply degree measure to static networks extracted at default time points
lapply(get.networks(nd),degree)
 [[1]]
 [1] 2 1 1

 [[2]]
 [1] 1 1 0

 [[3]]
 [1] 1 1 0
于 2013-12-14T01:01:25.143 回答
0

你可以试试igraph图书馆。我不熟悉它,但我发现这个问题很有趣,可以编写一个答案,所以我们开始吧:

因为你有一个定向网络(发送者和接收者),所以你需要两个中心度度量:indegreeoutdegree

计算这个相当简单,复杂性是按时间点划分。所以对于每个时间点我们需要做以下事情:

  1. 创建一个邻接矩阵,指示每行(发送方)到每列(接收方)的连接数。
  2. 由此我们可以简单地将行中的连接相加得到出度,以及列中的连接得到入度。

假设您的数据存储在我们可以用来按时间点拆分您的data.frame名称中:dfsplitdata.frame

nodes <- unique(c(unique(df$Sender), unique(df$Receiver)))
centrality <- lapply(split(df, df$Time), function(time.df) {
  adj <- matrix(0, length(nodes), length(nodes), dimnames=list(nodes, nodes))
  for (i in 1:nrow(time.df)) {
    sender <- time.df[i, "Sender"]
    receiver <- time.df[i, "Receiver"]
    adj[sender, receiver] <- adj[sender, receiver] + 1 
  }
  list(indegree=colSums(adj), outdegree=rowSums(adj))
})
names(centrality) <- paste0("Time.Point.", 1:length(centrality))

如果我们在您的数据上运行代码(为了清楚起见,我用字母替换了发送者接收者):

> centrality
$Time.Point.1
$Time.Point.1$indegree
a b c 
0 1 1 

$Time.Point.1$outdegree
a b c 
2 0 0 


$Time.Point.2
$Time.Point.2$indegree
a b c 
2 0 0 

$Time.Point.2$outdegree
a b c 
0 2 0 


$Time.Point.3
$Time.Point.3$indegree
a b c 
0 2 0 

$Time.Point.3$outdegree
a b c 
2 0 0 
于 2013-10-30T04:51:02.567 回答