You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASV表与元数据表相关性分析代码报错:无法计算丰度总和

解决ASV丰度与环境因子相关性分析的问题

问题核心

你的代码报错主要源于两点:

  • ASV表格中存在非数值型的丰度数据,直接求和触发类型错误
  • ASV表格结构未调整,无法与样本元数据正确匹配合并

修正后的完整代码

import pandas as pd
from scipy.stats import pearsonr, spearmanr

# 读取ASV表格:假设第一列为ASV编号,其余列为样本ID,单元格为丰度值
# 设置index_col=0将ASV列设为索引,强制丰度列为float类型,非数值转NaN
asv_table = pd.read_csv(
    r"C:\Users\gunne\Downloads\Page1_ASV.csv",
    encoding='latin1',
    index_col=0,
    dtype={col: float for col in pd.read_csv(r"C:\Users\gunne\Downloads\Page1_ASV.csv", encoding='latin1').columns[1:]}
)

# 读取元数据表,确保sample_id为字符串类型,避免匹配时因类型不一致失败
metadata = pd.read_csv(
    r"C:\Users\gunne\Downloads\2021_metadata_csv.csv",
    encoding='latin1',
    dtype={'sample_id': str}
)

# 计算每个ASV的总丰度(按行求和),排序取前20个高丰度ASV
asv_total_abundance = asv_table.sum(axis=1).sort_values(ascending=False)
top_20_asvs = asv_total_abundance[:20].index

# 筛选前20个ASV数据,转置后让行变为样本ID,列变为ASV(适配元数据合并格式)
top_asv_data = asv_table.loc[top_20_asvs].T.reset_index()
top_asv_data.rename(columns={'index': 'sample_id'}, inplace=True)
top_asv_data['sample_id'] = top_asv_data['sample_id'].astype(str)

# 合并ASV丰度数据与元数据,按sample_id匹配
merged_data = pd.merge(top_asv_data, metadata, on='sample_id', how='inner')

# 筛选元数据中的数值型列(仅数值可做相关性分析)
numeric_env_factors = metadata.select_dtypes(include=['int64', 'float64']).columns

# 计算相关性并存储结果
results = {}
for asv in top_20_asvs:
    for factor in numeric_env_factors:
        # 过滤NaN值,避免统计函数报错
        valid_data = merged_data[[asv, factor]].dropna()
        if len(valid_data) < 3:  # 样本量不足时跳过,无统计学意义
            results[(asv, factor)] = {"Pearson correlation": None, "Spearman correlation": None}
            continue
        r_pearson, p_pearson = pearsonr(valid_data[asv], valid_data[factor])
        r_spearman, p_spearman = spearmanr(valid_data[asv], valid_data[factor])
        results[(asv, factor)] = {
            "Pearson correlation": round(r_pearson, 2),
            "Pearson p-value": round(p_pearson, 4),
            "Spearman correlation": round(r_spearman, 2),
            "Spearman p-value": round(p_spearman, 4)
        }

# 打印分析结果
for (asv, factor), values in results.items():
    print(f"{asv} vs {factor}:")
    print(f"  Pearson: r={values['Pearson correlation']}, p={values['Pearson p-value']}")
    print(f"  Spearman: r={values['Spearman correlation']}, p={values['Spearman p-value']}\n")

关键修改说明

  1. ASV数据类型处理:

    • 将ASV编号设为索引,避免干扰数值计算;强制丰度列为float类型,非数值内容转NaN,解决求和报错问题
  2. 丰度筛选逻辑修正:

    • 按行求和(axis=1)计算每个ASV的总丰度,这是筛选高丰度生产者的正确逻辑(每行对应一个ASV,求和为该ASV在所有样本中的总丰度)
  3. 数据结构适配:

    • 转置ASV表格,让行变为样本ID,列变为ASV,确保能与元数据表的sample_id列正确匹配合并
  4. 相关性分析优化:

    • 仅对元数据中的数值型列计算相关性,跳过字符串类因子(如分组标签)
    • 过滤NaN值,增加样本量判断,避免无意义的统计结果
    • 同时输出相关系数与p值,p值是判断相关性显著性的核心指标
  5. 匹配一致性保证:

    • 将sample_id统一转为字符串类型,避免因整数/字符串类型不一致导致合并失败

内容的提问来源于stack exchange,提问作者Gunner32223

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:35:02