HOMER 的结果里,位点表有七十行,富集表却显示六十个目标序列含有模式,这并不矛盾。前者在数出现位置,后者在数至少出现一次的序列。本次使用完全可控的人工序列实际运行扫描和富集,正好得到这组数字。把它们分开以后,阈值、链方向和背景的影响就容易解释,也能避免把不同输出中的数字强行对齐。
本文运行 HOMER 5.1 的核心程序,完成已知模式扫描、两种背景下的富集和一次从头发现。输入为自编 FASTA 与自编八碱基位置矩阵,没有使用真实峰集、参考基因组或已知转录因子数据库,不评价真实数据的发现准确率。HOMER 所对应研究的背景可查阅原始论文,下面的实验结果则全部来自本文脚本。

一、先做一份能够逐条核对的输入
我们生成一百条目标序列,每条一百六十碱基。其中六十条插入完全匹配的八碱基模式,二十条插入只有一个位置不同的版本,二十条没有插入。完全匹配的六十条中,二十条在主要插入位置使用反向互补形式,另有十条额外插入一个正向匹配。因此,严格模式应当有七十处位置,分布于六十条序列。
为了让这个练习的计数能够闭合,生成随机底序列时,特意排除了偶然出现的完全匹配和单位置差异匹配。插入以后再次检查,确保只有预定位置满足条件。这个人工约束适合检验软件怎样计数,但真实序列不会如此干净,所以不能把本例的匹配情况当作实际背景中的自然发生率。
两份背景也各有一百条、每条一百六十碱基。低频背景包含二十条完全匹配和二十条单位置差异匹配,高频背景包含八十条完全匹配。所有序列使用唯一标识,目标与背景的标识也不重名。这样的设计保持了长度和数量一致,把主要变化集中在模式出现频率上。真实背景需要考虑的条件更多,不能只照搬这里的比例。
HOMER 的FASTA 输入说明强调目标与背景的差异分析关系。本文选择直接调用核心程序,是为了清楚控制每个步骤。它与上层封装脚本的自动归一化流程不能混为一谈,即使二者都属于同一套软件,也要分别核对实际参数。
二、矩阵阈值改变了什么
本例的人工模式为八碱基字符串,每一行矩阵在目标碱基上的概率为零点九七,其余三种均为零点零一。我们保存两份数值完全相同、只有匹配阈值不同的模式文件。一份阈值为八点五,另一份为六。它们不是两个不同生物学模式,而是同一个模式的两种接受条件。
实际输出中,完全匹配位点得分约为十点八四六七,单位置不同的版本约为六点二七二。因此,在严格门槛下只有完全匹配进入结果,放宽以后,二十条单位置不同的目标序列也进入结果。这里的分数是矩阵匹配得分,不是富集显著性,也不是结合概率。把阈值从八点五改为六,并不等于把错误发现率改成了另一个值。
homer2 find -i target.fa -m strict.motif \
-offset 0 -p 2 -o sites_strict.tsv
homer2 find -i target.fa -m loose.motif \
-offset 0 -p 2 -o sites_loose.tsv
严格扫描返回七十条位点,涉及六十条序列。宽松扫描返回九十条位点,涉及八十条序列。数据没有增加,改变的是被接受的匹配集合。如果看到宽松结果里出现更多模式相关区域,就宣称分析质量提高,实际上还没有回答新增匹配的可靠性问题。
对于真实矩阵,某个位置的替换代价不一定等于其他位置,同样一个碱基差异也可能带来不同分数变化。本例把每一行设置得相同,只是为了算得清楚。不能据此把任意位置矩阵转换成“允许一个错配”的统一字符串规则。矩阵本身、阈值和背景假设都应一起保存。
三、只扫正链,减少的不是同一种数量
我们随后保持严格阈值,只搜索正向匹配。结果从七十条位点变为五十条,阳性序列从六十条变为五十条。两者分别减少二十和十,正是因为一部分带反向匹配的序列,同时还含有额外的正向匹配。删去一条位点不一定删去一个阳性序列。
| 扫描设置 | 位点行数 | 阳性序列数 | 变化来源 |
|---|---|---|---|
| 严格阈值,双链 | 70 | 60 | 基础对照 |
| 宽松阈值,双链 | 90 | 80 | 单位置差异被接受 |
| 严格阈值,正链 | 50 | 50 | 反向匹配被排除 |
这张表可以帮助读者检查自己的汇总。若研究问题是目标区域有多少含模式,统计时需要按序列标识去重。若研究的是一个区域内是否存在多个位置,保留位点层级才有意义。不要为了让两张表的数字一致,就在其中一张里随意删行。
链方向的选择也应该由问题决定。基因组 DNA 区域的模式扫描与有明确方向意义的序列问题,不能因为都能读 FASTA 就使用同样的链设置。对正链和反链结果做合并时,还要保留坐标与匹配方向,否则后续研究相对方向和间距时会发现重要信息已经丢失。
四、同一个位点,为什么可以写成四十和负四十
扫描的输出位置不是天然的基因组 BED 起点。本例序列长度为一百六十,使用默认位置报告时,以序列中点作为参照。主要正向插入位置在零起点的四十,输出就显示负四十。指定偏移为零以后,同一个位点显示为四十。两次扫描的命中并没有移动,只是坐标参照改变了。
反向匹配还有一层需要注意。目标零号序列中,反向互补字符串占据局部四十到四十八的半开区间,但指定零偏移时输出的锚点为四十七。默认中点参照下则为负三十三。这个锚点是反向匹配相应一端的位置,不能直接当作左侧区间起点。
| 同一条序列中的匹配 | 默认位置 | 零偏移位置 | 实际局部区间 |
|---|---|---|---|
| 正向额外匹配 | 20 | 100 | [100,108) |
| 反向主要匹配 | -33 | 47 | [40,48) |
对于本例零偏移的反向结果,先用锚点减去模式长度再加一,得到左端四十,右端为四十八。若使用默认中点参照,还需要先恢复成局部锚点。之后如果这条序列来自基因组提取窗口,才进入局部到基因组的转换。每一步都应该保留自己的坐标定义,而不是连续加减几个数字后只检查文件有没有生成。
最有效的核验方法是选一条自己知道插入位置的序列,取回报告对应区间,检查长度、方向和字符串是否一致。本次正向和反向插入的位置都已记录,因此可以逐条核对。直接把位点表第二列改名为起点,再交给区间工具,是非常容易悄悄出错的做法。
五、背景不变时,换统计方法也会改变显著性
已知模式富集的基础命令如下。我们显式关闭低阶序列归一化,以便表中的数量对应人工设计的序列计数。这个设置用于本次对照,不是对真实数据的普遍推荐。
homer2 known -i target.fa -b bg_low.fa \
-m strict.motif -nlen 0 -p 2 \
-o known_low.tsv
严格模式在目标中为六十比一百,低频背景为二十比一百,比例之比为三,输出的二进制对数富集约为一点五八五。这里的“三倍”是阳性序列比例的比值,不是优势比。用同一个二乘二表计算优势比会得到六,两个量回答的数学问题不同,不能在表头里互相替换。
本次默认二项方法的显著性列显示为十的负十七次方量级,改用超几何方法后显示为十的负八次方量级,目标和背景计数都没有变。输出还保留对数显著性列,显示格式的有效位数有限,因此不应把简写的科学计数法当作完整精度值来复算每一步。
两种方法的差别来自统计模型,而不是软件对同一件事给了两个随意的答案。选择方法应先明确抽样和比较设定,再解释结果。若看到两种方法中某一种数值更小,就在每个模式上分别挑最显著的一种,会引入额外选择过程。这个过程没有因为最终表格只保留一列就消失。
六、命中更多,富集倍数却可能更低
把严格模式换为宽松模式以后,目标阳性序列增加到八十,低频背景也增加到四十,比例之比反而从三下降为二。目标中的新增匹配并非自动带来更强的区分能力,因为背景同样获得了新增匹配。只看目标命中数,很容易忽略这一半比较。
再保持严格模式、换用高频背景,目标仍然六十,背景变成八十。输出的二进制对数比例约为负零点四一五,富集方向的显著性列显示为一。这个结果说明当前比较不支持目标中的富集,不等于完成了反方向检验,更不能据此宣称不存在任何差异。
| 对照 | 目标阳性数 | 背景阳性数 | 比例之比 |
|---|---|---|---|
| 严格模式,低频背景 | 60 | 20 | 3 |
| 宽松模式,低频背景 | 80 | 40 | 2 |
| 严格模式,高频背景 | 60 | 80 | 0.75 |
在真实峰集里,背景选择不仅改变模式频率,还可能改变序列长度、碱基组成和可检测范围。自动归一化可以处理部分差异,但不能替代研究设计。应当先写明“目标相对于哪一类可比较区域”,再决定如何抽取背景,而不是先跑出结果,再为最小的显著性值寻找解释。
七、从头发现返回三个模式,不等于发现三个真实因子
本次还执行了八碱基长度的从头搜索,要求最多优化三个模式,再将生成的矩阵重新用于目标序列扫描。程序返回三个模型,本次扫描分别得到四十三、十八、二十四条位点,对应三十七、十六、二十二条阳性序列。这些都是实际输出,但没有任何一个被本文命名为真实转录因子。
homer2 denovo -i target.fa -b bg_low.fa \
-len 8 -mis 1 -S 3 -p 2 -cache 64 \
-o denovo.motifs
这里的重点是识别搜索过程的选择效应。程序在同一批序列上寻找、优化并报告突出的模式,得到一个很小的内部显著性数值,不等于已经通过独立数据验证。人工样本只有一百条,还特意排除了部分随机匹配,背景结构与真实研究不同。不能因为输入里埋了一个已知字符串,就把所有输出模式都解释成对它的准确恢复。
模式共识名称也只是矩阵的简写,不能仅凭共识字符串相同或不同判断模型是否等价。要比较发现模式与预期模式,应检查完整矩阵、匹配位置及背景中的表现,再考虑独立序列中的重复性。本次没有执行已知因子数据库注释,也没有评价发现准确率,记录三个模型的意义在于展示下一步应该审阅什么。
这一点也说明已知模式扫描和从头发现适合不同任务。前者便于围绕明确假设设置可核查的阈值,后者可以提出新的候选模式,但需要承担更复杂的搜索与验证工作。两者都能生成模式表,并不意味着表中显著性和名称可以不加区分地合并排序。
八、安装成功要验证到真正的计算程序
首次启动本次容器时,上层脚本可以正常显示帮助,但核心程序报告找不到 C++ 动态库。检查后确认库存在于容器的本地库目录,为容器进程设置相应搜索路径后,扫描、富集和发现均完成。这个问题不需要修改数据,也不能通过只检查帮助页面来发现。
复现脚本已经固定镜像摘要,并在每次容器调用中设置库路径,容器限制两核、四 GiB 内存。读者不需要据此修改整台机器的全局库配置。完整记录保留了输入、命令、退出码和结果,方便区分环境问题与分析问题。真实部署时,也应至少运行一个能核对输出的小案例,而不只是确认可执行文件在路径中。
HOMER 的优点是扫描、已知模式富集和从头发现都能在同一工具体系内组织,核心输入输出便于逐层检查。局限在于结果高度依赖背景与阈值,封装脚本的默认处理不能假设等同于核心命令,位点坐标也需要按输出约定解释。把这些关系说明白,比单纯展示一页显著模式列表更有助于可靠使用。
下载本组复现脚本和结果记录,在本篇目录执行下面命令,可重新生成全部序列和矩阵。该练习没有下载参考基因组,也没有使用捆绑的真实因子库。每次建议使用新的输出目录,并先核对七十条位点、六十条阳性序列和反向坐标三个基础结果,再修改参数继续练习。
python3 run.py output
当分析扩展到多组峰集、多种背景和反复参数比较时,可通过云生信生物分析服务器服务集中保存环境与结果,便于后续核查和复用。
