首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用替换率生成合成DNA序列

用替换率生成合成DNA序列
EN

Stack Overflow用户
提问于 2009-03-02 09:19:34
回答 5查看 949关注 0票数 6

鉴于这些投入:

代码语言:javascript
复制
my $init_seq = "AAAAAAAAAA" #length 10 bp 
my $sub_rate = 0.003;
my $nof_tags = 1000;
my @dna = qw( A C G T );

我想要产生:

  1. 1000条长度-10张标签
  2. 标签中每个位置的替换率为0.003。

产出产出,如:

代码语言:javascript
复制
AAAAAAAAAA
AATAACAAAA
.....
AAGGAAAAGA # 1000th tags

在Perl中是否有一种简洁的方法来实现它呢?

我坚持这个脚本的逻辑作为核心:

代码语言:javascript
复制
#!/usr/bin/perl

my $init_seq = "AAAAAAAAAA" #length 10 bp 
my $sub_rate = 0.003;
my $nof_tags = 1000;
my @dna = qw( A C G T );

    $i = 0;
    while ($i < length($init_seq)) {
        $roll = int(rand 4) + 1;       # $roll is now an integer between 1 and 4

        if ($roll == 1) {$base = A;}
        elsif ($roll == 2) {$base = T;}
        elsif ($roll == 3) {$base = C;}
        elsif ($roll == 4) {$base = G;};

        print $base;
    }
    continue {
        $i++;
    }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-02 10:21:58

作为一种小的优化,替换:

代码语言:javascript
复制
    $roll = int(rand 4) + 1;       # $roll is now an integer between 1 and 4

    if ($roll == 1) {$base = A;}
    elsif ($roll == 2) {$base = T;}
    elsif ($roll == 3) {$base = C;}
    elsif ($roll == 4) {$base = G;};

使用

代码语言:javascript
复制
    $base = $dna[int(rand 4)];
票数 5
EN

Stack Overflow用户

发布于 2009-03-02 09:32:01

编辑:假设替换率在0.001到1.000之间:

$roll一样,在1.1000范围内生成另一个(伪随机数),如果它小于或等于(1000 * $sub_rate),则执行替换,否则什么也不做(即输出'A')。

请注意,除非您的随机数生成器的特性是已知的,否则您可能会引入微妙的偏差。

票数 3
EN

Stack Overflow用户

发布于 2009-03-02 20:14:57

不完全是您想要的,但我建议您看看BioPerl的生物::赛克进化::DNAPoint模块。然而,它并不以突变率为参数。相反,它会询问序列标识与您想要的原始序列的下限。

代码语言:javascript
复制
use strict;
use warnings;
use Bio::Seq;
use Bio::SeqEvolution::Factory;

my $seq = Bio::Seq->new(-seq => 'AAAAAAAAAA', -alphabet => 'dna');

my $evolve = Bio::SeqEvolution::Factory->new (
   -rate     => 2,      # transition/transversion rate
   -seq      => $seq
   -identity => 50      # At least 50% identity with the original
);


my @mutated;
for (1..1000) { push @mutated, $evolve->next_seq }

所有1000个变异序列将存储在@mutated数组中,它们的序列可以通过seq方法访问。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/601727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档