使用filterTaxonMatrix处理phyloseq的otu_table时出现维度错误怎么办?
解决
filterTaxonMatrix使用时的otu_table维度错误问题 核心错误点及修复方案
- 分类表提取错误
原代码中tax=tax_table仅赋值了函数对象,未提取实际分类表,且后续变量名使用混乱,修正为:
tax <- tax_table(phyloseqobj)
后续所有用到taxa的地方统一替换为tax。
- otu_table对象类型不兼容
filterTaxonMatrix需要普通矩阵作为输入,而phyloseq的otu_table是S4对象,直接传入会导致异常。先转换为矩阵并确认维度方向(seqtime默认要求行是OTU、列是样本):
otus_mat <- as(otu_table(phyloseqobj), "matrix") # 若原otu_table是样本在行、OTU在列,需转置: # otus_mat <- t(otus_mat)
- 过滤后分类表处理笔误
原代码存在变量名拼写错误,修正后:
tax.f <- tax[setdiff(1:nrow(tax), filterobj$filtered.indices), ] dummyTaxonomy <- c("k__dummy","p__","c__","o__","f__","g__","s__") tax.f <- rbind(tax.f, dummyTaxonomy)
- 重新构建phyloseq对象的维度验证
过滤后重新生成otu_table时,必须明确指定taxa_are_rows参数,确保维度合法:
otus_f_otu <- otu_table(otus.f, taxa_are_rows = TRUE) tax_f_tax <- tax_table(as.matrix(tax.f)) filtered_phyloseq <- phyloseq(otus_f_otu, tax_f_tax)
完整修复后的代码片段
# 包加载部分保留原代码 library(devtools) install_github("zdk123/SpiecEasi") library(SpiecEasi) source('http://bioconductor.org/biocLite.R') biocLite('phyloseq') library(phyloseq) install_github("hallucigenia-sparsa/seqtime") library(seqtime) # 路径设置 input.path="C:/Users/kenby/OneDrive/Documents/Grad_Project/SchillerPark/Network_Analysis/Network_code/" output.path="C:/Users/kenby/OneDrive/Documents/Grad_Project/SchillerPark/Network_Analysis/Network_code/" biom.path=file.path(input.path,"Schiller_otu_json.biom") # 加载biom文件 phyloseqobj=import_biom(biom.path) # 转换otu表为普通矩阵并确认维度 otus_mat <- as(otu_table(phyloseqobj), "matrix") if (!taxa_are_rows(otu_table(phyloseqobj))) { otus_mat <- t(otus_mat) } # 提取分类表 tax <- tax_table(phyloseqobj) # 过滤OTU filterobj=filterTaxonMatrix(otus_mat,minocc=20,keepSum = TRUE, return.filtered.indices = TRUE) otus.f=filterobj$mat tax.f=tax[setdiff(1:nrow(tax),filterobj$filtered.indices),] # 添加dummy分类条目 dummyTaxonomy=c("k__dummy","p__","c__","o__","f__","g__","s__") tax.f=rbind(tax.f,dummyTaxonomy) rownames(tax.f)[nrow(tax.f)]="0" rownames(otus.f)[nrow(otus.f)]="0" # 重新构建合法的phyloseq对象 otus_f_otu <- otu_table(otus.f, taxa_are_rows = TRUE) tax_f_tax <- tax_table(as.matrix(tax.f)) filtered_phyloseq <- phyloseq(otus_f_otu, tax_f_tax)
额外排查建议
- 执行
dim(otus_mat)确认初始矩阵的行/列数,确保不是空矩阵 - 查看
filterobj$filtered.indices长度,确认过滤后剩余OTU数量是否合理 - 若
minocc=20设置过高导致所有OTU被过滤,可降低该值测试
内容的提问来源于stack exchange,提问作者point_top
相关产品推荐
相关产品推荐

