物种丰度计算

由于Qiime出了点问题,ITS项目先缓几天,这两天先忙着做meta的内容。

物种丰度计算准备工作:

1  使用SOAPAligner对过滤好的数据进行比对,得到相应的.soap文件,里面记录匹配到的reads的情况;

2  还需要将所有用到的reference做一个TAX,tax文件记录reference的物种信息,每一行分别是一个物种的gi号、界、门、纲、目、科、属、种、亚种的名称,分别用制表符隔开;

3  对于每个亚种genome,需要计算其长度,做成SIZE文件,每一行分别是一个亚种的名称和genome长度,用制表符隔开;

计算过程:

以亚种为基础,一个亚种的丰度Ab(G) = Ab(U) + Ab(M),其中

G:物种

U:unique数目,一条reads只比对上单一物种称为unique reads,一个物种的所有unique总和为U

M:multiple数目,一条reads比对上多个物种成为multiple reads,一个物种的所有multiple总和为M

Ab(U) = U/L(g); L(g)为相应物种的genome长度;

Ni 表示 multiple reads 比对上的所有物种;

  1 #!/usr/bin/perl
  2 use strict;
  3
  4 my $usage = "usage:get_profiling.pl <.soap file> <outprefix> <TAX file> <SIZE file> depth list\n";
  5    $usage .= "depth 1..8 stand for Kindom..SubSpecies\n";
  6
  7 die $usage unless @ARGV>=5;
  8
  9 my $soapfile = shift @ARGV;
 10 my $outprefix = shift @ARGV;
 11 my $taxfile = shift @ARGV;
 12 my $sizefile = shift @ARGV;
 13 my @depth = @ARGV;
 14
 15
 16 #########################################################################################################################
 17 #                                                            #
 18 #    %tax{gi}[Kindom][Phylum][Class][Order][Family][Genus][Species][SubSpecies]                    #
 19 #        1    2    3    4    5    6    7    8                        #
 20 #    %size{strname} = length of genome                                        #
 21 #    %soap{reads id}[0] = unique or multiple;                                    #
 22 #    %soap{reads id}[1..n] stand for matched strname;                                #
 23 #                                                            #
 24 #                    set tables                                    #
 25 #                                                            #
 26 #########################################################################################################################
 27 open TAX,$taxfile or die $!;
 28 my %tax;
 29 while(<TAX>){
 30     chomp;
 31     my @a = split /\s+/;
 32     for(my $i=1;$i<=8;$i++){
 33         $tax{$a[0]}[$i]=$a[$i];
 34     }
 35 }
 36 close TAX;
 37 open SIZE,$sizefile or die $!;
 38 my %size;
 39 while(<SIZE>){
 40     chomp;
 41     my @a = split /\s+/;
 42     if (exists $tax{$a[0]})
 43     {
 44         $size{$tax{$a[0]}[8]} = int($a[1]);
 45     }
 46 }
 47 close SIZE;
 48 open SOAP,$soapfile or die $!;
 49 my %soap;
 50 while(<SOAP>){
 51     chomp;
 52     my @a = split /\s+/;
 53     my $id = $a[0];
 54     $id = substr($id,0,$id.length()-2);
 55     my $strname = $tax{$a[7]}[8];
 56
 57     if ( exists $soap{$id} ){
 58         $soap{$id}[0] = "multiple" unless ($soap{$id}[1] eq $strname);
 59     }else{
 60         $soap{$id}[0] = "unique";
 61     }
 62     push(@{$soap{$id}},$strname);
 63
 64     my $reads2 = <SOAP>;
 65 }
 66 close SOAP;
 67 #########################################################################################################################
 68 #                                                            #
 69 #                table setted successful                                    #
 70 #                                                            #
 71 #########################################################################################################################
 72 my %uniquenum;
 73 my %multiplestr;
 74 my %str_reads;
 75 my %reads_str;
 76 my %abu;
 77 my %abm;
 78 my %sum;
 79 my %ab_str;  #the result hash;
 80 foreach my $id (sort keys %soap){
 81     my $type = shift @{$soap{$id}};
 82     if ( $type eq "unique" ){
 83         $uniquenum{$soap{$id}[0]}++;
 84     }elsif ($type eq "multiple"){
 85         foreach my $strname($soap{$id}){
 86             $multiplestr{$strname}++;
 87             $reads_str{$id}{$strname}++;
 88             $str_reads{$strname}{$id}++;
 89         }
 90     }
 91 }
 92 foreach my $strname(sort keys %uniquenum){
 93     $abu{$strname} = $uniquenum{$strname} / $size{$strname} if(exists $size{$strname});
 94 }
 95 foreach my $id(sort keys %soap){
 96     foreach my $strname (sort keys %{$reads_str{$id}}){
 97         $sum{$id} += $abu{$strname} if (exists $abu{$strname});
 98     }
 99 }
100 foreach my $strname(sort keys %multiplestr){
101     foreach my $id(sort keys %{$str_reads{$strname}}){
102         $abm{$strname} += $abu{$strname}/$sum{$id} if($sum{$id});
103     }
104 }
105 foreach my $strname(sort keys %abu){
106     if(exists $abm{$strname})
107     {
108         $ab_str{$strname} = $abu{$strname} + $abm{$strname};
109     }else{
110         $ab_str{$strname} = $abu{$strname};
111     }
112 }
113 undef %tax;
114 undef %size;
115 undef %soap;
116 undef %uniquenum;
117 undef %multiplestr;
118 undef %str_reads;
119 undef %reads_str;
120 undef %abu;
121 undef %abm;
122 undef %sum;
123 #########################################################################################################################
124 #                                                            #
125 #                abundance of subSpecies calculated successful                        #
126 #                                                            #
127 #########################################################################################################################
128
129 open OUT,">test" or die $!;
130 foreach my $keys(sort keys %ab_str){
131     print OUT "$keys\t$ab_str{$keys}\n";
132 }
133 close OUT;
134 foreach my $d (@depth){
135     die "Please input correct depth !\n" unless ($d>=1 && $d<=8);
136     &Abundance($d);
137 }
138 sub Abundance{
139     my $depth = shift @_;
140     my @text=("num","Kindom","Phylum","Class","Order","Family","Genus","Species","SubSpecies");
141     open TAX,$taxfile or die $!;
142     my %strtable;
143     my %ab;
144     while(<TAX>){
145         chomp;
146         my @a = split /\s+/;
147         $strtable{$a[$depth]}{$a[8]}++;
148     }
149     foreach my $name (sort keys %strtable){
150         foreach my $strname (sort keys %{$strtable{$name}}){
151             if(exists $ab_str{$strname}){
152                 $ab{$name} += $ab_str{$strname};
153             }
154         }
155     }
156     open AB,">$outprefix"."_"."$text[$depth].abundance" or die $!;
157     print AB "$text[$depth]\tabundance\n";
158     foreach my $name(sort keys %ab){
159         print AB "$name\t$ab{$name}\n"
160     }
161     close AB;
162 }
时间: 2024-11-13 02:36:47

物种丰度计算的相关文章

图像相似度计算

http://blog.sina.com.cn/s/blog_4a540be60100vjae.html 图像相似度计算 (2011-12-13 22:16:23) 转载▼ 标签: 图像 相似 svd nmf 巴氏距离 直方图距离 图像哈希 图像校正 图像内容检索 分类: 计算机视觉 图像相似度计算主要用于对于两幅图像之间内容的相似程度进行打分,根据分数的高低来判断图像内容的相近程度. 可以用于计算机视觉中的检测跟踪中目标位置的获取,根据已有模板在图像中找到一个与之最接近的区域.然后一直跟着.已

word2vec词向量训练及中文文本相似度计算

本文是讲述如何使用word2vec的基础教程,文章比较基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python下载地址:http://radimrehurek.com/gensim/models/word2vec.html 1.简单介绍 参考:<Word2vec的核心架构及其应用 · 熊富林,邓怡豪,唐晓晟 · 北邮2015年> <Word2vec的工作原理及应用探究 · 周练 · 西安电子科技大学

Python简单实现基于VSM的余弦相似度计算

在知识图谱构建阶段的实体对齐和属性值决策.判断一篇文章是否是你喜欢的文章.比较两篇文章的相似性等实例中,都涉及到了向量空间模型(Vector Space Model,简称VSM)和余弦相似度计算相关知识.        这篇文章主要是先叙述VSM和余弦相似度相关理论知识,然后引用阮一峰大神的例子进行解释,最后通过Python简单实现百度百科和互动百科Infobox的余弦相似度计算. 一. 基础知识 第一部分参考我的文章: 基于VSM的命名实体识别.歧义消解和指代消解 第一步,向量空间模型VSM 

文本相似度计算基本方法小结

在计算文本相似项发现方面,有以下一些可参考的方法.这些概念和方法会帮助我们开拓思路. 相似度计算方面 Jaccard相似度:集合之间的Jaccard相似度等于交集大小与并集大小的比例.适合的应用包括文档文本相似度以及顾客购物习惯的相似度计算等. Shingling:k-shingle是指文档中连续出现的任意k个字符.如果将文档表示成其k-shingle集合,那么就可以基于集合之间的 Jaccard相似度来计算文档之间的文本相似度.有时,将shingle哈希成更短的位串非常有用,可以基于这些哈希值

java文本相似度计算(Levenshtein Distance算法(中文翻译:编辑距离算法))----代码和详解

算法代码实现: package com.util; public class SimFeatureUtil { private static int min(int one, int two, int three) { int min = one; if (two < min) { min = two; } if (three < min) { min = three; } return min; } public static int ld(String str1, String str2)

图像相似度计算之哈希值方法OpenCV实现

http://blog.csdn.net/fengbingchun/article/details/42153261 图像相似度计算之哈希值方法OpenCV实现 2014-12-25 21:27 2959人阅读 评论(0) 收藏 举报  分类: OpenCV(72)  Image Processing(18)  版权声明:本文为博主原创文章,未经博主允许不得转载. 感知哈希算法(perceptual hash algorithm),它的作用是对每张图像生成一个“指纹”(fingerprint)字

海量数据相似度计算之simhash短文本查找

在前一篇文章 <海量数据相似度计算之simhash和海明距离> 介绍了simhash的原理,大家应该感觉到了算法的魅力.但是随着业务的增长 simhash的数据也会暴增,如果一天100w,10天就1000w了.我们如果插入一条数据就要去比较1000w次的simhash,计算量还是蛮大,普通PC 比较1000w次海明距离需要 300ms ,和5000w数据比较需要1.8 s.看起来相似度计算不是很慢,还在秒级别.给大家算一笔账就知道了: 随着业务增长需要一个小时处理100w次,一个小时为3600

海量数据相似度计算之simhash和海明距离

通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析.分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法.欧式距离.Jaccard相似度.最长公共子串.编辑距离等.这些算法对于待比较的文本数据不多时还比较好用,如果我们的爬虫每天采集的数据以千万计算,我们如何对于这些海量千万级的数据进行高效的合并去重.最简单的做法是拿着待比较的文本和数据库中所有的文本比较一遍如果是重复的数据就标示为重复.看起来很简单,我们来做个测试,就拿最简单的

相似度计算map-reduce实现思路

相似度计算map-reduce实现思路 输入: 1 f(1) 2 f(2) 3 f(3) 4 f(4) mapper: 1,2 f(1) 1,3 f(1) 1,4 f(1) 1,2 f(2) 2,3 f(2) 2,4 f(2) 1,3 f(3) 2,3 f(3) 3,4 f(3) 1,4 f(4) 2,4 f(4) 3,4 f(4) reducer: 1,2 f(1) f(2) 1,3 f(1) f(3) 1,4 f(1) f(4) 2,3 f(2) f(3) 2,4 f(2) f(4) 3,4