基于p值的相关矩阵掩蔽:如何过滤对角线自相关项
优化相关矩阵可视化:过滤显著相关且隐藏自相关对角线项
基于Stack Overflow的一篇回答,我编写了以下代码,用于绘制仅展示p<0.05的显著相关系数的热力图:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from scipy import stats # 模拟3个相关变量 num_samples = 100 mu = np.array([5.0, 0.0, 10.0]) # 设定协方差矩阵 r = np.array([ [ 3.40, -2.75, -2.00], [ -2.75, 5.50, 1.50], [ -2.00, 1.50, 1.25] ]) y = np.random.multivariate_normal(mu, r, size=num_samples) df = pd.DataFrame(y) df.columns = ["Correlated1","Correlated2","Correlated3"] # 添加两个随机无关变量 for i in range(2): df.loc[:,f"Uncorrelated{i}"] = np.random.randint(-2000,2000,len(df)) def corr_sig(df=None): p_matrix = np.zeros(shape=(df.shape[1],df.shape[1])) for col in df.columns: for col2 in df.drop(col,axis=1).columns: _ , p = stats.pearsonr(df[col],df[col2]) p_matrix[df.columns.to_list().index(col),df.columns.to_list().index(col2)] = p return p_matrix def plot_cor_matrix(corr, mask=None): f, ax = plt.subplots(figsize=(11, 9)) sns.heatmap(corr, ax=ax, mask=mask, # 可视化样式设置 annot=True, cmap='coolwarm') # 绘制带显著性过滤的相关矩阵 corr = df.corr() # 计算相关系数矩阵 p_values = corr_sig(df) # 计算每个相关系数对应的p值 mask = np.invert(np.tril(p_values<0.05)) # 生成掩码:仅保留左下三角的显著相关项 plot_cor_matrix(corr,mask)

现在需要进一步优化:如何同时过滤掉特征自对比的对角线相关值(即相关系数为1的项)?
解决方案:合并对角线掩码与显著性掩码
只需在生成掩码时,额外添加一个对角线的布尔掩码,将其与原有显著性掩码合并即可:
- 创建对角线掩码:生成和相关矩阵维度一致的单位矩阵,转成布尔类型后,对角线元素为
True(代表需要隐藏这些位置)。 - 合并掩码:用逻辑或(
|)将对角线掩码和原有掩码结合,这样既隐藏非显著相关项,也隐藏对角线的自相关项。
修改后的代码片段如下:
# 绘制带显著性过滤+隐藏对角线的相关矩阵 corr = df.corr() # 计算相关系数矩阵 p_values = corr_sig(df) # 计算每个相关系数对应的p值 # 生成对角线掩码(隐藏自相关的对角线项) diag_mask = np.eye(corr.shape[0], dtype=bool) # 合并掩码:隐藏非显著相关项 + 隐藏对角线自相关项 mask = np.invert(np.tril(p_values<0.05)) | diag_mask plot_cor_matrix(corr,mask)
这样生成的热力图会同时满足两个要求:只展示左下三角中p<0.05的显著相关系数,并且隐藏所有对角线的自相关项(相关系数为1的单元格)。
内容的提问来源于Stack Exchange,提问作者Gareth Walker
相关产品推荐
相关产品推荐

