我最初打算使用MATLAB解决这个问题,但内置函数有一些限制,不符合我的目标。NumPy中也存在同样的限制。
我有两个制表符分隔的文件。第一个文件显示了一个蛋白质结构内部数据库的氨基酸残基、频率和计数。
A 0.25 1
S 0.25 1
T 0.25 1
P 0.25 1
第二个文件由氨基酸四元组及其出现次数组成,即:
ASTP 1
请注意,有超过8,000个这样的四重组。
基于每种氨基酸的背景出现频率和四重体的计数,我旨在计算每个四重体的多项式概率密度函数,并随后将其用作最大似然计算中的期望值。
多项式分布如下:
f(x|n, p) = n!/(x1!*x2!*...*xk!)*((p1^x1)*(p2^x2)*...*(pk^xk))
其中x是在n次试验中,每个k个结果的数量。在我的计算中,n在所有情况下均为4。
我创建了四个函数来计算此分布。
# functions for multinomial distribution
def expected_quadruplets(x, y):
expected = x*y
return expected
# calculates the probabilities of occurence raised to the number of occurrences
def prod_prob(p1, a, p2, b, p3, c, p4, d):
prob_prod = (pow(p1, a))*(pow(p2, b))*(pow(p3, c))*(pow(p4, d))
return prob_prod
# factorial() and multinomial_coefficient() work in tandem to calculate C, the multinomial coefficient
def factorial(n):
if n <= 1:
return 1
return n*factorial(n-1)
def multinomial_coefficient(a, b, c, d):
n = 24.0
multi_coeff = (n/(factorial(a) * factorial(b) * factorial(c) * factorial(d)))
return multi_coeff
问题在于如何最好地组织数据,以便以最高效的方式处理计算,以一种我可以阅读的方式(你们写的某些代码很神秘 :-)),并且不会创建溢出或运行时错误。
到目前为止,我的数据表示为嵌套列表。
amino_acids = [['A', '0.25', '1'], ['S', '0.25', '1'], ['T', '0.25', '1'], ['P', '0.25', '1']]
quadruplets = [['ASTP', '1']]
我最初打算在嵌套的for循环中调用这些函数,但这会导致运行时错误或溢出错误。我知道可以重置递归限制,但我更愿意以更优雅的方式解决这个问题。
我有以下代码:
for i in quadruplets:
quad = i[0].split(' ')
for j in amino_acids:
for k in quadruplets:
for v in k:
if j[0] == v:
multinomial_coefficient(int(j[2]), int(j[2]), int(j[2]), int(j[2]))
我还没有涉及如何整合其他功能。我认为我的当前嵌套列表排列是次优的。
我希望将字符串“ASTP”中的每个字母与氨基酸中每个子列表的第一个组件进行比较。如果存在匹配,我希望使用索引将适当的数字值传递给函数。
有更好的方法吗?我能否在循环内将每个氨基酸和四联体的适当数字附加到临时数据结构中,将其传递给函数,并清除下一次迭代的内容?
谢谢,S :-)