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

使用filterTaxonMatrix处理phyloseq的otu_table时出现维度错误怎么办?

解决filterTaxonMatrix使用时的otu_table维度错误问题

核心错误点及修复方案

  1. 分类表提取错误
    原代码中tax=tax_table仅赋值了函数对象,未提取实际分类表,且后续变量名使用混乱,修正为:
tax <- tax_table(phyloseqobj)

后续所有用到taxa的地方统一替换为tax。

  1. otu_table对象类型不兼容
    filterTaxonMatrix需要普通矩阵作为输入,而phyloseq的otu_table是S4对象,直接传入会导致异常。先转换为矩阵并确认维度方向(seqtime默认要求行是OTU、列是样本):
otus_mat <- as(otu_table(phyloseqobj), "matrix")
# 若原otu_table是样本在行、OTU在列,需转置:
# otus_mat <- t(otus_mat)
  1. 过滤后分类表处理笔误
    原代码存在变量名拼写错误,修正后:
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)
  1. 重新构建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:33:19