随机选择一个区域并对其进行多次处理

2024-01-25

我有一个这样的数据

>sp|Q96A73|P33MX_HUMAN Putative monooxygenase p33MONOX OS=Homo sapiens OX=9606 GN=KIAA1191 PE=1 SV=1
RNDDDDTSVCLGTRQCSWFAGCTNRTWNSSAVPLIGLPNTQDYKWVDRNSGLTWSGNDTCLYSCQNQTKGLLYQLFRNLFCSYGLTEAHGKWRCADASITNDKGHDGHRTPTWWLTGSNLTLSVNNSGLFFLCGNGVYKGFPPKWSGRCGLGYLVPSLTRYLTLNASQITNLRSFIHKVTPHR
>sp|P13674|P4HA1_HUMAN Prolyl 4-hydroxylase subunit alpha-1 OS=Homo sapiens OX=9606 GN=P4HA1 PE=1 SV=2
VECCPNCRGTGMQIRIHQIGPGMVQQIQSVCMECQGHGERISPKDRCKSCNGRKIVREKKILEVHIDKGMKDGQKITFHGEGDQEPGLEPGDIIIVLDQKDHAVFTRRGEDLFMCMDIQLVEALCGFQKPISTLDNRTIVITSHPGQIVKHGDIKCVLNEGMPIYRRPYEKGRLIIEFKVNFPENGFLSPDKLSLLEKLLPERKEVEE
>sp|Q7Z4N8|P4HA3_HUMAN Prolyl 4-hydroxylase subunit alpha-3 OS=Homo sapiens OX=9606 GN=P4HA3 PE=1 SV=1
MTEQMTLRGTLKGHNGWVTQIATTPQFPDMILSASRDKTIIMWKLTRDETNYGIPQRALRGHSHFVSDVVISSDGQFALSGSWDGTLRLWDLTTGTTTRRFVGHTKDVLSVAFSSDNRQIVSGSRDKTIKLWNTLGVCKYTVQDESHSEWVSCVRFSPNSSNPIIVSCGWDKLVKVWNLANCKLK
>sp|P04637|P53_HUMAN Cellular tumor antigen p53 OS=Homo sapiens OX=9606 GN=TP53 PE=1 SV=4
IQVVSRCRLRHTEVLPAEEENDSLGADGTHGAGAMESAAGVLIKLFCVHTKALQDVQIRFQPQL
>sp|P10144|GRAB_HUMAN Granzyme B OS=Homo sapiens OX=9606 GN=GZMB PE=1 SV=2
MQPILLLLAFLLLPRADAGEIIGGHEAKPHSRPYMAYLMIWDQKSLKRCGGFLIRDDFVLTAAHCWGSSINVTLGAHNIKEQEPTQQFIPVKRPIPHPAYNPKNFSNDIMLLQLERKAKRTRAVQPLRLPSNKAQVKPGQTCSVAGWGQTAPLGKHSHTLQEVKMTVQEDRKCES
>sp|Q9UHX1|PUF60_HUMAN Poly(U)-binding-splicing factor PUF60 OS=Homo sapiens OX=9606 GN=PUF60 PE=1 SV=1
MGKDYYQTLGLARGASDEEIKRAYRRQALRYHPDKNKEPGAEEKFKEIAEAYDVLSDPRKREIFDRYGEEGLKGSGPSGGSGGGANGTSFSYTFHGDPHAMFAEFFGGRNPFDTFFGQRNGEEGMDIDDPFSGFPMGMGGFTNVNFGRSRSAQEPARKKQDPPVTHDLRVSLEEIYSGCTKKMKISHK
>sp|Q06416|P5F1B_HUMAN Putative POU domain, class 5, transcription factor 1B OS=Homo sapiens OX=9606 GN=POU5F1B PE=5 SV=2
IVVKGHSTCLSEGALSPDGTVLATASHDGYVKFWQIYIEGQDEPRCLHEWKPHDGRPLSCLLFCDNHKKQDPDVPFWRFLITGADQNRELKMWCTVSWTCLQTIRFSPDIFSSVSVPPSLKVCLDLSAEYLILSDVQRKVLYVMELLQNQEEGHACFSSISEFLLTHPVLSFGIQVVSRCRLRHTEVLPAEEENDSLGADGTHGAGAMESAAGVLIKLFCVHTKALQDVQIRFQPQLNPDVVAPLPTHTAHEDFTFGESRPELGSEGLGSAAHGSQPDLRRIVELPAPADFLSLSSETKPKLMTPDAFMTPSASLQQITASPSSSSSGSSSSSSSSSSSLTAVSAMSSTSAVDPSLTRPPEELTLSPKLQLDGSLTMSSSGSLQASPRGLLPGLLPAPADKLTPKGPGQVPTATSALSLELQEVEP
>sp|O14683|P5I11_HUMAN Tumor protein p53-inducible protein 11 OS=Homo sapiens OX=9606 GN=TP53I11 PE=1 SV=2
MIHNYMEHLERTKLHQLSGSDQLESTAHSRIRKERPISLGIFPLPAGDGLLTPDAQKGGETPGSEQWKFQELSQPRSHTSLKVSNSPEPQKAVEQEDELSDVSQGGSKATTPASTANSDVATIPTDTPLKEENEGFVKVTDAPNKSEISKHIEVQVAQETRNVSTGSAENEEKSEVQAIIESTPELDMDKDLSGYKGSSTPTKGIENKAFDRNTESLFEELSSAGSGLIGDVDEGADLLGMGREVENLILENTQLLETKNALNIVKNDLIAKVDELTCEKDVLQGELEAVKQAKLKLEEKNRELEEELRKARAEAEDARQKAKDDDDSDIPTAQRKRFTRVEMARVLMERNQYKERLMELQEAVRWTEMIRASRENPAMQEKKRSSIWQFFSRLFSSSSNTTKKPEPPVNLKYNAPTSHVTPSVK

我想随机选取一个包含 10 个字母的区域,然后计算 F 的数量,我想这样做一定次数,例如 1000 次甚至更多

举个例子,我随机选择

LVPSLTRYLT    0

then

ITNLRSFIHK    1

然后再次随机去连续选取10个字母

AHSRIRKERP    0

这一直持续到满足要求的运行次数为止。我想存储所有随机选择的值及其值,因为这样我想计算 F 出现了多少次

所以我做了以下事情

# first I remove the header 
grep -v ">" data.txt > out.txt

然后随机获取一个包含我尝试使用的 10 个字母的区域shuf没有成功,

shuf -n1000 data.txt 

然后我尝试使用 awk 也没有成功

awk 'BEGIN {srand()} !/^$/ { if (rand() == 10) print $0}'

然后计算F的个数并保存到文件中

grep -i -e [F] |wc -l 

注意,我们不应该两次选取同一区域


我必须在这里假设一些事情,并留下一些限制

  • 随机选择的区域不以任何方式依赖于特定的线路

  • 顺序并不重要;文件中需要分布 N 个区域

  • 文件大小可能是千兆字节,因此无法完整读取(会容易得多!)

  • 有未处理的(边缘或不太可能)情况,在代码后讨论

首先构建一个随机数排序列表;这些是文件中区域开始的位置。然后,在读取每一行时,计算文件中的字符范围,并检查我们的数字是否在其中。如果有的话,它们会标记每个随机区域的开始:从这些字符开始选择所需长度的子字符串。检查子字符串是否适合该行。

use warnings;
use strict;
use feature 'say';

use Getopt::Long;
use List::MoreUtils qw(uniq);

my ($region_len, $num_regions) = (10, 10);
my $count_freq_for = 'F';
#srand(10);

GetOptions(
    'num-regions|n=i' => \$num_regions, 
    'region-len|l=i'  => \$region_len, 
    'char|c=s'        => \$count_freq_for,
) or usage();

my $file = shift || usage();

# List of (up to) $num_regions random numbers, spanning the file size
# However, we skip all '>sp' lines so take more numbers (estimate)
open my $fh, '<', $file  or die "Can't open $file: $!";
$num_regions += int $num_regions * fraction_skipped($fh);
my @rand = uniq sort { $a <=> $b } 
    map { int(rand (-s $file)-$region_len) } 1..$num_regions;
say "Starting positions for regions: @rand";

my ($nchars_prev, $nchars, $chars_left) = (0, 0, 0); 

my $region;

while (my $line = <$fh>) { 
    chomp $line;
    # Total number of characters so far, up to this line and with this line
    $nchars_prev = $nchars;
    $nchars += length $line;
    next if $line =~ /^\s*>sp/;

    # Complete the region if there wasn't enough chars on the previous line 
    if ($chars_left > 0) {
        $region .= substr $line, 0, $chars_left;
        my $cnt = () = $region =~ /$count_freq_for/g;
        say "$region $cnt";
        $chars_left = -1; 
    };  

    # Random positions that happen to be on this line    
    my @pos = grep { $_ > $nchars_prev and $_ < $nchars } @rand;
    # say "\tPositions on ($nchars_prev -- $nchars) line: @pos" if @pos;

    for (@pos) { 
        my $pos_in_line = $_ - $nchars_prev;
        $region = substr $line, $pos_in_line, $region_len; 

        # Don't print if there aren't enough chars left on this line
        last if ( $chars_left = 
            ($region_len - (length($line) - $pos_in_line)) ) > 0;

        my $cnt = () = $region =~ /$count_freq_for/g;
        say "$region $cnt";
    }   
}


sub fraction_skipped {
    my ($fh) = @_;
    my ($skip_len, $data_len);
    my $curr_pos = tell $fh;
    seek $fh, 0, 0  if $curr_pos != 0;
    while (<$fh>) {
        chomp;
        if (/^\s*>sp/) { $skip_len += length }
        else           { $data_len += length }
    }
    seek $fh, $curr_pos, 0;  # leave it as we found it
    return $skip_len / ($skip_len+$data_len);
}

sub usage {
    say STDERR "Usage: $0 [options] file", "\n\toptions: ...";
    exit;
}

取消注释srand行以便始终具有相同的运行,以进行测试。 注释如下。

一些极端情况

  • 如果 10 长的窗口不适合从其随机位置开始的行,它将在下一行中完成 - 但任何(可能的)further该线上的随机位置被省略。因此,如果我们的随机列表有 1120 和 1122,而一行以 1125 结束,则跳过从 1122 开始的窗口。不太可能,有可能,并且没有任何影响(除了少一个区域之外)。

  • 当下一行(第一行)填充不完整区域时if in the while循环),它是possible该行比剩余的所需字符短($chars_left)。这种情况不太可能发生,需要进行额外的检查,但被遗漏了。

  • 随机数被删除了。这扭曲了顺序,但这里不重要的是什么;我们可能会留下比要求的人数少的人,但也只是少一点

处理随机性问题

这里的“随机性”是非常基本的,看起来合适的。我们还需要考虑以下因素。

在文件大小的区间内绘制随机数,int(rand -s $file)(减去区域大小)。但线>sp被跳过,并且任何可能落在这些行内的数字都不会被使用,因此我们最终得到的区域可能比抽出的数字少。这些行较短,因此上面有数字的机会较小,因此不会丢失太多数字,但在某些运行中,我什至看到 10 个数字中有 3 个被跳过,最终得到了所需大小的 70% 的随机样本。

如果这很麻烦,有一些方法可以解决它。为了不进一步扭曲分布,它们都应该涉及对文件的预处理。

上面的代码对文件进行初始运行,以计算将跳过的字符比例。然后将其用于增加抽取的随机点的数量。这当然是一个“平均”测量,但仍应生成接近足够大文件所需的区域数量。

更详细的措施需要查看(更大)分布的哪些随机点将因跳行而丢失,然后重新采样以解决这一问题。这可能仍然会扰乱分发,这可以说不是问题,但更重要的是可能根本不需要。

在这一切中,您读取了大文件两次。额外的处理时间应该仅以秒为单位,但如果这是不可接受的,请更改函数fraction_skipped仅读取文件的 10-20%。对于大文件,这仍然应该提供合理的估计。

关于特定测试用例的注释

With srand(10)(靠近开头的注释行)我们得到随机数,使得在一行上该区域在该行末尾之前的 8 个字符处开始!因此,该案例确实测试了代码以完成下一行的区域。


这是一个简单的驱动程序,用于运行上述指定次数,以进行统计。

Doing it using builtin tools (system, qx) is altogether harder and libraries (modules) help. I use IPC::Run https://metacpan.org/pod/IPC::Run here. There are quite a few other options.

根据统计需要调整并添加处理代码;输出在文件中。

use warnings;
use strict;
use feature 'say';

use Getopt::Long;
use IPC::Run qw(run);

my $outdir = 'rr_output';         # pick a directory name
mkdir $outdir if not -d $outdir;    
my $prog  = 'random_regions.pl';  # your name for the program
my $input = 'data_file.txt';      # your name for input file     
my $ch = 'F';

my ($runs, $regions, $len) = (10, 10, 10);    
GetOptions(
    'runs|n=i'  => \$runs, 
    'regions=i' => \$regions, 
    'length=i'  => \$len, 
    'char=s'    => \$ch, 
    'input=s'   => \$input
) or usage();

my @cmd = ( $prog, $input, 
    '--num-regions', $regions, 
    '--region-len', $len, 
    '--char', $ch
);    
say "Run: @cmd, $runs times.";

for my $n (1..$runs) {
    my $outfile = "$outdir/regions_r$n.txt";
    say "Run #$n, output in: $outdir/$outfile";
    run \@cmd, '>', $outfile  or die "Error with @cmd: $!";
}    

sub usage {
    say STDERR "Usage: $0 [options]", "\n\toptions: ...";
    exit;
}

请扩展错误检查。参见例如这个帖子 https://stackoverflow.com/a/40777096/4653379以及详细信息的链接。

最简单的使用:driver_random.pl -n 4,但您可以给出所有主程序的参数。

被调用的程序(random_regions.pl上面)必须是可执行的。


  Some, from simple to more capable: IPC::System::Simple https://metacpan.org/pod/IPC::System::Simple, Capture::Tiny https://metacpan.org/pod/Capture::Tiny, IPC::Run3 https://metacpan.org/pod/IPC::Run3. (Then comes IPC::Run used here.) Also see String::ShellQuote https://metacpan.org/pod/String::ShellQuote, to prepare commands without quoting issues, shell injection bugs, and other problems. See links (examples) assembled in this post https://stackoverflow.com/a/44185799/4653379, for example.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机选择一个区域并对其进行多次处理 的相关文章

随机推荐

  • 在 ggplot 和 stat_function() 中叠加对数正态密度

    我尝试通过叠加一个函数stat function in ggplot但无法弄清楚我的错误 这个例子产生了一个漂亮的图 data lt data frame x rt 10000 df 7 ggplot data data aes x x g
  • 当窗口移动到屏幕左上角时如何禁用窗口最大化?

    我有一个设置了ResizeMode CanResizeWithGrip 和AllowTransparency true 的窗口 它工作正常 直到它移动到屏幕顶部 然后自动最大化 如何阻止它最大化 以便我可以将屏幕显示为位于屏幕顶部的窗口 T
  • 如何在测试中手动模拟 Svg?

    我在我的应用程序中使用存根文件来模拟图像 这对我来说 99 的时间都有效 但是 我有一个组件可以根据输入渲染不同的图像 因此我希望能够在单元测试中检查输入是否创建了正确的输出 基本上我想做的是 如果用户输入 狮子 我的组件将显示狮子的图片
  • 使用外部 jar“不是托管类型”的 Spring 启动

    我有一个正在拉入公共罐子的弹簧应用程序 该 jar 包含带注释的 DTO 类 运行 mvn clean build 命令成功运行并构建 jar 一旦我运行 java jar target MyApp 1 0 0 BUILD SNAPSHOT
  • 将 mime 多部分主体部分写入输出流时出错

    我有执行异步文件上传的代码 该代码在我的开发虚拟机上运行良好 但在将其部署到客户端系统后 我不断收到此错误 将 mime 多部分主体部分写入输出流时出错 我知道这是抛出错误的行 但我似乎无法弄清楚为什么 Read the form data
  • 可用的viewcell按钮

    我有 tableview 我在其中对 tableviewcell 进行了子类化 单元格中有一个水平滚动视图 我向滚动视图添加动态按钮 我的要求 1 当我第一次点击 row0 上的按钮时 我需要为点击的按钮设置不同的 BG 颜色 并在数组中添
  • 运行“app”时出错:Android studio 3.1 中出现未知错误

    我已经将我的 android studio 更新到了新的稳定版3 1版 构建项目后无法运行 如果有人遇到同样的问题或找到任何解决方案 请告诉我 只需前往 运行 编辑配置 并向下滚动到窗口底部 在这里您会看到一个选项 发射前 首先 删除小窗口
  • 如何使用 GNU Parallel 编写多核排序

    GNU 并行 http www gnu org software parallel GNU并行是一个shell工具 用于使用一台或多台计算机并行执行作业 例如 如果我想编写一个多核版本wc我可以做 cat XXX parallel bloc
  • 如何使用 awk 每 n 行插入一个空行?

    我有一个像这样的输入文件 line 1 line 2 line 3 line 4 line 5 line 6 我想使用 awk 每隔几行插入一个空行 例如 每两个 line 1 line 2 line 3 line 4 line 5 lin
  • Mac 上的 Mercurial“未提供用户名”错误

    我刚刚在 OSX Mountain Lion Max 10 8 上安装了 Mercurial 在第一次提交时出现错误 abort no username supplied see hg help config 我看到了很多答案 这些答案表明
  • make找不到tools.jar

    运行Ubuntu 12 04 我已经添加到路径 home jeffrey jdk1 6 0 43 lib 我正在尝试使用 Make 从源代码构建 make j16 但遇到错误 build core config mk 268 Error c
  • 来自 pandas Dataframe 的具有不确定性的 LaTeX 表

    我目前正在编写一份报告 其中包含用 python 计算并存储在 pandas DataFrame 中的许多值和不确定性 这些值必须放入报告中 包括错误 目前我唯一的方法是手动将值与错误合并 其中一个示例如下所示 begin tabular
  • 如何MVC 5下拉(多选)框

    我在使用这个下拉框时遇到了问题 似乎无法正确处理 代码如下 查看 Index cshtml using EvaSimulator Models Model EvaSimulator Models ModelVariables ViewBag
  • 当有更多可用机器时,Spark 仅使用一台工作机器

    我正在尝试通过 Spark 并行化机器学习预测任务 我之前已经在其他任务中成功使用过 Spark 多次 并且之前没有遇到过并行化问题 在这个特定任务中 我的集群有 4 个工作线程 我在具有 4 个分区的 RDD 上调用 mapPartiti
  • 使用 silverlight 的 Wcf 服务的最佳实践?

    您将如何构建在 silverlight 应用程序中调用 wcf 服务的代码 仅使用一次实例化的 wcf 服务代理 又名单例 并在整个 SL 应用程序中使用它 如果是这样 您如何解决 ws call completed 事件取消订阅控件的问题
  • 计算卷积的最快方法

    有人知道计算卷积最快的方法吗 不幸的是 我处理的矩阵非常大 500x500x200 如果我使用convn在 MATLAB 中 这需要很长时间 我必须在嵌套循环中迭代此计算 所以 我使用了 FFT 卷积 现在速度更快了 但是 我仍在寻找更快的
  • 如何在jmeter中设置IP欺骗?

    我现在正在我的机器上通过 jmeter 对网站进行负载测试 但我想要一个真实的场景 那么 jmeter 是否可以使用 ip 别名或 ip 欺骗 这看起来像是从不同的 ip 地址发送请求 是的 可以 查看属性源IP地址 http jmeter
  • SQL 空值内连接

    我有一个加入 SELECT FROM Y INNER JOIN X ON ISNULL X QID 0 ISNULL y QID 0 Isnull像这样的 Join 会使速度变慢 这就像有一个条件连接 对于这样的事情有什么解决办法吗 我有很
  • 没有全局变量的Python动画

    我正在编写康威生命游戏的实现 我的第一次尝试只是在每次更新后使用 matplotlib 的 imshow 在 1 和 0 的 NxN 板上绘制板图 然而 这不起作用 因为程序在显示情节时就会暂停 您必须关闭绘图才能获得下一个循环迭代 我发现
  • 随机选择一个区域并对其进行多次处理

    我有一个这样的数据 gt sp Q96A73 P33MX HUMAN Putative monooxygenase p33MONOX OS Homo sapiens OX 9606 GN KIAA1191 PE 1 SV 1 RNDDDDT