用ruby突变DNA序列

用ruby突变DNA序列,ruby,Ruby,我有一个简单的类来模拟DNA字符串中的随机突变。它将随机(CGT)字符引入随机位置。我想介绍一种指定突变率的方法 我是否可以指定如何: 在给定错误率的情况下对序列进行变异。(例如千分之一) 偏向突变的方法(更频繁地选择GA或CT) 这里是我当前的实现,它只处理随机更改 class DNA attr_accessor :number_of_mutations attr_accessor :seq NUCLEOTIDES = ['A','C','T','G'] #random

我有一个简单的类来模拟DNA字符串中的随机突变。它将随机(CGT)字符引入随机位置。我想介绍一种指定突变率的方法

我是否可以指定如何:

  • 在给定错误率的情况下对序列进行变异。(例如千分之一)
  • 偏向突变的方法(更频繁地选择GA或CT)
这里是我当前的实现,它只处理随机更改

class DNA
  attr_accessor :number_of_mutations
  attr_accessor :seq

  NUCLEOTIDES = ['A','C','T','G']

  #random positions
  def random_pos
    (1..seq.length).to_a.sample(number_of_mutations)
  end

  #pick a random nucleotide
  def random_nucleotide
    NUCLEOTIDES.sample
  end

  #generate a random seq
  def random_seq
    (1..number_of_mutations).map{NUCLEOTIDES[rand(NUCLEOTIDES.length)]}
  end

  def mutate
    #pick a random position
    positions = random_pos

    #pick a random nucleotide
    nucleotides = random_seq

    #insert the random nucleotide at the random position in the seq
    positions.zip(nucleotides).map do |pos,nuc|
      seq[pos] = nuc.downcase
    end
    seq
  end
end

d = DNA.new
d.number_of_mutations = 1
d.seq = "AAAAAA"
puts d.mutate  #will introduce a single random DNA base at a random location 

首先,您应该实现一个函数,该函数将以指定的速率返回正结果。可能是这样的:

# ==Function will return true with rate probability
def positive?(rate = 0.001) 
  rand((1/rate).round) == 0
end
或者更复杂

然后你就可以实现一个指定速率的突变机制。它可以是类变体的实例

class Mutator
  attr_reader :mutate_way, :probability

  def initialize(options = {})
    @mutate_way = options[:mutate_way]
    @probability = options[:probability]
  end

  def try_mutate        
    do_mutation if positive? @probability
  end  

  def do_mutation
    # your implementation based on @mutate_way
    # link it with DNA
  end
end
你可以定义很多突变,比如

mutations = [
  Mutator.new(:mutate_way => ['A', 'G'], :probability => 100),
  Mutator.new(:mutate_way => ['C', 'T'], :probability => 100),
  Mutator.new(:mutate_way => ['A', 'T'], :probability => 1000),
  Mutator.new(:mutate_way => ['C', 'G'], :probability => 1000)
]
并开始突变

d.number_of_mutations.times do
  mutations.each.map(&:try_mutate)
end

PS.代码示例可能有一些错误,只是示例。

你的问题是什么?@sawa编辑以突出问题。我没有投反对票,但我相信原因是读者不理解你的问题。我也在其中。您需要澄清“在给定错误率的情况下对序列进行变异”(例如,千分之一)和“偏差变异的方法(更频繁地选择GA或CT)”。非常感谢@sema!但概率通常在0到1之间。也许会想改变概率散列来反映事实。速率应采用类似1x10-3或4x10-7的值。你介意再解释一下积极的方法吗?再次感谢!我编辑了我的答案,现在功能为正?采用自然概率率,比如0.001:)无论如何,我认为需要一个更复杂的函数来计算概率。