如何在R中计算连续矩阵数据的互信息(替代Spearman相关)
生成互信息矩阵替代Spearman相关矩阵
要生成和Spearman相关矩阵格式一致的互信息矩阵,需要注意连续变量计算互信息需先离散化(互信息默认基于离散变量的概率分布),以下是几种R语言实现方案:
方案1:使用infotheo包计算互信息
- 安装并加载包:
install.packages("infotheo") library(infotheo)
- 处理数据并生成互信息矩阵:
# 转置数据,和原Spearman计算的输入结构保持一致(变量为行,样本为列) data_t <- t(mydata) # 对连续变量离散化(等宽分箱,可调整分箱数nbins) data_discrete <- discretize(data_t, disc = "equalwidth", nbins = 5) # 生成21×21的互信息矩阵 MiMatrix <- outer(1:nrow(data_discrete), 1:nrow(data_discrete), function(i, j) mutinformation(data_discrete[i, ], data_discrete[j, ]))
方案2:使用entropy包计算互信息
- 安装并加载包:
install.packages("entropy") library(entropy)
- 生成互信息矩阵:
data_t <- t(mydata) # 直接在计算时离散化变量,生成对称矩阵 MiMatrix <- outer(1:nrow(data_t), 1:nrow(data_t), function(i, j) mi(discretize(data_t[i, ]), discretize(data_t[j, ])))
方案3:使用minerva包的最大信息系数(MIC)
如果不需要严格的互信息,而是适合连续变量的类似度量(MIC对非线性关系更敏感),可以用这个方案:
install.packages("minerva") library(minerva) data_t <- t(mydata) # 生成MIC矩阵,格式与相关矩阵一致 MiMatrix <- mine(data_t)$MIC
关键注意点:
- 离散化的分箱方式(等宽/等频)和分箱数会直接影响互信息结果,建议根据数据分布调整;
- 互信息本身是非负的,因此不需要像Spearman相关那样用
abs()取绝对值; - 所有方案生成的矩阵都是21×21的对称矩阵,和原
SpearMatrix的维度、格式完全匹配。
内容的提问来源于stack exchange,提问作者Dr. Statistics
相关产品推荐
相关产品推荐

