DeepGraph计算相关性添加p值报错:Data must be 1-dimensional
解决DeepGraph计算p值时的维度错误问题
问题场景
使用DeepGraph库计算大矩阵的相关系数,输出为多级索引DataFrame,希望添加对应p值列,自定义p_Val函数计算p值时触发如下错误:
ValueError: Data must be 1-dimensional
错误原因
p_Val函数中调用scipy.stats.spearmanr的方式不符合DeepGraph的要求:
index_s和index_t是批量索引,对应多对特征,features_s和features_t为二维数组(形状为[批量数, 样本数])- 默认的
spearmanr会对整个二维数组计算全局相关系数,返回单个p值而非每个特征对对应的一维p值数组,导致DeepGraph无法将其转换为DataFrame的列
对比正确的corr函数:用np.einsum批量处理每一对特征,返回一维数组,完全符合DeepGraph对connector函数的输出要求。
解决方案
方案1:修改p_Val函数,返回一维p值数组
调整p_Val函数,遍历每一对特征计算p值,最终返回一维numpy数组:
def p_Val(index_s, index_t): features_s = X[index_s] features_t = X[index_t] p_values = [] for s, t in zip(features_s, features_t): _, p = spearmanr(s, t) p_values.append(p) return np.array(p_values)
方案2:合并计算逻辑,提升效率
更高效的方式是将相关系数和p值的计算合并到一个connector函数中,避免重复创建DeepGraph实例和加载特征数据:
def corr_and_pval(index_s, index_t): features_s = X[index_s] features_t = X[index_t] # 批量计算Spearman相关系数(已提前对X做排序,等价于Pearson计算) corr = np.einsum('ij,ij->i', features_s, features_t) / n_samples # 批量计算p值 p_values = [] for s, t in zip(features_s, features_t): _, p = spearmanr(s, t) p_values.append(p) # 返回包含两列的DataFrame return pd.DataFrame({'corr': corr, 'p_val': np.array(p_values)})
然后修改create_ei函数,仅需一次边创建操作:
def create_ei(i): from_pos = pos_array[i] to_pos = pos_array[i+1] g = dg.DeepGraph(v) # 一次创建包含相关系数和p值的边表 g.create_edges(connectors=corr_and_pval, step_size=step_size, from_pos=from_pos, to_pos=to_pos) g.e.to_pickle('tmp/correlations/{}_corr_pval.pickle'.format(str(i).zfill(3)))
额外修复
删除代码末尾多余的store.close()语句(未初始化store对象,会引发新的错误)。
内容的提问来源于stack exchange,提问作者AennaPhD
相关产品推荐
相关产品推荐

