条件概率 - Python

3

我正在处理这个Python问题:

给定一个以字符串形式存储的DNA碱基序列{A,C,G,T},返回一个条件概率表格的数据结构,使得可以查找其中一个碱基(b1),然后再查找第二个碱基(b2),从而获取第二个碱基在第一个碱基之后立即出现的概率p(b2 | b1)。(假设seq的长度>= 3,并且任何从未见过在一起的b1和b2的概率为0。忽略b1后面是字符串结束的概率。)

您可以使用collections模块,但没有其他库。

然而,我遇到了障碍:

word = 'ATCGATTGAGCTCTAGCG'

def dna_prob2(seq):
    tbl = dict()
    levels = set(word)
    freq = dict.fromkeys(levels, 0)
    for i in seq:
        freq[i] += 1
    for i in levels:
        tbl[i] = {x:0 for x in levels}
    lastlevel = ''
    for i in tbl:
        if lastlevel != '':
             tbl[lastlevel][i] += 1
        lastlevel = i
    for i in tbl:
        print(i,tbl[i][i] / freq[i])
    return tbl

tbl['T']['T'] / freq[i] 

基本上,最终结果应该是您在上面看到的最后一行tbl。然而,当我尝试在print(i,tbl [i] [i] / freq [i]和运行dna_prob2(word)时这样做时,我得到了所有0.0s的结果。

想知道这里是否有人可以帮忙。

谢谢!


1
您需要提供一个最小可重现示例(MRE)。在您发布的代码片段中,tbl未定义,并且您从未调用dna_prob2 - wjandrea
请向我解释一下你想要做什么。 - Ann Zen
这是一个有趣的问题。你想展示公式吗? - han
正确的频率标准化是什么? - Jan Christoph Terasa
大家好:我已经发布了下面的代码。基本上是试图找到在给定第一个字母的情况下查找第二个字母的条件概率。数学不是我的强项,但我知道它很令人困惑。还是感谢大家的帮助! - runner16
2个回答

0

我不确定你的代码在做什么,但这个可以工作:

def makeprobs(word):
  singles = {}
  probs = {}
  thedict={}
  ll = len(word)
  for i in range(ll-1):
    x1 = word[i]
    x2 = word[i+1]
    singles[x1] = singles.get(x1, 0)+1.0
    thedict[(x1, x2)] = thedict.get((x1, x2), 0)+1.0
  for i in thedict:
    probs[i] = thedict[i]/singles[i[0]]
  return probs

0

我终于回复了我的教授。这就是它试图完成的目标:

word = 'ATCGATTGAGCTCTAGCG'

def dna_prob2(seq):
    tbl = dict()
    levels = set(seq)     
    freq = dict.fromkeys(levels, 0)
    for i in seq:
        freq[i] += 1
    for i in levels:
        tbl[i] = {x:0 for x in levels}
    lastlevel = ''
    for i in seq:            
        if lastlevel != '':
             tbl[lastlevel][i] += 1
        lastlevel = i
    return tbl, freq          

condfreq, freq = dna_prob2(word)  
print(condfreq['T']['T']/freq['T']) 
print(condfreq['G']['A']/freq['A']) 
print(condfreq['C']['G']/freq['G'])

希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接