如何用R/Python对Immunarch分析的CDR3长度数据做标准化?
CDR3长度分布样本量标准化解决方案
一、Immunarch内直接实现标准化
repExplore默认输出的是各CDR3长度的绝对计数,样本量差异会掩盖真实分布比例。你可以手动将计数转换为相对频率后再可视化:
- 先提取原始计数数据:
len_data <- repExplore(immdata1$data, .method = "len", .col = "aa")
- 按样本分组计算相对频率:
library(dplyr) len_data_norm <- len_data %>% group_by(Sample) %>% mutate(Freq = Count / sum(Count)) %>% # 每个长度的计数占该样本总计数的比例 ungroup()
- 用Immunarch的
vis函数绘制标准化后的分布:
vis(len_data_norm, .x = "Length", .y = "Freq", .group = "Sample")
二、R中其他替代方法
如果想更灵活,用ggplot2直接处理原始数据也很方便:
library(ggplot2) # 合并所有样本数据并添加样本标识 combined_data <- dplyr::bind_rows(immdata1$data, .id = "Sample") # 计算各样本中CDR3长度的相对频率 plot_data <- combined_data %>% group_by(Sample, CDR3.aa) %>% summarise(Count = n()) %>% mutate(Length = nchar(CDR3.aa)) %>% group_by(Sample) %>% mutate(Freq = Count / sum(Count)) %>% ungroup() # 绘图 ggplot(plot_data, aes(x = Length, y = Freq, color = Sample)) + geom_line(stat = "summary", fun = "mean") + theme_minimal() + labs(x = "CDR3氨基酸长度", y = "相对频率")
三、Python中的实现
用Python的pandas和seaborn也能轻松完成标准化可视化:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 假设immdata_list是存储所有样本数据的DataFrame列表 all_dfs = [] for sample_idx, df in enumerate(immdata_list): df["Sample"] = f"Sample_{sample_idx + 1}" all_dfs.append(df) combined_df = pd.concat(all_dfs) # 计算CDR3长度及相对频率 combined_df["CDR3_Length"] = combined_df["CDR3.aa"].str.len() freq_df = combined_df.groupby(["Sample", "CDR3_Length"]).size().reset_index(name="Count") freq_df["Freq"] = freq_df.groupby("Sample")["Count"].transform(lambda x: x / x.sum()) # 绘制标准化分布 plt.figure(figsize=(12, 6)) sns.lineplot(data=freq_df, x="CDR3_Length", y="Freq", hue="Sample") plt.xlabel("CDR3氨基酸长度") plt.ylabel("相对频率") plt.title("标准化后CDR3长度分布") plt.show()
内容的提问来源于stack exchange,提问作者SData11
相关产品推荐
相关产品推荐

