Scipy双样本t检验与秩和检验技术求助
解决每行独立的双样本t检验与秩和检验问题
首先得指出你现有代码的核心问题:你在循环里完全没用到iterrows()返回的行数据,而是反复对整个数据集的sum_case和sum_ctrl做检验,这显然不是你要的「每行对应一个独立ID分别检验」的效果。
接下来我们一步步修正这个问题,实现你想要的功能:
步骤1:先正确区分病例组和对照组的列
根据你给出的CSV格式,首先得把**病例组(Label=1)和对照组(Label=0)**对应的列提取出来,这样才能针对每行的两组数据做检验:
import pandas as pd from scipy.stats import ttest_ind, ranksums # 读取数据,注意跳过前两行的元数据(SRA ID行和TaxID标识行) df = pd.read_csv('final_out_transposed.csv', skiprows=[0, 1]) # 单独读取Label行来分组列 label_info = pd.read_csv('final_out_transposed.csv', nrows=1).iloc[0] case_cols = label_info[label_info == 1].index.tolist() # 病例组列名 ctrl_cols = label_info[label_info == 0].index.tolist() # 对照组列名
步骤2:遍历每行执行独立检验
现在我们可以逐个遍历每个TaxID对应的行,提取该行的病例组和对照组数据,再分别执行t检验和秩和检验:
# 创建空列表存储所有结果 test_results = [] for idx, row in df.iterrows(): # 获取当前行的病例组、对照组数据,同时去掉缺失值 case_data = row[case_cols].dropna().values ctrl_data = row[ctrl_cols].dropna().values # 只有当两组样本量都≥2时才执行检验,避免报错 if len(case_data) >= 2 and len(ctrl_data) >= 2: # 用Welch t检验(方差不齐时更稳健) t_stat, t_pval = ttest_ind(case_data, ctrl_data, equal_var=False) # 秩和检验(非正态分布数据优先选择) rank_stat, rank_pval = ranksums(case_data, ctrl_data) else: # 样本量不足时填充空值 t_stat, t_pval = None, None rank_stat, rank_pval = None, None # 把当前行的结果存入列表 test_results.append({ 'TaxID': row['TaxID'], 't检验统计量': t_stat, 't检验p值': t_pval, '秩和检验统计量': rank_stat, '秩和检验p值': rank_pval }) # 把结果转成DataFrame,方便查看和保存 results_df = pd.DataFrame(test_results) print(results_df.head()) # 保存结果到CSV文件 results_df.to_csv('taxid检验结果.csv', index=False)
几个关键注意点
- 样本量校验:t检验和秩和检验都需要每组至少2个有效样本,加判断能避免因数据缺失或样本量不足导致的报错。
- 方差齐性处理:用
equal_var=False的Welch t检验是更稳妥的选择,不用提前验证方差是否相等。 - 缺失值处理:用
dropna()过滤缺失值,保证检验的有效性。 - 数据结构适配:如果你的CSV实际结构和示例有差异(比如Label行的位置不同),需要调整
label_info的读取逻辑,确保正确分组列。
这样修改后,就能实现每个TaxID(每行)独立对病例组和对照组数据执行检验的需求了。
内容的提问来源于stack exchange,提问作者K.S
相关产品推荐
相关产品推荐

