【问题标题】:Improving some snipets改进一些片段
【发布时间】:2019-09-15 02:46:59
【问题描述】:

我有这个函数来模拟 DNA 序列上的突变(例如字母序列 -> 'ACGTGCTTAGG')。

第一个只是改变输入序列的随机位置

def mutate(sequence):
    seq_lst = list(sequence)
    i = random.randint(0, len(seq_lst) - 1)
    seq_lst[i] = random.choice(list('ATCG'))
    return ''.join(seq_lst)

第二个是模拟在序列中随机位置插入碱基。

def insertion(sequence):
    seq_lst = list(sequence)
    i = random.randint(0, len(seq_lst) - 1)
    mutate = seq_lst[:i] + [random.choice(list('ATCG'))] + seq_lst[i:]
    return ''.join(mutate)]

最后一个是选择序列中可能发生的各种可能的随机突变。

def mutations(sequence):
    i = random.randint(0, 3)
    print(i)
    if i == 0:
        print('SNV')
        return mutate(sequence)
    elif i == 1:
        print('Del')
        return sequence.replace(random.choice('ATCG'), '-')
    elif i == 2:
        print('Ins')
        return insertion(sequence)
    elif i == 3:
        print('No mut')
        return sequence

打印语句只是为了检查代码是否正常工作。

有什么改进的建议吗?如果可能的话,建议如何在代码中插入突变概率来模拟更真实的情况。

我在10000随机过程的回归中看到的是,序列积累了很多缺失,一旦单点突变比较频繁,其次是插入和缺失频率较低的插入和缺失。

谢谢

【问题讨论】:

  • 你传递给每个函数的参数sequence是什么类型的?
  • 我编辑了这篇文章。感谢您的提问。

标签: python bioinformatics


【解决方案1】:

因此在序列模拟中会出现过多的缺失,

import random
sequence = 'ACTCAG'
sequence.replace(random.choice('ATCG'), '-')

输出

A-T-AG

大约 1/4 的时间会针对给定事件同时发生两次删除。因此概率不均匀,导致删除的机会高于插入(或突变)。因此,插入或删除的可能性为 1/4,双重删除的可能性为额外的 1/4,而插入的变化为 0。

还有另外两个偏见, 您将生成回复突变 A->A,因此 1/4 突变似乎不会发生突变。这自然发生在 DNA 突变中,但值得牢记。

最后,一旦发生缺失,剩余核苷酸上的突变就会增加,本质上你会使系统倾向于越来越少的核苷酸,因此剩余的核苷酸会发生增加的突变。

换句话说,概率不是统一的,并且在模拟过程中是动态的。

您可以改为通过下面的函数使用 re.sub 来确保插入和删除之间的概率保持一致,

import random, re
def rand_replacement(string, to_be_replaced, items):
    return re.sub(to_be_replaced, lambda x: random.choice(items), string )

【讨论】:

  • 是的!我明白了,我非常感谢您的意见迈克尔
  • 达纳达。如果您正在建模插入缺失,则已经研究了经验分布,并且它们的概率可以在您的蒙特卡洛中使用。别忘了点赞 ;)
猜你喜欢
  • 1970-01-01
  • 2014-04-18
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
相关资源
最近更新 更多