如何在R的FNN包中为mutinfo()的互信息计算p值
用FNN::mutinfo计算互信息后获取p值的方法
FNN::mutinfo()函数只会返回互信息的数值,不会直接给出p值。要计算对应的p值,最常用且通用的方法是置换检验——通过打乱其中一列数据的顺序,生成无关联的零假设分布,再对比观测到的互信息值在这个分布中的位置来得到p值。
具体步骤与代码示例
- 先加载包并准备数据(这里用模拟数据演示)
# 加载FNN包 library(FNN) # 模拟两列相关数据 set.seed(123) x <- rnorm(100) y <- x + rnorm(100, 0, 0.5)
- 计算观测到的互信息值
obs_mi <- mutinfo(x, y) obs_mi
- 实现置换检验计算p值
我们重复打乱其中一列(比如y)的顺序,每次计算置换后的互信息,最后统计有多少个置换后的MI大于等于观测MI:
# 设置置换次数(次数越多结果越稳定,通常至少1000次) n_perm <- 1000 # 初始化向量存储置换后的MI值 perm_mi <- numeric(n_perm) # 循环执行置换 for (i in 1:n_perm) { # 打乱y的顺序 y_perm <- sample(y) # 计算置换后的MI perm_mi[i] <- mutinfo(x, y_perm) } # 计算p值:置换后MI >= 观测MI的比例 p_value <- mean(perm_mi >= obs_mi) p_value
补充说明
- 如果你的数据是离散型变量,也可以用卡方检验来间接关联互信息(互信息和卡方统计量存在转换关系:
MI = chi2/(2*n),其中n是样本量),但置换检验的适用性更广,无论数据是连续还是离散都能用。 - 置换次数建议设置为1000以上,条件允许的话用10000次能得到更可靠的p值。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

