在R中生成一个偏好矩阵?

时间:2015-11-26 00:53:55

标签: r sna

我使用r来分析具有种族特征的个人的无向网络。我想创建一个平局账户表,或者"偏好矩阵,"一个方形矩阵,其中种族的值排列在两个维度上,每个单元格告诉您有多少关系对应于该类型的关系。 (因此,你可以计算出一个群体与另一个群体发生关系的概率 - 但我只是想将它作为igraph的preference.game函数中的一个参数)。这就是我的尝试:

# I create a variable for ethnicity by assigning the names of my vertices to their corresponding ethnicities

   eth <- atts$Ethnicity[match(V(mahmudNet)$name,atts$Actor)] 

# I create an adjacency matrix from my network data

   mat <- as.matrix(get.adjacency(mahmudNet))

# I create the dimensions for my preference matrix from the Ethnicity values

   eth.value <- unique(sort(eth))

# I create an empty matrix using these dimensions

eth.mat <- array(NA,dim=c(length(eth.value),length(eth.value)))

# I create a function that will populate the empty cells of the matrix

for (i in eth.value){
  for (j in eth.value){
    eth.mat[i,j] <- sum(mat[eth==i,eth==j])
  }
 }

我认为我的问题在最后。我需要找出一个告诉R如何填充单元格的表达式。我所说的表达似乎不起作用,但我想要它,以便我可以去

a <- sum(mat[eth=="White", eth=="Black"])

然后&#34; a&#34;将返回邻接矩阵中与白黑关系相对应的所有单元格的总和。

  

以下是我的数据样本:

# data frame with Ethnicity attributes:

                     Actor Ethnicity
1    Sultan Mahmud of Siak         2
2            Daeng Kemboja         1
3  Raja Kecik of Trengganu         1
4                Raja Alam         2
5                Tun Dalam         2
6                Raja Haji         1
7           The Suliwatang         1
8          Punggawa Miskin         1
9          Tengku Selangor         1
10        Tengku Raja Said         1
11         Datuk Bendahara         2
12                     VOC         3
13        King of Selangor         1
14        Dutch at Batavia         3
15            Punggawa Tua         2
16    Raja Tua Encik Andak         1
17      Raja Indera Bungsu         2
18         Sultan of Jambi         2
19            David Boelen         3
20        Datuk Temenggong         2
21      Punggawa Opu Nasti         1

# adjacency matrix with relations

                  Daeng Kemboja Punggawa Opu Nasti Raja Haji Daeng Cellak
Daeng Kemboja                  0                  1         1            1
Punggawa Opu Nasti             1                  0         1            0
Raja Haji                      1                  1         0            0
Daeng Cellak                   1                  0         0            0
Daeng Kecik                    1                  0         0            0
                   Daeng Kecik
Daeng Kemboja                1
Punggawa Opu Nasti           0
Raja Haji                    0
Daeng Cellak                 0
Daeng Kecik                  0

1 个答案:

答案 0 :(得分:2)

一旦您的数据形状正确,这对于table来说是一项简单的工作。

首先是一个样本数据集:

# fake ethnicity data by actor
actor_eth <- data.frame(actor = letters[1:10], 
                        eth = sample(1:3, 10, replace=T))

# fake adjacency matrix
adj_mat <- matrix(rbinom(100, 1, .5), ncol=10)
dimnames(adj_mat) <- list(letters[1:10],  letters[1:10])
# blank out lower triangle & diagonal, 
# so random data is not asymetric & no self-ties
adj_mat[lower.tri(adj_mat)] <- NA
diag(adj_mat) <- NA

这是我们的假邻接矩阵:

   a  b  c  d  e  f  g  h  i  j
a NA  1  1  1  0  0  1  1  0  1
b NA NA  0  1  0  1  0  0  1  0
c NA NA NA  1  1  0  0  1  0  0
d NA NA NA NA  1  0  0  1  1  0
e NA NA NA NA NA  0  0  1  0  1
f NA NA NA NA NA NA  1  1  0  1
g NA NA NA NA NA NA NA  1  1  0
h NA NA NA NA NA NA NA NA  0  0
i NA NA NA NA NA NA NA NA NA  1
j NA NA NA NA NA NA NA NA NA NA

这是我们的假表:

   actor eth
1      a   3
2      b   3
3      c   3
4      d   2
5      e   1
6      f   3
7      g   3
8      h   3
9      i   1
10     j   2

所以你要做的是1)把它放在长格式中,所以你有一堆行与源actor和目标actor,每个行代表一个平局。然后2)用种族代替演员姓名,这样你就可以与源/目标种族联系起来。然后3)您可以使用table制作交叉表。

# use `melt` to put this in long form, omitting rows showing "non connections"
library(reshape2)
actor_ties <- subset(melt(adj_mat), value==1)

# now replace the actor names with their ethnicities to get create a data.frame
# of ties by ethnicty
eth_ties <- 
  data.frame(source_eth = with(actor_eth, eth[match(actor_ties$Var1, actor)]),
             target_eth = with(actor_eth, eth[match(actor_ties$Var2, actor)]))

# now here's your cross tab
table(eth_ties)

结果:

          target_eth
source_eth 1 2 3
         1 0 2 1
         2 2 0 1
         3 3 5 9