这种格式数据的香农熵(DNA基序)?

0 投票
2 回答
1014 浏览
提问于 2025-04-18 05:27

我有一些“DNA 模式”,它们用位置权重矩阵(PWMs),也叫位置特定评分矩阵(PSSMs)来表示,格式是 transfac:

transfac 格式

  • 模式名称在每行的“DE”后面显示
  • 每一行的数字代表在整个 DNA 模式序列中某个位置上四种可能的 DNA 碱基(“字母”):A、G、T 和 C 的观察频率(这些位置在第一列中显示)
  • 第 0 行是 DNA 模式序列中的第一个字母,而“XX”之前的行是 DNA 模式序列中的最后一个位置
  • 最右边的列显示该位置上最具代表性的字母,基于观察到的频率;如果没有特定的字母具有代表性,这里可以用模糊代码(不是 A、G、C、T)来表示
  • 最后,“XX”用来分隔多个 DNA 模式

例如:SRF: GCCCATATATGGGTTGTNNTC,和 HMG-1: GTTGNNTC

DE    SRF
0    0.0435    0.0217    0.8478    0.0870    G
1    0.1957    0.7174    0.0435    0.0435    C
2    0.0000    0.9782    0.0217    0.0000    C
3    0.0217    0.9782    0.0000    0.0000    C
4    0.6956    0.0217    0.0000    0.2826    A
5    0.0652    0.0217    0.0000    0.9130    T
6    1.0000    0.0000    0.0000    0.0000    A
7    0.0217    0.0000    0.0000    0.9782    T
8    0.9348    0.0000    0.0000    0.0652    A
9    0.3261    0.0217    0.0000    0.6522    T
10    0.0435    0.0000    0.9565    0.0000    G
11    0.0435    0.0217    0.9348    0.0000    G
XX
DE    HMG-1
0    0.0000    0.3846    0.6154    0.0000    G
1    0.0000    0.0000    0.2308    0.7692    T
2    0.0000    0.3077    0.0000    0.6923    T
3    0.0000    0.1539    0.7692    0.0769    G
4    0.0000    0.0769    0.0000    0.9230    T
5    0.4615    0.0769    0.2308    0.2308    N
6    0.2308    0.3846    0.0000    0.3846    N
7    0.0000    0.0769    0.1539    0.7692    T
8    0.0000    0.6154    0.0769    0.3077    C
XX

问题:我该如何在 Python 中计算每个 DNA 模式的香农熵?有没有适合这种数据的 Python 包(我对这些数据结构的非生物学术语不太了解)?或者有人能提供一个简单的 Python 函数吗?

2 个回答

0

这里有一点背景信息:https://www.youtube.com/watch?v=VPLGN0yIDTg

简单来说,生物模型和代码之间的差距太大了,所以现在还没法做太多有意义的事情。要想让基因代码发挥作用,我们需要有用的机器表现,才能帮助我们克服困难。

多变量的数值可以以某种方式进行压缩。我们想要的是一种递归的机器现实图像,里面有足够的分形真理来支撑我们在这个世界上的一切。

2

这里有个关于评论的注意事项(见下文),不过我写了一段小代码,可以处理你给的文本文件:

import numpy as np
import sys

def compute_entropy(motif):
    arr = np.array(motif)
    H = (arr[arr > 0] * np.log2(arr[arr > 0])).sum(axis=1)
    print 'entropy:', -H.mean(), 'bits'

motif = []
for line in sys.stdin:
    line = line.strip().lower()
    if line.startswith('de'):
        print line
    elif line == 'xx':
        if motif:
            compute_entropy(motif)
        motif = []
    else:
        motif.append(map(float, line.split()[1:-1]))

注意事项是,对于从不同分布中抽取的多变量值序列,如何定义熵并没有明确的标准——或者说,有几种不同的方法,每种方法背后都有不同的统计模型。

我猜生物信息学的专家们已经决定了一个合适的方法,但我用的方式是把序列中的每个字母看作是在该位置上独立抽取的多项式分布的结果,然后我计算这些抽取结果的熵的平均值。

你可能会认为应该把每个熵值加起来(或者用其他任何方式组合它们),所以这个决定就留给你自己去做了。

撰写回答