如何用xtabs创建包含模型自对比值的对称矩阵?
嘿,咱们一步步来搞定这个对称矩阵的问题吧!
先看看当前的xtabs矩阵
先运行你提供的代码,生成的dm是个有向交叉表——只有你记录过的单向比较有值,反向和对角线位置都是0:
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) dm
输出结果:
M2 M1 M2 M3 M4 M1 1 1 4 M2 0 2 2 M3 0 0 6
第一步:转成对称矩阵
因为你提到单向比较的结果和反向一致,那我们可以把矩阵转置后和原矩阵合并,让反向位置也补上对应的值。这里用pmax()函数,能自动把原矩阵和转置矩阵的对应位置取最大值(刚好覆盖原矩阵里的0值):
# 生成对称矩阵 sym_dm <- pmax(dm, t(dm))
现在sym_dm就变成双向都有值的矩阵了:
M2 M1 M2 M3 M4 M1 1 1 4 M2 1 2 2 M3 1 2 6
如果你需要的是取双向的均值(比如万一后续有双向记录的话),可以换成这个:
sym_dm <- (dm + t(dm)) / 2
第二步:补全自对比的对角线值
模型和自身的对比,通常我们默认评分为0(你可以根据需求改成其他数值),直接给对角线赋值就行:
# 获取所有模型名称 model_names <- rownames(sym_dm) # 给对角线设置为0 diag(sym_dm)[model_names] <- 0
现在最终的对称矩阵就完整了:
M2 M1 M2 M3 M4 M1 0 1 4 M2 1 0 2 M3 1 2 0
可选:只保留M1、M2、M3三个模型
如果你只关心这三个模型的对比结果,可以筛选一下:
sym_dm_subset <- sym_dm[c("M1","M2","M3"), c("M1","M2","M3")]
得到的结果:
M2 M1 M1 M2 M3 M1 0 1 1 M2 1 0 2 M3 1 2 0
内容的提问来源于stack exchange,提问作者SriniShine
相关产品推荐
相关产品推荐

