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



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

这里是一个玩具的例子;弗兰克"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

最新更新