Deseq2:MAG相对丰度差异检验

article/2025/6/18 16:23:48

首先使用代码将contigs和MAG联系起来

https://github.com/MrOlm/drep/blob/master/helper_scripts/parse_stb.py

~/parse_stb.py --reverse -f ~/bin_dir/* -o ~/bin_dir/genomes.stb
# 查看第一列的contigs有没有重复(重复的话会影响后续比对)
awk '{print $1}' ~/bin_dir/genomes.stb | sort | uniq -d
# 查看格式
head ~/bin_dir/genomes.stb

 

# 合并多个mag.fa
sed 's/>/\n>/g' ~/bin_dir/*.fa | sed '/^$/d' > ~/bin_dir/all_MAGs.fa
# 建立index
bwa-mem2 index ~/bin_dir/all_MAGs.fa
# 批量比对文件
#!/bin/bash# 设置参考基因组路径
REF_FA=/home/zhongpei/diarrhoea/MJ/Data/RGIG_merge.fa
GENOME_DIR=./merged_rmg_usg_genomes/# 创建输出目录(可选)
mkdir -p bam_outputfor i in *.fastp.1.fq.gz; donum=${i%%.fastp.1.fq.gz}# Step 1: 比对到MAGs/home/zhongpei/hard_disk_sda2/zhongpei/Software/bwa-mem2/bwa-mem2 mem -t 36 \$REF_FA ${num}.fastp.1.fq.gz ${num}.fastp.2.fq.gz > ${num}_RGIG.sam# Step 2: SAM转BAM并排序 & 建索引samtools view -Sb -@ 36 ${num}_RGIG.sam | samtools sort -@ 36 -o bam_output/${num}_RGIG_sorted.bamsamtools index bam_output/${num}_RGIG_sorted.bam# 删除中间SAM文件rm -f ${num}_RGIG.sam
done# Step 3: 使用samtools获取每个genome的read count
samtools idxstats -@ 32 bam_output/${num}_RGIG_sorted.bam > bam_output/${num}_aligen_result.txt
sed -i '1iGeneID\tlength\tmapped_read\tunmapped_read' bam_output/${num}_aligen_result.txt

合并不同样品的raw reads 

#! /usr/bin/env python
# Combine raw counts from align_result.txt files
# Written by zp, adapted from PeiZhong's TPM combinerimport argparse
import os
import pandas as pdparser = argparse.ArgumentParser(description='Combine raw mapped read counts from align result files')
parser.add_argument('--work_path', '-p', help='Directory containing your align_result.txt files')
parser.add_argument('--file_maker', '-m', nargs='+', help='Keywords to filter relevant files (e.g., align_result)')
parser.add_argument('--output_name', '-o', help='Name of output OTU table (tsv format)')args = parser.parse_args()OperaPath = args.work_path
file_makers = args.file_maker
output_name = args.output_nameos.chdir(OperaPath)
files = os.listdir(OperaPath)selected_files = []
for file in files:if all(keyword in file for keyword in file_makers):selected_files.append(file)
selected_files.sort()
print(f"Files to process: {selected_files}")all_data = pd.DataFrame()for file_name in selected_files:# Extract sample name from file name (you can customize this parsing if needed)sample_name = file_name.replace('_align_result.txt', '')df = pd.read_csv(file_name, sep='\t', usecols=['GeneID', 'mapped_read'])df.columns = ['GeneID', sample_name]  # Rename mapped_read to sample nameif all_data.empty:all_data = dfelse:all_data = pd.merge(all_data, df, on='GeneID', how='outer')# Replace NaNs with 0 and convert to integers
all_data = all_data.fillna(0)
all_data.iloc[:, 1:] = all_data.iloc[:, 1:].astype(int)# Optional: sort by GeneID
all_data = all_data.sort_values(by='GeneID')# Save OTU table
all_data.to_csv(output_name, sep='\t', index=False)
print(f"Combined raw count table saved as: {output_name}")

 把contigs和bin的读数对应上

#!/usr/bin/env python
#########################################################
# Add contig raw read counts by bin mapping
# Written by PeiZhong in IFR of CAAS
# Optimized by ChatGPT for robustnessimport argparse
import pandas as pdparser = argparse.ArgumentParser(description='Aggregate contig raw read counts into bins')
parser.add_argument('--stb', '-m', required=True, help='Mapping file: contig to bin (TSV format)')
parser.add_argument('--raw_reads', '-r', required=True, help='Contig-level raw read count table (TSV format)')
parser.add_argument('--output_name', '-o', required=True, help='Output file name for bin-level count table (TSV)')args = parser.parse_args()# 1. Load contig-to-bin mapping
map_df = pd.read_csv(args.stb, sep='\t', header=None, names=["Contig", "Bin"])# 2. Load contig-level raw count matrix
count_df = pd.read_csv(args.raw_reads, sep='\t')# 3. Merge to add Bin info to contig count table
merged_df = pd.merge(map_df, count_df, left_on="Contig", right_on="GeneID", how='inner')# 4. Aggregate counts by bin (sum across contigs in the same bin)
bin_counts = merged_df.drop(columns=["Contig", "GeneID"]).groupby("Bin").sum()# 5. Save as TSV
bin_counts.to_csv(args.output_name, sep='\t')print(f"Bin-level count matrix saved to: {args.output_name}")

deseq2

# 加载包
library(DESeq2)
library(tidyverse)# Step 1: 读取 bin-level 原始 count 表
# 请将路径替换为你实际的文件名,例如:"bin_counts.tsv"
setwd("deseq2")
count_data <- read.table("rumen_data_RGIG_raw_reads_byBin.txt", header = TRUE, row.names = 1, sep = "\t", check.names = FALSE)# Step 2: 构建分组信息
# 根据样本名自动识别分组(假设 ATCC vs CK)
sample_names <- colnames(count_data)
group <- ifelse(grepl("^ATCC", sample_names), "ATCC", "CK")
col_data <- data.frame(row.names = sample_names, group = factor(group, levels = c("CK", "ATCC")))# Step 3: 构建 DESeq2 数据对象
dds <- DESeqDataSetFromMatrix(countData = count_data,colData = col_data,design = ~ group)# Step 4: 过滤低丰度 bin(可选但推荐)
dds <- dds[rowSums(counts(dds)) >= 100, ]# Step 5: 执行差异分析
dds <- DESeq(dds)
res <- results(dds, contrast = c("group", "ATCC", "CK"))# Step 6: 查看显著性结果
resSig <- res %>%as.data.frame() %>%rownames_to_column("Bin") %>%filter(padj < 0.05 & abs(log2FoldChange) > 1) %>%arrange(padj)# Step 7: 导出结果
write.table(as.data.frame(res), file = "DESeq2_all_bins.tsv", sep = "\t", quote = FALSE, col.names = NA)
write.table(resSig, file = "DESeq2_significant_bins.tsv", sep = "\t", quote = FALSE, row.names = FALSE)# Step 8: 可选可视化(火山图)
#if (!requireNamespace('BiocManager', quietly = TRUE))
#  install.packages('BiocManager')
#BiocManager::install('EnhancedVolcano')
library(EnhancedVolcano)# 设置颜色和标签
keyvals <- rep('gray', nrow(res))
names(keyvals) <- rep('Mid', nrow(res))# 高表达(ATCC 高): log2FC > 1 且 padj < 0.05
keyvals[which(res$log2FoldChange > 1 & res$padj < 0.05)] <- '#DC143C'
names(keyvals)[which(res$log2FoldChange > 1 & res$padj < 0.05)] <- 'high'# 低表达(CK 高): log2FC < -1 且 padj < 0.05
keyvals[which(res$log2FoldChange < -1 & res$padj < 0.05)] <- '#7B68EE'
names(keyvals)[which(res$log2FoldChange < -1 & res$padj < 0.05)] <- 'low'# 画 EnhancedVolcano 火山图
EnhancedVolcano(res,lab = rownames(res),x = 'log2FoldChange',y = 'padj',xlim = c(-4, 4),ylim = c(0, 15),title = 'ATCC vs CK (Bin Level)',pCutoff = 0.05,FCcutoff = 1,xlab = bquote(~Log[2]~ 'fold change'),ylab = bquote(~-Log[10]~adjusted~italic(P)),selectLab = rownames(res)[which(names(keyvals) %in% c('high', 'low'))],pointSize = 3.0,labSize = 3.0,colAlpha = 1,cutoffLineType = 'twodash',cutoffLineWidth = 0.8,colCustom = keyvals,border = 'full',legendLabels = c('NS','Log2 FC','Adjusted P','Adjusted P & Log2 FC'),legendPosition = 'right',drawConnectors = FALSE,boxedLabels = FALSE,legendLabSize = 14,legendIconSize = 4.0)# 保存图像
ggsave("volcano_plot.pdf", width = 8, height = 6)


http://www.hkcw.cn/article/AHUofyqOUm.shtml

相关文章

自动驾驶系列—Monocular 3D Lane Detection for Autonomous Driving

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

这纳米手套能「传触感」,98% 准度+无线震动反馈

*本文只做阅读笔记分享* 一、研究背景与挑战 今天我们聚焦一项针对上肢感觉障碍的创新康复技术。创伤性脊髓损伤&#xff08;TSCI&#xff09;在儿童群体中危害显著&#xff0c;因其神经系统尚未发育成熟&#xff0c;常导致患肢失用、对侧肢体过度使用等问题。当前传统疗法如…

Java基础学习

输入输出 import java.util.*; public class Main {public static void main(String[] args) {int s 888;String s1 "Hello World"; // System.out.print(s); // System.out.print(s1);System.out.println(s);System.out.println(s1);Scanner sc ne…

异构边缘智能处理加速板

简介&#xff1a; TC-ATLAS200-K7325TI是一套FPGAGPU架构的异构边缘智能处理加速板。该板基于华为 ATLAS200 GPU及Xilinx K7高性能FPGA&#xff08;可替换为复旦微JFM7K325T&#xff09;设计而成。 GPU与FPGA之间通过PCIE2.0 X4 互连&#xff0c;实现两者之间数据的高速传输。板…

进程间通信(消息队列)

目录 一 原理 二 API 1. ftok 2. msgget 3. msgctl 4. msgsnd 5. msgrcv 三 demo代码 四 基于责任链模式和消息队列对数据处理 1. 什么是责任链模式 2. 下面基于责任链模式来对消息队列获取的消息进行处理 前置 其实system v 版本的进程间通信&#xff0c;设计的接…

解决8080端口被占问题

文章目录 1. 提出问题2. 解决问题2.1 查看占用8080端口的进程2.2 杀死占用8080端口的进程2.3 测试问题是否已解决3. 实战小结1. 提出问题 运行Spring Boot项目,报错8080端口被占 2. 解决问题 2.1 查看占用8080端口的进程 执行命令:netstat -ano | findstr :8080 2.2 杀死占用…

【harbor】--基础使用

推送 不同的管理工具都有说明 以docker为例 # 第一步--打标签 docker tag SOURCE_IMAGE[:TAG] 192.168.121.201:801/haohao_fist/REPOSITORY[:TAG] # 第二步--推送 docker push 192.168.121.201:801/haohao_fist/REPOSITORY[:TAG]默认push推送为https push会失败 解决办法…

论文略读:To the Globe (TTG): Towards Language-Driven Guaranteed Travel Planning

2024 Emnlp demo 提出了TTG&#xff0c;一个演示系统&#xff0c;它能够接收用户的自然语言指令&#xff0c;并在几秒钟内生成最优的旅行行程 结合了大语言模型&#xff08;LLMs&#xff0c;Llama-3 70B&#xff09;与现有的符号求解器&#xff08;例如混合整数线性规划&#…

《操作系统真相还原》——初探保护模式

BUG 果不其然出现bug b 0x900在进入loader的时候打个断点&#xff0c;看看什么情况&#xff0c;好吧突然想起来&#xff0c;可能弄错镜像了 重新执行 正确 info gdt看一下相关信息

[yolov11改进系列]基于yolov11引入高效坐标注意力机制CoordAttention的python源码+训练源码

【CoordAttention介绍】 在轻量级网络上的研究表明&#xff0c;通道注意力会给模型带来比较显著的性能提升&#xff0c;但是通道注意力通常会忽略对生成空间选择性注意力图非常重要的位置信息。因此&#xff0c;新加坡国立大学的提出了一种为轻量级网络设计的新的注意力机制&a…

AI Agent的“搜索大脑“进化史:从Google API到智能搜索生态的技术变革

AI Agent搜索革命的时代背景 2025年agent速度发展之快似乎正在验证"2025年是agent元年"的说法&#xff0c;而作为agent最主要的应用工具之一(另外一个是coding)&#xff0c;搜索工具也正在呈现快速的发展趋势。Google在2024年12月推出Gemini Deep Research&#xff0…

以防长:辛瓦尔已死 这些人是下个目标

当地时间5月31日,以色列国防军发表声明,确认在以色列国防军与以色列国家安全总局(辛贝特)今年5月13日的联合行动中,以色列空军对巴勒斯坦伊斯兰抵抗运动(哈马斯)军事领导人穆罕默德辛瓦尔发动空袭并将其打死。以军声明称,此次空袭还打死了包括哈马斯拉法旅指挥官穆罕默…

8旬老人砍掉小区20年香樟树 私自修剪引发争议

家住浦东新区上南山水苑一期的业主王先生反映,小区内一群平均年龄七十多岁的老人以提高绿化环境为由,私自圈占公共绿化变为私人花园已有两年。物业和居委会多次劝阻无效,老人们的花越种越多。本周二上午,一位老人用网购的斧头和电锯砍伐了小花园内一棵20多年的香樟树。投诉…

代码随想录算法训练营第60期第五十三天打卡

大家好&#xff0c;我们今天来到了最后一章图论&#xff0c;其实图论比较难&#xff0c;涉及的算法也比较多&#xff0c;今天比较重要的就是深度优先搜索与广度优先搜索&#xff0c;后面的迪杰斯特拉算法等算法在我们求最短路都会涉及到&#xff0c;还有最近公共祖先&#xff0…

【Bluedriod】蓝牙协议栈GD模块(GD_SHIM_MODULE)启动机制及源码解析

本文深入剖析Android蓝牙协议栈中GD模块的启动机制&#xff0c;从模块生命周期管理、状态转换、异步初始化&#xff0c;到核心组件&#xff08;HCI层、协议栈管理器、广播/扫描/测距模块&#xff09;的协同运作。通过源码分析揭示蓝牙协议栈如何通过分层设计实现硬件抽象化、事…

threejsPBR材质与纹理贴图

1. PBR材质简介 本节课没有具体的代码&#xff0c;就是给大家科普一下PBR材质&#xff0c;所谓PBR就是&#xff0c;基于物理的渲染(physically-based rendering)。 Three.js提供了两个PBR材质相关的APIMeshStandardMaterial和MeshPhysicalMaterial,MeshPhysicalMaterial是Mes…

Leetcode 3231. 要删除的递增子序列的最小数量

1.题目基本信息 1.1.题目描述 给定一个整数数组 nums&#xff0c;你可以执行任意次下面的操作&#xff1a; 从数组删除一个 严格递增 的 子序列。 您的任务是找到使数组为 空 所需的 最小 操作数。 1.2.题目地址 https://leetcode.cn/problems/minimum-number-of-increas…

【SpringBoot实战】优雅关闭服务

文章目录 一、什么是优雅关闭&#xff1f;二、优雅关闭的核心步骤三、SpringBoot优雅关闭实现四、关键注意事项1. 超时时间必须配置2. 信号支持局限性3. 特殊请求处理 五、底层实现原理六、总结 一、什么是优雅关闭&#xff1f; 优雅关闭&#xff08;Graceful Shutdown&#x…

Redis:功能特性和应用场景

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Redis 本篇开始对于 Redis 进行正式介绍和学习 &#x1f525; 认识 Redis 在开始 Redis 学习前&#xff0c;要先认识一下 Redis Redis 的设计&#xff0c;是想要把它当做是一个数据库&#xff…

etcd详解

一、核心特性二、架构原理三、应用场景四、运维实践五、常见问题与解决方案六、与 ZooKeeper 和 Consul 的对比总结 etcd 是一个高可用的分布式键值存储系统&#xff0c;广泛应用于云原生领域&#xff0c;尤其作为 Kubernetes 的核心组件&#xff0c;用于存储集群的配置、状态和…