首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:用xtabs创建对称矩阵

R:用xtabs创建对称矩阵
EN

Stack Overflow用户
提问于 2018-04-09 15:42:42
回答 2查看 360关注 0票数 2

我有三种型号: M1,M2和M3。我把模型成对比较,得到一个分数。我只做单向比较。M1和M2,但不是M2和M1,因为他也一样。我想把它们转换成一个对称矩阵。

我能够使用xtabs将数据集转换成矩阵,但它没有M1-M1和M3-M3距离。

代码语言:javascript
复制
d <- data.frame(M1 = c("M1", "M1", "M1", "M2", "M2", "M3"),
            M2 = c("M2", "M3", "M4", "M3", "M4", "M4"),
            C = c(1, 1, 4, 2, 2, 6))

dm = xtabs(C~M1+M2, data=d)


> d
  M1 M2 C
1 M1 M2 1
2 M1 M3 1
3 M1 M4 4
4 M2 M3 2
5 M2 M4 2
6 M3 M4 6
> dm
    M2
M1   M2 M3 M4
  M1  1  1  4
  M2  0  2  2
  M3  0  0  6

我试着将上三角复制到下三角,但它不能正常工作,因为它不是对称矩阵。我想知道如何包含M1-M1和M3-M3距离,并使它成为一个对称矩阵。即使距离为0,但当我试图将矩阵转换为dist()对象时,会不会出现问题呢?

代码语言:javascript
复制
> dm[lower.tri(dm)] <- t(dm)[lower.tri(dm)]
> dm
    M2
M1   M2 M3 M4
  M1  1  1  4
  M2  1  2  2
  M3  4  2  6
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-09 22:23:38

要获得对称矩阵,您可能需要在每个维度上设置相同的级别(M1到M4):

这样做的一种方法是将变量设置为具有相同因素级别集的因素。

代码语言:javascript
复制
d[c("M1", "M2")] <- lapply(d[c("M1", "M2")], factor, levels=unique(unlist(d[c("M1", "M2")]))) 

然后,您可以像以前一样使用xtabs,并将结果添加到结果的转置中。

代码语言:javascript
复制
dm <- xtabs(C ~ M1 + M2, data=d)

dm + t(dm)

#    M2
#M1   M1 M2 M3 M4
#  M1  0  1  1  4
#  M2  1  0  2  2
#  M3  1  2  0  6
#  M4  4  2  6  0
票数 1
EN

Stack Overflow用户

发布于 2018-04-09 17:59:23

加上它的转置。给对角线两次相减。

代码语言:javascript
复制
dm + t(dm) - diag(diag(dm))

给予:

代码语言:javascript
复制
    M2
M1   M2 M3 M4
  M1  1  1  4
  M2  1  2  2
  M3  4  2  6

如果我们知道所有元素都是非负的,那么这也是可行的:

代码语言:javascript
复制
pmax(dm, t(dm))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49736791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档