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