从 R 中的二进制调查响应创建邻接矩阵

Create an adjacency matrix from binary survey responses in R

我有一个代表不同人政策偏好的数据框,其中行代表个人。

这是一个玩具示例,使用来自“Frank”、“Sarah”、“Josh”和“Elyse”的假设数据。在这个例子中,参与者表示了他们对三项政治政策(减税、全民医保、延长任期限制)的支持,因此“1”代表支持,“0”代表反对。

    d<-data.frame("Name"=c("Frank","Sarah","Josh","Elyse"),
    "tax_cuts"=c(0,1,1,1),
    "u_healthcare"=c(1,1,0,0),
    "ex_term"=c(0,0,1,0))
d

  Name    tax_cuts  u_healthcare ex_term
 Frank        0            1       0
 Sarah        1            1       0
  Josh        1            0       1
 Elyse        1            0       0

如何创建一个矩阵,其中的边表示一项政策的共同认可数量。例如,Sarah 共同认可减税和延长任期限制,而 Josh 共同认可延长任期限制和减税,因此这些政策将有 1 个共同认可。生成的矩阵将是具有以下值的 3-3 方阵。

    mat<-rbind(c(0, 1, 1),c(1,0,0), c(1,0,0))
    rownames(mat)<-c("tax_cuts","u_healthcare","ex_term")
    colnames(mat)<-c("tax_cuts","u_healthcare","ex_term")
    print(mat)

                tax_cuts  u_healthcare ex_term
tax_cuts            0            1        1
u_healthcare        1            0        0
ex_term             1            0        0

我们可以用矩阵乘法来做到这一点:

t(d[-1]) %*% as.matrix(d[-1])
             tax_cuts u_healthcare ex_term
tax_cuts            3            1       1
u_healthcare        1            2       0
ex_term             1            0       1

对角线是每个背书的计数。如果您愿意,可以将其设置为 0...

coendorse = t(d[-1]) %*% as.matrix(d[-1])
diag(coendorse) = 0
coendorse
#              tax_cuts u_healthcare ex_term
# tax_cuts            0            1       1
# u_healthcare        1            0       0
# ex_term             1            0       0

使用crossprod

crossprod(as.matrix(d[-1]), as.matrix(d[-1]))
#             tax_cuts u_healthcare ex_term
#tax_cuts            3            1       1
#u_healthcare        1            2       0
#ex_term             1            0       1