带重复样本的z-score计算及基因表达热图绘制技术咨询
解决基因表达重复样本的z-score计算与热图绘制问题
核心思路
你的需求是把每个基因-条件组合的5次重复值浓缩为1个z-score,用于热图比较不同细胞培养条件下的基因表达模式。由于数据存在异常值,优先选择**中位数+中位数绝对偏差(MAD)**计算稳健z-score,比均值+标准差的传统方法抗干扰能力更强;NA值直接忽略(不参与统计量计算,因代表无检测信号而非数值0)。
步骤1:数据预处理(R代码)
先将表格整理为tidy格式,方便后续分组计算:
# 加载必要工具包 library(tidyverse) library(pheatmap) # 模拟你的实验数据(替换为真实数据导入,比如用read.csv()读取本地文件) df <- tibble( 基因 = c(rep("基因1",5), rep("基因2",5)), 条件1 = c(0.22,0.34,0.45,0.33,0.55,12,19.3,23.4,11.7,12.4), 条件2 = c(120,122,119,34,90,0.1,0.45,NA,0.89,0.1) ) # 拆分基因列中的基因ID与重复标记,转换为长格式 df_long <- df %>% separate(基因, into = c("基因ID", "重复"), sep = " ") %>% pivot_longer(cols = starts_with("条件"), names_to = "条件", values_to = "表达量")
步骤2:计算z-score(两种方案可选)
方案A:稳健z-score(推荐,适配异常值场景)
稳健z-score公式:z = (x - 基因全局中位数) / (1.4826 * 基因全局MAD),其中1.4826是校准系数,让MAD与正态分布下的标准差等价。
# 按基因ID计算全局统计量(所有条件+重复的中位数和MAD) gene_stats <- df_long %>% group_by(基因ID) %>% summarise( 基因中位数 = median(表达量, na.rm = TRUE), 基因MAD = mad(表达量, na.rm = TRUE) ) # 合并统计量,计算每个重复的稳健z-score,再按基因+条件取中位数浓缩为单值 z_score_robust <- df_long %>% left_join(gene_stats, by = "基因ID") %>% mutate(稳健z_score = (表达量 - 基因中位数) / (1.4826 * 基因MAD)) %>% group_by(基因ID, 条件) %>% summarise(最终z_score = median(稳健z_score, na.rm = TRUE)) %>% pivot_wider(names_from = 条件, values_from = 最终z_score) %>% column_to_rownames("基因ID")
方案B:传统z-score(无异常值时可用)
如果数据异常值极少,可选用均值+标准差的传统方法:
# 按基因ID计算全局均值和标准差 gene_stats_mean <- df_long %>% group_by(基因ID) %>% summarise( 基因均值 = mean(表达量, na.rm = TRUE), 基因标准差 = sd(表达量, na.rm = TRUE) ) # 计算传统z-score并浓缩重复样本 z_score_traditional <- df_long %>% left_join(gene_stats_mean, by = "基因ID") %>% mutate(传统z_score = (表达量 - 基因均值) / 基因标准差) %>% group_by(基因ID, 条件) %>% summarise(最终z_score = mean(传统z_score, na.rm = TRUE)) %>% pivot_wider(names_from = 条件, values_from = 最终z_score) %>% column_to_rownames("基因ID")
步骤3:绘制热图
使用pheatmap包绘制标准化后的热图:
# 基于稳健z-score结果绘图 pheatmap(z_score_robust, cluster_rows = TRUE, cluster_cols = TRUE, na_col = "gray", # 标记残留的NA值 main = "基因表达稳健z-score热图", show_rownames = TRUE, show_colnames = TRUE)
关键说明
- 重复样本浓缩逻辑:用中位数而非均值浓缩重复样本的z值,避免异常值(如基因1条件2的34)拉偏结果,更符合你数据的异常值场景。
- 标准化维度:按基因自身全局分布标准化,热图能直观展示每个基因在不同条件下的表达相对变化趋势。
- NA处理:所有计算均通过
na.rm=TRUE忽略NA,符合“无检测信号”的实验定义。
内容的提问来源于stack exchange,提问作者Marta
相关产品推荐
相关产品推荐

