16S 物种丰度热图学习

### 1. 关于热图的用途(参考http://www.360doc.com/content/17/0729/17/45848444_675155815.shtml)

以RNA-seq为例,热图可以:

    1)直观呈现多样本多个基因的全局表达量变化;

    2)呈现多样本或多基因表达量的聚类关系。

第一个问题很容易理解,毕竟使用颜色(例如红绿的深浅)来展示多个样本多个基因的表达量高低,既直观又美观。

第二个问题,则需要考虑:你是否要做聚类,是对样本聚类还是对基因聚类。

热图软件都可以选择对绘图数值进行标准正态分布化(Z score)。也就是将一组值通过均一化,使其符合均值为0,方差为1的标准正态分布。

软件: ggplot2 pheatmap

## 2 otu输入文件的处理

文述:由QIIME+USearch生成的otu 表记录的是count 数,将文件作为heatmap 的输入文件时,需要做标准化的处理。

表的处理: colname : 样本名; rowname: 物种名 ,

标准化:

rrarefy()

decostand()

相对丰度:

prop.table()

## 1 输入数据说明
head(data)
    sample1 sample2 sample3
sp1  相对丰度
sp2
sp3
sp4

(即计算sp1 在每一列的比例的百分比用函数prop.table(as.matrix(mytable),2))


## log均一化
dataLog=log2(data+1)
## pheatmap显示列的分组信息输入参数的设置
annotation_col = data.frame(group=group$group)
rownames(annotation_col) = colnames(dataLog)

## 绘图
pheatmap(dataLog, cluster_row = FALSE, annotation_col = annotation_col)

<think>我们面对的问题是在使用pheatmap时出现hclust错误,提示"外接函数调用时不能有NA/NaN/Inf(arg10)",同时有警告信息提示在dist函数中产生了NA。这通常是因为数据矩阵中包含缺失值(NA)、非数值(NaN)或无穷大(Inf)值。我们的目标是在制作前清理Excel数据,确保数据适合pheatmap处理。###解决方案步骤####1.**检查并清理数据中的问题值**-**问题值类型**:-`NA`:缺失值-`NaN`:非数值(如0/0的结果)-`Inf`或`-Inf`:无穷大(如除以0的结果)-**Excel预处理**:-在Excel中使用`查找和选择`功能定位特殊值(如错误值、空值)-利用`筛选`功能找出空白单元格(可能代表NA)-使用公式检查(例如`=ISNA(A1)`,`=ISERROR(A1)`,`=IF(ISNUMBER(A1),A1,0)`)-**R中检测**:将Excel数据导入R后,执行以下检查:```r#假设数据矩阵名为df#检查NAsum(is.na(df))#检查NaNsum(is.nan(as.matrix(df)))#检查Infsum(is.infinite(as.matrix(df)))```####2.**数据清理方法**根据问题值的分布选择清理策略:-**少量缺失值**:用均值、中位数或0替换```r#用列均值替换NAclean_df<-df%>%mutate(across(everything(),~ifelse(is.na(.),mean(.,na.rm=TRUE),.)))```-**大量缺失值**:删除整行或整列```r#删除含NA的行clean_df<-na.omit(df)#删除含NA的列clean_df<-df[,colSums(is.na(df))==0]```-**处理Inf值**:```r#将Inf替换为极大有限值(如该列最大值)clean_df<-df%>%mutate(across(where(is.numeric),~ifelse(is.infinite(.),max(.[is.finite(.)]),.)))```####3.**因子变量处理**pheatmap要求数据为数值矩阵。若数据包含因子(如Excel中文本列),需转换:```r#方法1:将因子转为数值编码clean_df<-df%>%mutate(across(where(is.character),as.factor))%>%mutate(across(where(is.factor),as.numeric))#方法2:删除非数值列(若不需要)clean_df<-df%>%select(where(is.numeric))```####4.**执行pheatmap前的验证**确保数据矩阵完全由有限数值组成:```r#最终检查stopifnot(all(is.finite(as.matrix(clean_df))))```####5.**安全运行pheatmap**使用清理后的数据绘:```rlibrary(pheatmap)pheatmap(clean_df,scale="row",#按行标准化(可选)cluster_rows=TRUE,cluster_cols=TRUE)```###示例:完整处理流程假设从Excel导入的数据框为`gene_expression`:```r#步骤1:导入数据library(readxl)gene_expression<-read_excel("expression_data.xlsx")#步骤2:清理因子列(假设第一列为基因名,不需要参与聚类)numeric_data<-gene_expression[,-1]#移除基因名列rownames(numeric_data)<-gene_expression[[1]]#设置行名#步骤3:清理问题值clean_data<-numeric_data%>%mutate(across(everything(),~ifelse(!is.finite(.),mean(.,na.rm=TRUE),.)))#步骤4:验证print(paste("问题值数量:",sum(!is.finite(as.matrix(clean_data)))))#应为0#步骤5:绘pheatmap(clean_data,fontsize_row=8)```###关键注意事项1.**数据标准化**:-避免对常数列(所有值相同)使用`scale="row"`,否则会产生NaN。可通过以下检查:```rif(any(apply(clean_data,1,sd,na.rm=TRUE)==0)){stop("存在标准差为0的行,请设置scale='none'或删除该行")}```2.**距离计算**:-`dist()`函数无法处理缺失值,清理必须彻底[^1]。3.**Excel数据导入**:-使用`readxl::read_excel()`可自动转换数值列,但需注意文本列的处理。通过以上步骤,可有效解决pheatmap因数据问题导致的hclust错误。§§相关问题§§1.如何在Excel中批量检测并替换缺失值?2.R中有哪些高效的数据清理包?3.聚类时如何选择最佳距离算法?4.如何为pheatmap添加行列注释?5.大规模基因表达数据清理的特殊技巧有哪些?</think>### 解决 pheatmap 中 NA/NaN/Inf 错误的完整方案 #### 1. **错误原因分析** 当使用 `pheatmap()` 时出现 `hclust(d, method = method) : 外接函数调用时不能有NA/NaN/Inf(arg10)` 错误,根本原因是数据中存在: - 缺失值 (`NA`) - 非数值 (`NaN`) - 无穷大值 (`Inf`/`-Inf`) 这些值会破坏距离计算(`dist()`函数),导致聚类失败[^1]。 #### 2. **Excel 数据预处理(关键步骤)** 在导入 R 前,应在 Excel 中进行以下清理: ```excel # Excel 公式示例: =IF(ISNA(A1), "", A1) # 清除NA =IF(ISERROR(A1), 0, A1) # 清除错误值 =IF(OR(A1="Inf", A1="-Inf"), "", A1) # 清除无穷大 ``` **操作流程**: 1. 全选数据区域 → **查找和选择** → **定位条件** → 勾选"错误值"和"空值" 2. 批量替换:`Ctrl+H` 将 `#N/A` 替换为空或0 3. 检查极端值:使用条件格式标记 `>1e10` 的数值 #### 3. **R 中的数据清理代码** 导入数据后执行深度清理: ```r library(tidyverse) # 读取Excel数据 data <- readxl::read_excel("your_data.xlsx") %>% as.data.frame() # 清理步骤 clean_data <- data %>% # 1. 替换所有问题值为NA mutate(across(where(is.numeric), ~ ifelse(!is.finite(.), NA, .))) %>% # 2. 删除全NA列 select(where(~!all(is.na(.)))) %>% # 3. 填充缺失值(按列均值) mutate(across(where(is.numeric), ~ ifelse(is.na(.), mean(., na.rm = TRUE), .))) %>% # 4. 转换为数值矩阵(pheatmap要求) as.matrix() # 验证数据完整性 stopifnot(all(is.finite(clean_data))) # 无NA/NaN/Inf ``` #### 4. **安全执行 pheatmap** 添加异常处理机制: ```r library(pheatmap) safe_pheatmap <- function(mat) { tryCatch({ # 检查数据可聚类性 if (any(apply(mat, 1, var) == 0)) { message("存在方差为0的行,关闭行聚类") pheatmap(mat, cluster_rows = FALSE) } else { pheatmap(mat, clustering_distance_rows = "euclidean", clustering_method = "complete") } }, error = function(e) { # 错误时生成无聚类 message("聚类失败,生成基础:", e$message) pheatmap(mat, cluster_rows = FALSE, cluster_cols = FALSE) }) } safe_pheatmap(clean_data) ``` #### 5. **特殊场景处理** **情况1:基因表达数据** ```r # 常见于16S物种丰度数据[^1] clean_data <- log2(data + 1) # 先做log转换 clean_data[is.infinite(clean_data)] <- 0 ``` **情况2:包含因子变量** ```r # 引用[4]未显示但常见问题 df %>% mutate_if(is.factor, as.numeric) %>% # 因子转数值 mutate_all(~ ifelse(is.na(.), median(., na.rm = TRUE), .)) ``` ### 错误预防建议 1. **数据检查管道**: ```r validate_matrix <- function(mat) { stopifnot( "存在NA值" = !any(is.na(mat)), "存在无穷值" = all(is.finite(mat)), "存在非数值" = !any(is.nan(mat)) ) } validate_matrix(clean_data) ``` 2. **可视化检查**: ```r corrplot::corrplot(cor(clean_data)) # 先查看相关性 ``` > **关键提示**:90%的错误源于未清理的极端值或缺失值[^1]。对于16S等生物数据,log转换应在清理前进行[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值