两组矩阵列表逐坐标t检验获取14×14 p值矩阵实现问题咨询
实现方案
核心逻辑
你需要对14×14网格的每一个坐标位置,分别提取A组10个样本、B组11个样本在该位置的数值,做独立样本t检验,将得到的p值填入结果矩阵对应坐标即可。
Python 实现(推荐)
依赖numpy做数组处理,scipy做t检验,优先用向量化操作,不需要手动写循环:
import numpy as np from scipy.stats import ttest_ind # 示例模拟数据,使用时替换为你自己的列表A、B A = [np.random.rand(14, 14) for _ in range(10)] B = [np.random.rand(14, 14) for _ in range(11)] # 将列表转换为三维数组,形状分别为 (样本量, 14, 14) arr_A = np.array(A) arr_B = np.array(B) # 沿样本维度(第0维)批量做t检验,直接得到14x14的t值矩阵和p值矩阵 # 方差齐用默认equal_var=True,方差不齐改设为False执行Welch's t检验 t_stats, p_matrix = ttest_ind(arr_A, arr_B, axis=0, equal_var=True) # 验证输出维度,结果为(14,14)即符合要求 print(p_matrix.shape)
如果你偏好更直观的逐坐标循环写法(14×14的小维度下性能无差异),可以用如下代码:
import numpy as np from scipy.stats import ttest_ind p_matrix = np.zeros((14, 14)) for i in range(14): for j in range(14): # 分别提取两组对应坐标的所有样本值 group_a_vals = [mat[i][j] for mat in A] group_b_vals = [mat[i][j] for mat in B] # 执行t检验,存储p值 _, p_val = ttest_ind(group_a_vals, group_b_vals, equal_var=True) p_matrix[i][j] = p_val
补充说明
- 如果后续需要做多重检验校正(比如FDR校正控制假阳性),可以调用
scipy.stats.multitest.multipletests对展平的p值做校正后,再reshape回14×14的矩阵即可。 - R语言实现思路完全一致:将两个列表转为三维数组后,用
apply函数沿样本维度逐坐标调用t.test即可得到结果。
内容的提问来源于stack exchange,提问作者baptbapt
相关产品推荐
相关产品推荐

