StringTie数据转DESeq2分析遇报错,求R语言解决方案
解决StringTie输出转DESeq2差异分析的两类报错及完整流程
报错1:DESeqDataSetFromMatrix提示"some values in assay are not integers"
- 核心原因:DESeq2要求输入原始读段计数(整数),但你传入的是StringTie输出的FPKM/TPM(浮点数),或提取计数时误转成了浮点类型。
- 解决步骤:
- 从StringTie输出中提取原始计数:StringTie加
-e参数会生成包含raw_read_count的*.tsv文件,或从*.gtf的exon行read_count属性提取。 - 预处理计数矩阵:
# 先替换NA为0 count_matrix[is.na(count_matrix)] <- 0 # 强制转换为整数类型(注意:必须用原始计数,FPKM转整数会失真) count_matrix <- apply(count_matrix, 2, as.integer) # 确保行名是基因/转录本ID,列名是样本名 rownames(count_matrix) <- gene_ids colnames(count_matrix) <- sample_names - 重新创建DESeq2对象:
library(DESeq2) # 构建分组信息,行名必须与count_matrix列名完全一致 colData <- data.frame(condition = factor(c(rep("parent", n_parent), rep("B10", n_B10))), row.names = colnames(count_matrix)) dds <- DESeqDataSetFromMatrix(countData = count_matrix, colData = colData, design = ~ condition)
- 从StringTie输出中提取原始计数:StringTie加
报错2:DESeqDataSetFromTximport提示"is(txi, "list") is not TRUE"
- 核心原因:你传入的
txi不是tximport生成的标准列表对象,而是直接传了合并后的矩阵,或tximport调用方式错误。 - 解决步骤:
- 整理所有样本的StringTie输出路径:每个样本对应一个
abundance.tsv文件,将路径存为命名向量:# 示例:亲本样本3个,B10样本3个,文件存于stringtie_output目录 parent_files <- list.files("stringtie_output", pattern = "parent.*abundance.tsv", full.names = TRUE) B10_files <- list.files("stringtie_output", pattern = "B10.*abundance.tsv", full.names = TRUE) files <- c(parent_files, B10_files) names(files) <- c("parent1", "parent2", "parent3", "B10_1", "B10_2", "B10_3") - 用tximport正确导入StringTie数据:
library(tximport) # txOut=TRUE保留转录本水平计数,若要汇总到基因水平需提供转录本-基因对应文件 txi <- tximport(files, type = "stringtie", txOut = TRUE) # 此时txi是包含counts、abundance等元素的标准列表 - 创建DESeq2对象:
colData <- data.frame(condition = factor(c(rep("parent", 3), rep("B10", 3))), row.names = names(files)) dds <- DESeqDataSetFromTximport(txi, colData = colData, design = ~ condition)
- 整理所有样本的StringTie输出路径:每个样本对应一个
完整差异分析流程(针对StringTie输出)
- 获取原始计数:StringTie运行时必须加
-e参数,输出包含原始读段计数的文件,禁止用FPKM/TPM做差异分析。 - 保证分组一致性:colData的行名必须与计数矩阵列名(或tximport的files命名)完全匹配,分组变量设为factor类型。
- DESeq2标准分析步骤:
# 过滤低表达基因(可选,提升分析效率) dds <- dds[rowSums(counts(dds)) > 1, ] # 运行差异分析 dds <- DESeq(dds) # 获取差异结果(指定KO组B10 vs 亲本) res <- results(dds, contrast = c("condition", "B10", "parent")) # 筛选显著差异基因(示例:校正后p值<0.05,折叠变化绝对值>2) res_sig <- subset(res, padj < 0.05 & abs(log2FoldChange) > 1)
内容的提问来源于stack exchange,提问作者Kim Martins
相关产品推荐
相关产品推荐

