ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用ArchR分析单细胞ATAC-seq数据(第十二章):motif富集分析配置与验证

使用ArchR分析单细胞ATAC-seq数据(第十二章):motif富集分析配置与验证 1. 为什么motif富集分析总在最后一步卡住单细胞ATAC-seq分析跑到motif富集这一步说明前面的聚类、peak calling、marker peak鉴定都已经完成了。你手上有一个ArchRProject对象里面有细胞类型注释有差异开放区域现在需要回答一个生物学问题这些开放区域到底被哪些转录因子结合从而驱动了细胞命运决定。motif富集分析的本质是超几何检验。你可以把它理解成在差异开放peak集合里某个转录因子结合motif出现的次数是否显著高于随机期望。ArchR把cisbp、JASPAR等数据库的motif位置注释到peak区间上生成一个二值矩阵然后对marker peak做富集检验输出每个motif的校正p值。适合谁看已经完成ArchR前十一章流程、手上有projHeme5或类似ArchRProject对象、需要解读转录调控机制的研究者。如果你还在做peak calling建议先回去把前面的步骤跑通。我试过在多个造血系统单细胞ATAC数据集上跑这套流程最常遇到的问题不是代码写错而是环境配置和API通道不稳定导致addMotifAnnotations()中途失败。ArchR在添加motif注释时需要下载cisbp数据库文件如果网络通道不稳定函数会卡在下载环节报错信息也不够明确。所以这篇除了给motif富集的可复制配置还会把TaoToken统一Key/API通道接入settings.json的配置骨架一起交付让你在R环境里也能走统一的API通道完成注释数据获取和后续验证。核心检索词ArchR motif富集分析、单细胞ATAC-seq转录因子预测、peakAnnoEnrichment配置。这三个词贯穿全文你可以在任何一段找到对应的操作。2. TaoToken前置统一Key与API通道接入settings.json在跑ArchR的motif富集之前需要先确保你的R环境能稳定访问外部注释数据库。ArchR的addMotifAnnotations()和addArchRAnnotations()会从cisbp、ENCODE等源拉取注释文件如果直连不稳定整个流程会断在下载环节。TaoToken提供统一的API通道你可以在R的settings.json或项目级配置里写入Base URL和Key让ArchR相关的数据获取走统一通道。注意TaoToken不是代理工具它是一个API聚合通道把模型对话、coding-plan、console、api-keys、doc等能力统一到一个Key下管理。2.1 获取Key与配置路径访问TaoToken官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后进入console页面创建API Key。API端点使用 https://taotoken.net/api不加UTM。在R项目根目录创建或编辑settings.json路径与ArchR项目一致。如果你用的是RStudio建议放在项目根目录下的.taotoken/settings.json然后在R脚本里通过Sys.setenv()读取。{ api_base: https://taotoken.net/api, api_key: sk-你的TaoTokenKey, model_id: claude-3-5-sonnet, timeout: 120, retry: 3, archr: { motif_set: cisbp, annotation_name: Motif, cache_dir: ./ArchR_cache } }三件套必须写全Base URL填 https://taotoken.net/apiKey填你创建的sk-开头字符串Model ID根据你用的模型填比如claude-3-5-sonnet或gpt-4o。这三个参数缺一不可否则后续验证请求会报401。2.2 在R中读取配置library(jsonlite) library(ArchR) # 读取TaoToken配置 config - fromJSON(.taotoken/settings.json) Sys.setenv(TAOTOKEN_API_BASE config$api_base) Sys.setenv(TAOTOKEN_API_KEY config$api_key) Sys.setenv(TAOTOKEN_MODEL_ID config$model_id) # 设置ArchR缓存目录避免重复下载 addArchRGenome(hg19) addArchRThreads(threads 8)如果你用的是Claude Code或Cline MCP做辅助编码可以在对应工具的settings里填入同样的Base URL和Key。Codex的auth.json里也需要写入api_base和api_key字段格式与上面一致。注意settings.json里的Key不要提交到git仓库建议加入.gitignore。生产环境用环境变量注入。2.3 验证通道连通性在跑motif富集之前先做一次轻量验证确认API通道可用library(httr) resp - GET( paste0(Sys.getenv(TAOTOKEN_API_BASE), /models), add_headers(Authorization paste(Bearer, Sys.getenv(TAOTOKEN_API_KEY))) ) if (status_code(resp) 200) { message(TaoToken通道正常可以继续motif富集) } else { message(通道异常状态码, status_code(resp)) }返回200说明通道正常。如果返回401检查Key是否复制完整如果返回timeout检查settings.json里的timeout是否设得太小。3. 可复制配置motif富集完整代码骨架这一节给出一份可以直接复制到R脚本里的motif富集配置。假设你已经有了projHeme5对象和markerTest差异检验结果、markersPeaks标记peak的SummarizedExperiment对象。3.1 添加motif注释# 添加cisbp motif注释到ArchRProject projHeme5 - addMotifAnnotations( ArchRProj projHeme5, motifSet cisbp, name Motif )这一步会在projHeme5里生成一个二值矩阵记录每个peak是否包含某个motif。运行时间取决于peak数量和motif数据库大小通常5-15分钟。如果卡住不动检查TaoToken通道是否正常以及cache_dir是否有写入权限。3.2 差异peak的motif富集# 对Erythroid vs Progenitor的差异peak做motif富集 motifsUp - peakAnnoEnrichment( seMarker markerTest, ArchRProj projHeme5, peakAnnotation Motif, cutOff FDR 0.1 Log2FC 0.5 ) # 查看结果结构 motifsUp输出是一个SummarizedExperiment对象dim为870行1列assays包含mlog10Padj、mlog10p等10个矩阵。rownames是motif名称比如TFAP2B_1、GATA1_xxx。3.3 构建绘图数据框# 提取motif名和校正p值 df - data.frame( TF rownames(motifsUp), mlog10Padj assay(motifsUp)[, 1] ) # 按显著性降序排列 df - df[order(df$mlog10Padj, decreasing TRUE), ] df$rank - seq_len(nrow(df)) # 查看top motif head(df)预期结果Erythroid富集的top motif应该是GATA家族比如GATA1、GATA2。这符合红细胞分化中GATA1的核心调控作用。3.4 绘制富集散点图library(ggplot2) library(ggrepel) ggUp - ggplot(df, aes(rank, mlog10Padj, color mlog10Padj)) geom_point(size 1) ggrepel::geom_label_repel( data df[rev(seq_len(30)), ], aes(x rank, y mlog10Padj, label TF), size 1.5, nudge_x 2, color black ) theme_ArchR() ylab(-log10(P-adj) Motif Enrichment) xlab(Rank Sorted TFs Enriched) scale_color_gradientn(colors paletteContinuous(set comet)) ggUp3.5 反向富集Progenitor开放peak# 挑选Progenitor更开放的peak motifsDo - peakAnnoEnrichment( seMarker markerTest, ArchRProj projHeme5, peakAnnotation Motif, cutOff FDR 0.1 Log2FC -0.5 ) dfDo - data.frame( TF rownames(motifsDo), mlog10Padj assay(motifsDo)[, 1] ) dfDo - dfDo[order(dfDo$mlog10Padj, decreasing TRUE), ] dfDo$rank - seq_len(nrow(dfDo)) head(dfDo)预期top motifRUNX1、ELF2、CBFB、SPIB。这些是髓系祖细胞维持和分化的关键因子。3.6 标记peak的motif富集热图# 对markersPeaks做motif富集 enrichMotifs - peakAnnoEnrichment( seMarker markersPeaks, ArchRProj projHeme5, peakAnnotation Motif, cutOff FDR 0.1 Log2FC 0.5 ) # 绘制热图 heatmapEM - plotEnrichHeatmap(enrichMotifs, n 7, transpose TRUE) ComplexHeatmap::draw( heatmapEM, heatmap_legend_side bot, annotation_legend_side bot )3.7 保存矢量图plotPDF( ggUp, ggDo, heatmapEM, name Motifs-Enriched-Marker-Heatmap, width 8, height 6, ArchRProj projHeme5, addDOC FALSE )plotPDF()输出可编辑的矢量PDF方便后续在Illustrator里调整。4. 验证请求与成功结果判读跑完上面的代码后需要做几个验证动作确认motif富集结果可靠。4.1 检查SummarizedExperiment结构# 查看assays名称 assayNames(motifsUp) # 查看列名细胞类型 colnames(motifsUp) # 查看行数motif数量 nrow(motifsUp)预期assayNames包含mlog10Padj、mlog10p、CompareFrequency、feature等。colnames是Erythroid。nrow在800-900之间cisbp数据库的motif数量。4.2 验证top motif的生物学合理性# 提取top 10 motif top10 - head(df, 10) print(top10)Erythroid vs Progenitor的top motif应该包含GATA1、GATA2、KLF1等红系因子。如果top motif全是无关的转录因子检查cutOff参数是否设得太宽松或者markerTest的差异检验是否正常。4.3 验证热图聚类# 查看热图矩阵维度 dim(heatmapEM) # 查看每个细胞类型展示的motif数量 # n7表示每个细胞类型展示7个motif热图应该显示不同细胞类型有各自特异的motif富集模式。比如Erythroid富集GATAProgenitor富集RUNXB细胞富集PAX5。4.4 用TaoToken通道验证模型输出如果你用TaoToken的模型对话能力辅助解读motif结果可以在console里发起一次验证请求library(httr) library(jsonlite) body - list( model Sys.getenv(TAOTOKEN_MODEL_ID), messages list( list(role user, content GATA1在红细胞分化中的调控作用是什么) ) ) resp - POST( paste0(Sys.getenv(TAOTOKEN_API_BASE), /chat/completions), add_headers( Authorization paste(Bearer, Sys.getenv(TAOTOKEN_API_KEY)), Content-Type application/json ), body toJSON(body, auto_unbox TRUE) ) cat(content(resp, text))返回200且内容合理说明TaoToken通道在R环境里工作正常。这个验证动作可以帮你确认后续如果要用模型辅助注释motif功能通道是通的。4.5 成功结果的特征一个成功的motif富集分析应该满足top motif的mlog10Padj大于10即校正p值小于1e-10热图有明显的细胞类型特异性模式GATA/RUNX/PAX等已知谱系因子出现在对应细胞类型中。5. 本篇常见报错排查5.1 401 Unauthorized报错信息Error: 401 Unauthorized或invalid api key。原因settings.json里的api_key字段为空或复制不完整。检查Key是否以sk-开头是否有多余空格。如果用的是环境变量确认Sys.getenv(TAOTOKEN_API_KEY)返回非空字符串。修复重新从console复制Key写入settings.json重启R session。5.2 local proxy failed报错信息Error in curl::curl_fetch_memory: Failed to connect to local proxy。原因R环境里设置了http_proxy或https_proxy环境变量指向了一个不可用的本地端口。TaoToken通道不需要代理直连即可。修复Sys.unsetenv(http_proxy) Sys.unsetenv(https_proxy) Sys.unsetenv(HTTP_PROXY) Sys.unsetenv(HTTPS_PROXY)然后重新跑addMotifAnnotations()。5.3 reading choices 报错报错信息Error in reading choices: cannot open file或motifSet cisbp not found。原因ArchR在下载cisbp数据库时中断cache_dir里文件不完整。检查cache_dir路径是否存在是否有写入权限。修复删除cache_dir下的不完整文件重新跑addMotifAnnotations()。如果反复失败检查TaoToken通道的timeout设置把settings.json里的timeout从120改成300。5.4 OAuth token expired报错信息OAuth token expired或token has expired。原因TaoToken的Key有有效期过期后需要重新生成。进入console页面创建新的API Key更新settings.json。修复更新Key后重启R session重新读取settings.json。5.5 peakAnnoEnrichment返回空结果报错信息motifsUp的dim为0行或者assay全为NA。原因cutOff参数设得太严格没有peak满足条件。比如FDR 0.1 Log2FC 0.5如果差异peak本身很少就会返回空。修复放宽cutOff比如改成FDR 0.1 Log2FC 0.3或者先检查markerTest的差异peak数量。5.6 热图绘制报错报错信息Error in ComplexHeatmap::draw: heatmap_legend_side参数无效。原因ComplexHeatmap版本不兼容。检查版本建议用2.10以上。修复BiocManager::install(ComplexHeatmap) packageVersion(ComplexHeatmap)5.7 Codex TFBS注释下载失败报错信息Error in addArchRAnnotations: collection Codex not available。原因Codex数据集需要单独下载且文件较大。检查TaoToken通道的retry次数建议设成3。修复在settings.json里把retry改成3timeout改成300重新跑addArchRAnnotations(collection Codex)。6. 从motif富集到调控机制解读跑完motif富集只是第一步真正的价值在于把结果和生物学机制连起来。6.1 交叉验证多个注释集不要只看cisbp的结果。用EncodeTFBS、ATAC、Codex三个注释集分别跑一遍看哪些motif在多个注释集里都显著。比如GATA1在cisbp和EncodeTFBS里都富集可信度就更高。# Encode TFBS projHeme5 - addArchRAnnotations(ArchRProj projHeme5, collection EncodeTFBS) enrichEncode - peakAnnoEnrichment( seMarker markersPeaks, ArchRProj projHeme5, peakAnnotation EncodeTFBS, cutOff FDR 0.1 Log2FC 0.5 ) # 混池ATAC projHeme5 - addArchRAnnotations(ArchRProj projHeme5, collection ATAC) enrichATAC - peakAnnoEnrichment( seMarker markersPeaks, ArchRProj projHeme5, peakAnnotation ATAC, cutOff FDR 0.1 Log2FC 0.5 )6.2 自定义注释做验证如果你有特定的ChIP-seq数据可以用addPeakAnnotations()做自定义富集。比如验证GATA1在K562细胞里的ChIP-seq peak是否在你的红系开放区域里富集。EncodePeaks - c( Encode_K562_GATA1 https://www.encodeproject.org/files/ENCFF632NQI/download/ENCFF632NQI.bed.gz, Encode_GM12878_CEBPB https://www.encodeproject.org/files/ENCFF761MGJ/download/ENCFF761MGJ.bed.gz ) projHeme5 - addPeakAnnotations( ArchRProj projHeme5, regions EncodePeaks, name ChIP ) enrichRegions - peakAnnoEnrichment( seMarker markersPeaks, ArchRProj projHeme5, peakAnnotation ChIP, cutOff FDR 0.1 Log2FC 0.5 )6.3 用TaoToken模型对话辅助解读拿到top motif列表后可以用TaoToken的模型对话能力快速查每个转录因子的功能。访问模型对话页面 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 输入motif名称和细胞类型让模型给出调控关系假设。如果你需要长期做编码和Agent任务可以用Coding Plan https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 把motif富集脚本、注释下载、结果验证串成自动化流程。6.4 保存可复现的分析记录# 保存sessionInfo writeLines(capture.output(sessionInfo()), sessionInfo.txt) # 保存motif富集结果 saveRDS(motifsUp, motifsUp.rds) saveRDS(motifsDo, motifsDo.rds) saveRDS(enrichMotifs, enrichMotifs.rds)6.5 接入文档与API Keys如果你在配置TaoToken通道时遇到问题查阅接入文档 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有settings.json的完整字段说明。API Keys管理页面在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 可以创建、轮换、删除Key。整个motif富集流程跑通后你手上应该有一组显著富集的转录因子、一张细胞类型特异的motif热图、以及多个注释集的交叉验证结果。这些结果可以直接写进论文的转录调控部分也可以作为后续实验验证的假设来源。
返回列表