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

问题描述

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

这里是一个玩具示例,它使用来自“弗兰克”,“萨拉”,“乔什”和“爱丽丝”的假设数据。在此示例中,参与者表明了他们对三项政治政策的认可(减税,全民医疗保健,延长期限),因此“ 1”代表认可,“ 0”代表对该政策的反对

    d<-data.frame("Name"=c("Frank","Sarah","Josh","Elyse"),"tax_cuts"=c(0,1,1),"u_healthcare"=c(1,0),"ex_term"=c(0,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,c(1,0))
    rownames(mat)<-c("tax_cuts","u_healthcare","ex_term")
    colnames(mat)<-c("tax_cuts","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