annotate galaxy_micropita/src/breadcrumbs/src/Metric.py @ 3:8fb4630ab314 draft default tip

Uploaded
author sagun98
date Thu, 03 Jun 2021 17:07:36 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
1 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
2 Author: Timothy Tickle
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
3 Description: Calculates Metrics.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
4 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
5
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
6 #####################################################################################
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
7 #Copyright (C) <2012>
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
8 #
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
9 #Permission is hereby granted, free of charge, to any person obtaining a copy of
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
10 #this software and associated documentation files (the "Software"), to deal in the
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
11 #Software without restriction, including without limitation the rights to use, copy,
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
12 #modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
13 #and to permit persons to whom the Software is furnished to do so, subject to
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
14 #the following conditions:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
15 #
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
16 #The above copyright notice and this permission notice shall be included in all copies
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
17 #or substantial portions of the Software.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
18 #
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
19 #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
20 #INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
21 #PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
22 #HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
23 #OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
24 #SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
25 #####################################################################################
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
26
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
27 __author__ = "Timothy Tickle"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
28 __copyright__ = "Copyright 2012"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
29 __credits__ = ["Timothy Tickle"]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
30 __license__ = "MIT"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
31 __maintainer__ = "Timothy Tickle"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
32 __email__ = "ttickle@sph.harvard.edu"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
33 __status__ = "Development"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
34
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
35 #Update path
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
36 from ConstantsBreadCrumbs import ConstantsBreadCrumbs
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
37 import csv
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
38 import numpy as np
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
39 from types import *
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
40 from ValidateData import ValidateData
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
41
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
42 #External libraries
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
43 from cogent.maths.unifrac.fast_unifrac import fast_unifrac_file
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
44 import cogent.maths.stats.alpha_diversity
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
45 import scipy.spatial.distance
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
46
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
47 class Metric:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
48 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
49 Performs ecological measurements.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
50 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
51
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
52 #Diversity metrics Alpha
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
53 c_strSimpsonDiversity = "SimpsonD"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
54 c_strInvSimpsonDiversity = "InSimpsonD"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
55 c_strChao1Diversity = "Chao1"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
56
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
57 #Diversity metrics Beta
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
58 c_strBrayCurtisDissimilarity = "B_Curtis"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
59 c_strUnifracUnweighted = "unifrac_unweighted"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
60 c_strUnifracWeighted = "unifrac_weighted"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
61
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
62 #Additive inverses of beta metrics
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
63 c_strInvBrayCurtisDissimilarity = "InB_Curtis"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
64
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
65 #Richness
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
66 c_strShannonRichness = "ShannonR"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
67 c_strObservedCount = "Observed_Count"
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
68
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
69 #Different alpha diversity metrics
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
70 setAlphaDiversities = set(["observed_species","margalef","menhinick",
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
71 "dominance","reciprocal_simpson","shannon","equitability","berger_parker_d",
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
72 "mcintosh_d","brillouin_d","strong","fisher_alpha","simpson",
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
73 "mcintosh_e","heip_e","simpson_e","robbins","michaelis_menten_fit","chao1","ACE"])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
74
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
75 #Different beta diversity metrics
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
76 setBetaDiversities = set(["braycurtis","canberra","chebyshev","cityblock",
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
77 "correlation","cosine","euclidean","hamming","sqeuclidean"])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
78
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
79 #Tested 4
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
80 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
81 def funcGetSimpsonsDiversityIndex(ldSampleTaxaAbundancies=None):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
82 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
83 Calculates the Simpsons diversity index as defined as sum(Pi*Pi).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
84 Note***: Assumes that the abundance measurements are already normalized by the total population N.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
85
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
86 :param ldSampleTaxaAbundancies: List of measurements to calculate metric on (a sample).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
87 :type: List of doubles
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
88 :return Double: Diversity metric
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
89 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
90
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
91 #Calculate metric
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
92 return sum((ldSampleTaxaAbundancies)*(ldSampleTaxaAbundancies))
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
93
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
94 #Tested 4
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
95 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
96 def funcGetInverseSimpsonsDiversityIndex(ldSampleTaxaAbundancies=None):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
97 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
98 Calculates Inverse Simpsons diversity index 1/sum(Pi*Pi).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
99 This is multiplicative inverse which reverses the order of the simpsons diversity index.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
100 Note***: Assumes that the abundance measurements are already normalized by the total population N.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
101
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
102 :param ldSampleTaxaAbundancies: List of measurements to calculate metric on (a sample).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
103 :type: List of doubles
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
104 :return Double: Diversity metric
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
105 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
106
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
107 simpsons = Metric.funcGetSimpsonsDiversityIndex(ldSampleTaxaAbundancies)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
108 #If simpsons is false return false, else return inverse
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
109 if not simpsons:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
110 return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
111 return 1.0/simpsons
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
112
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
113 #Tested 4
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
114 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
115 def funcGetShannonRichnessIndex(ldSampleTaxaAbundancies=None):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
116 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
117 Calculates the Shannon richness index.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
118 Note***: Assumes that the abundance measurements are already normalized by the total population N.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
119 If not normalized, include N in the parameter tempTotalN and it will be.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
120 This is in base exp(1) like the default R Vegan package. Cogent is by defaul in bits (base=2)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
121 Both options are here for your use. See Metric.funcGetAlphaDiversity() to access cogent
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
122
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
123 :param ldSampleTaxaAbundancies: List of measurements to calculate metric on (a sample).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
124 :type: List of doubles
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
125 :return Double: Richness metric
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
126 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
127
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
128 #Calculate metric
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
129 ldSampleTaxaAbundancies = ldSampleTaxaAbundancies[np.where(ldSampleTaxaAbundancies != 0)]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
130 tempIntermediateNumber = sum(ldSampleTaxaAbundancies*(np.log(ldSampleTaxaAbundancies)))
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
131 if(tempIntermediateNumber == 0.0):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
132 return 0.0
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
133 return -1 * tempIntermediateNumber
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
134
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
135 #Test 3
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
136 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
137 def funcGetChao1DiversityIndex(ldSampleTaxaAbundancies=None, fCorrectForBias=False):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
138 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
139 Calculates the Chao1 diversity index.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
140 Note***: Not normalized by abundance.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
141
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
142 :param ldSampleTaxaAbundancies: List of measurements to calculate metric on (a sample).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
143 :type: List of doubles
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
144 :param fCorrectForBias: Indicator to use bias correction.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
145 :type: Boolean False indicates uncorrected for bias (uncorrected = Chao 1984, corrected = Chao 1987, Eq. 2)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
146 :return Double: Diversity metric
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
147 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
148 #If not counts return false
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
149 if [num for num in ldSampleTaxaAbundancies if((num<1) and (not num==0))]: return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
150
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
151 #Observed = total number of species observed in all samples pooled
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
152 totalObservedSpecies = len(ldSampleTaxaAbundancies)-len(ldSampleTaxaAbundancies[ldSampleTaxaAbundancies == 0])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
153
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
154 #Singles = number of species that occur in exactly 1 sample
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
155 singlesObserved = len(ldSampleTaxaAbundancies[ldSampleTaxaAbundancies == 1.0])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
156
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
157 #Doubles = number of species that occue in exactly 2 samples
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
158 doublesObserved = len(ldSampleTaxaAbundancies[ldSampleTaxaAbundancies == 2.0])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
159
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
160 #If singles or doubles = 0, return observations so that a divided by zero error does not occur
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
161 if((singlesObserved == 0) or (doublesObserved == 0)):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
162 return totalObservedSpecies
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
163
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
164 #Calculate metric
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
165 if fCorrectForBias:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
166 return cogent.maths.stats.alpha_diversity.chao1_bias_corrected(observed = totalObservedSpecies, singles = singlesObserved, doubles = doublesObserved)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
167 else:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
168 return cogent.maths.stats.alpha_diversity.chao1_uncorrected(observed = totalObservedSpecies, singles = singlesObserved, doubles = doublesObserved)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
169
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
170 #Test 3
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
171 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
172 def funcGetObservedCount(ldSampleAbundances, dThreshold = 0.0):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
173 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
174 Count how many bugs / features have a value of greater than 0 or the threshold given.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
175 Expects a vector of abundances.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
176 ****Do not normalize data if using the threshold.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
177
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
178 :param ldSampleAbundances: List of measurements to calculate metric on (a sample).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
179 :type: List of doubles
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
180 :param dThreshold: The lowest number the measurement can be to be counted as an observation.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
181 :type: Double
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
182 :return Count: Number of features observed in a sample.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
183 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
184
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
185 return sum([1 for observation in ldSampleAbundances if observation > dThreshold])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
186
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
187 #Test Cases 6
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
188 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
189 def funcGetAlphaDiversity(liCounts,strMetric):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
190 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
191 Passes counts to cogent for an alpha diversity metric.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
192 setAlphaDiversities are the names supported
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
193
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
194 :param liCount: List of counts to calculate metric on (a sample).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
195 :type: List of ints
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
196 :return Diversity: Double diversity metric.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
197 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
198
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
199 return getattr(cogent.maths.stats.alpha_diversity,strMetric)(liCounts)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
200
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
201 #Happy path tested 1
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
202 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
203 def funcGetDissimilarity(ldSampleTaxaAbundancies, funcDistanceFunction):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
204 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
205 Calculates the distance between samples given a function.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
206
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
207 If you have 5 rows (labeled r1,r2,r3,r4,r5) the vector are the distances in this order.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
208 condensed form = [d(r1,r2), d(r1,r3), d(r1,r4), d(r1,r5), d(r2,r3), d(r2,r4), d(r2,r5), d(r3,r4), d(r3,r5), d(r4,r5)].
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
209 Note***: Assumes that the abundance measurements are already normalized by the total population N.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
210
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
211 :param ldSampleTaxaAbundancies:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
212 :type: List of doubles
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
213 :param funcDistanceFunction: Distance function used to calculate distances
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
214 :type: Function
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
215 :return Double: Dissimilarity metric
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
216 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
217
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
218 #Calculate metric
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
219 try:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
220 return scipy.spatial.distance.pdist(ldSampleTaxaAbundancies, funcDistanceFunction)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
221 except ValueError as error:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
222 print "".join(["Metric.funcGetDissimilarity. Error=",str(error)])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
223 return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
224
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
225 #Test case 1
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
226 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
227 def funcGetDissimilarityByName(ldSampleTaxaAbundancies, strMetric):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
228 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
229 Calculates beta-diversity metrics between lists of abundances
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
230 setBetaDiversities are the names supported
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
231
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
232 :param ldSampleTaxaAbundancies:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
233 :type: List of doubles
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
234 :param strMetric: Name of the distance function used to calculate distances
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
235 :type: String
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
236 :return list double: Dissimilarity metrics between each sample
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
237 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
238
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
239 return scipy.spatial.distance.pdist(ldSampleTaxaAbundancies,strMetric)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
240
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
241 #Test 3
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
242 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
243 def funcGetBrayCurtisDissimilarity(ldSampleTaxaAbundancies):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
244 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
245 Calculates the BrayCurtis Beta dissimilarity index.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
246 d(u,v)=sum(abs(row1-row2))/sum(row1+row2).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
247 This is scale invariant.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
248 If you have 5 rows (labeled r1,r2,r3,r4,r5) the vector are the distances in this order.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
249 condensed form = [d(r1,r2), d(r1,r3), d(r1,r4), d(r1,r5), d(r2,r3), d(r2,r4), d(r2,r5), d(r3,r4), d(r3,r5), d(r4,r5)].
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
250 Note***: Assumes that the abundance measurements are already normalized by the total population N.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
251
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
252 :param ldSampleTaxaAbundancies:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
253 :type: List of doubles
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
254 :return Double Matrix: Dissimilarity metric
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
255 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
256
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
257 #Calculate metric
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
258 try:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
259 return scipy.spatial.distance.pdist(X=ldSampleTaxaAbundancies, metric='braycurtis')
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
260 except ValueError as error:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
261 print "".join(["Metric.getBrayCurtisDissimilarity. Error=",str(error)])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
262 return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
263
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
264 #Test 3
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
265 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
266 def funcGetInverseBrayCurtisDissimilarity(ldSampleTaxaAbundancies):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
267 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
268 Calculates 1 - the BrayCurtis Beta dissimilarity index.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
269 d(u,v)=1-(sum(abs(row1-row2))/sum(row1+row2)).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
270 This is scale invariant and ranges between 0 and 1.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
271 If you have 5 rows (labeled r1,r2,r3,r4,r5) the vector are the distances in this order.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
272 condensed form = [d(r1,r2), d(r1,r3), d(r1,r4), d(r1,r5), d(r2,r3), d(r2,r4), d(r2,r5), d(r3,r4), d(r3,r5), d(r4,r5)].
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
273 Note***: Assumes that the abundance measurements are already normalized by the total population N.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
274
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
275 :param ldSampleTaxaAbundancies: An np.array of samples (rows) x measurements (columns) in which distance is measured between rows
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
276 :type: List List of doubles
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
277 :return Double Matrix: 1 - Bray-Curtis dissimilarity.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
278 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
279
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
280 bcValue = Metric.funcGetBrayCurtisDissimilarity(ldSampleTaxaAbundancies = ldSampleTaxaAbundancies)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
281 if not type(bcValue) is BooleanType:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
282 return 1.0-bcValue
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
283 return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
284
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
285 #Test cases 8
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
286 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
287 def funcGetUnifracDistance(istrmTree,istrmEnvr,lsSampleOrder=None,fWeighted=True):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
288 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
289 Gets a unifrac distance from files/filestreams.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
290
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
291 :param istrmTree: File path or stream which is a Newick format file
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
292 :type: String of file stream
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
293 :param istrmEnvr: File path or stream which is a Newick format file
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
294 :type: String of file stream
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
295 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
296 npaDist, lsSampleNames = fast_unifrac_file(open(istrmTree,"r") if isinstance(istrmTree, str) else istrmTree,
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
297 open(istrmEnvr,"r") if isinstance(istrmEnvr, str) else istrmEnvr, weighted=fWeighted).get("distance_matrix",False)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
298
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
299 #Was trying to avoid preallocating a matrix but if you only need a subset of the samples then it
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
300 #is simpler to preallocate so this is what I am doing but making a condensed matrix and not a full matrix
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
301
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
302 #Dictionary to translate the current order of the samples to what is expected if given an input order
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
303 if lsSampleOrder:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
304 #{NewOrder:OriginalOrder} way to convert from old to new sample location
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
305 dictTranslate = dict([[lsSampleOrder.index(sSampleName),lsSampleNames.index(sSampleName)] for sSampleName in lsSampleNames if sSampleName in lsSampleOrder])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
306
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
307 #Check to make sure all samples requested were found
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
308 if not len(dictTranslate.keys()) == len(lsSampleOrder):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
309 print "Metric.funcGetUnifracDistance. Error= The some or all sample names given (lsSampleOrder) were not contained in the matrix."
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
310 return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
311
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
312 #Length of data
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
313 iLengthOfData = len(lsSampleOrder)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
314
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
315 #Preallocate matrix and shuffle
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
316 mtrxData = np.zeros(shape=(iLengthOfData,iLengthOfData))
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
317 for x in xrange(iLengthOfData):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
318 for y in xrange(iLengthOfData):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
319 mtrxData[x,y] = npaDist[dictTranslate[x],dictTranslate[y]]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
320 npaDist = mtrxData
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
321
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
322 lsSampleNames = lsSampleOrder
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
323
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
324 #If no sample order is given, condense the matrix and return
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
325 return (scipy.spatial.distance.squareform(npaDist),lsSampleNames)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
326
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
327
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
328 #Test 7
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
329 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
330 def funcGetAlphaMetric(ldAbundancies, strMetric):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
331 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
332 Get alpha abundance of the metric for the vector.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
333 Note: Shannon is measured with base 2 ("shannon") or base exp(1) (Metric.c_strShannonRichness) depending which method is called.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
334
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
335 :param ldAbundancies: List of values to compute metric (a sample).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
336 :type: List List of doubles.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
337 :param strMetric: The metric to measure.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
338 :type: String Metric name (Use from constants above).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
339 :return Double: Metric specified by strMetric derived from ldAbundancies.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
340 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
341
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
342 if(strMetric == Metric.c_strShannonRichness):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
343 return Metric.funcGetShannonRichnessIndex(ldSampleTaxaAbundancies=ldAbundancies)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
344 elif(strMetric == Metric.c_strSimpsonDiversity):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
345 return Metric.funcGetSimpsonsDiversityIndex(ldSampleTaxaAbundancies=ldAbundancies)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
346 elif(strMetric == Metric.c_strInvSimpsonDiversity):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
347 return Metric.funcGetInverseSimpsonsDiversityIndex(ldSampleTaxaAbundancies=ldAbundancies)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
348 elif(strMetric == Metric.c_strObservedCount):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
349 return Metric.funcGetObservedCount(ldSampleAbundances=ldAbundancies)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
350 #Chao1 Needs NOT Normalized Abundance (Counts)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
351 elif(strMetric == Metric.c_strChao1Diversity):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
352 return Metric.funcGetChao1DiversityIndex(ldSampleTaxaAbundancies=ldAbundancies)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
353 elif(strMetric in Metric.setAlphaDiversities):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
354 return Metric.funcGetAlphaDiversity(liCounts=ldAbundancies, strMetric=strMetric)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
355 else:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
356 return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
357
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
358 #Test 5
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
359 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
360 def funcBuildAlphaMetricsMatrix(npaSampleAbundance = None, lsSampleNames = None, lsDiversityMetricAlpha = None):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
361 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
362 Build a matrix of alpha diversity metrics for each sample
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
363 Row = metric, column = sample
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
364
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
365 :param npaSampleAbundance: Observations (Taxa (row) x sample (column))
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
366 :type: Numpy Array
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
367 :param lsSampleNames: List of sample names of samples to measure (do not include the taxa id column name or other column names which should not be read).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
368 :type: List of strings Strings being samples to measure from the npaSampleAbundance.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
369 :param lsDiversityMetricAlpha: List of diversity metrics to use in measuring.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
370 :type: List of strings Strings being metrics to derived from the indicated samples.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
371 :return List of List of doubles: Each internal list is a list of (floats) indicating a specific metric measurement method measuring multiple samples
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
372 [[metric1-sample1, metric1-sample2, metric1-sample3],[metric1-sample1, metric1-sample2, metric1-sample3]]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
373 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
374
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
375 if not ValidateData.funcIsValidList(lsDiversityMetricAlpha):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
376 lsDiversityMetricAlpha = [lsDiversityMetricAlpha]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
377
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
378 #Get amount of metrics
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
379 metricsCount = len(lsDiversityMetricAlpha)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
380
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
381 #Create return
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
382 returnMetricsMatrixRet = [[] for index in lsDiversityMetricAlpha]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
383
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
384 #For each sample get all metrics
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
385 #Place in list of lists
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
386 #[[metric1-sample1, metric1-sample2, metric1-sample3],[metric1-sample1, metric1-sample2, metric1-sample3]]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
387 for sample in lsSampleNames:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
388 sampleAbundance = npaSampleAbundance[sample]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
389 for metricIndex in xrange(0,metricsCount):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
390 returnMetricsMatrixRet[metricIndex].append(Metric.funcGetAlphaMetric(ldAbundancies = sampleAbundance, strMetric = lsDiversityMetricAlpha[metricIndex]))
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
391 return returnMetricsMatrixRet
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
392
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
393 #Testing 6 cases
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
394 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
395 def funcGetBetaMetric(npadAbundancies=None, sMetric=None, istrmTree=None, istrmEnvr=None, lsSampleOrder=None, fAdditiveInverse = False):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
396 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
397 Takes a matrix of values and returns a beta metric matrix. The metric returned is indicated by name (sMetric).
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
398
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
399 :param npadAbundancies: Numpy array of sample abundances to measure against.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
400 :type: Numpy Array Numpy array where row=samples and columns = features.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
401 :param sMetric: String name of beta metric. Possibilities are listed in microPITA.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
402 :type: String String name of beta metric. Possibilities are listed in microPITA.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
403 :return Double: Measurement indicated by metric for given abundance list
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
404 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
405
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
406 if sMetric == Metric.c_strBrayCurtisDissimilarity:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
407 mtrxDistance = Metric.funcGetBrayCurtisDissimilarity(ldSampleTaxaAbundancies=npadAbundancies)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
408 elif sMetric == Metric.c_strInvBrayCurtisDissimilarity:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
409 mtrxDistance = Metric.funcGetInverseBrayCurtisDissimilarity(ldSampleTaxaAbundancies=npadAbundancies)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
410 elif sMetric in Metric.setBetaDiversities:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
411 mtrxDistance = Metric.funcGetDissimilarityByName(ldSampleTaxaAbundancies=npadAbundancies, strMetric=sMetric)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
412 elif sMetric == Metric.c_strUnifracUnweighted:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
413 mtrxDistance = Metric.funcGetUnifracDistance(istrmTree=istrmTree,istrmEnvr=istrmEnvr,lsSampleOrder=lsSampleOrder,fWeighted=False)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
414 # mtrxDistance = xReturn[0] if not type(xReturn) is BooleanType else xReturn
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
415 elif sMetric == Metric.c_strUnifracWeighted:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
416 mtrxDistance = Metric.funcGetUnifracDistance(istrmTree=istrmTree,istrmEnvr=istrmEnvr,lsSampleOrder=lsSampleOrder,fWeighted=True)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
417 # mtrxDistance = xReturn[0] if not type(xReturn) is BooleanType else xReturn
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
418 else:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
419 mtrxDistance = False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
420 if fAdditiveInverse and not type(mtrxDistance) is BooleanType:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
421 if sMetric in [Metric.c_strUnifracUnweighted,Metric.c_strUnifracWeighted]:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
422 mtrxDistance = (1.0 - mtrxDistance[0],mtrxDistance[1])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
423 else:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
424 mtrxDistance = 1.0 - mtrxDistance
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
425 return mtrxDistance
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
426
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
427 #Test Cases 11
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
428 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
429 def funcReadMatrixFile(istmMatrixFile, lsSampleOrder=None):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
430 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
431 Reads in a file with a precalculated beta-diversty matrix.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
432
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
433 :param istmMatrixFile: File with beta-diversity matrix
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
434 :type: FileStream of String file path
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
435 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
436
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
437 #Read in data
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
438 f = csv.reader(open(istmMatrixFile,"r") if isinstance(istmMatrixFile, str) else istmMatrixFile, delimiter=ConstantsBreadCrumbs.c_matrixFileDelim )
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
439
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
440 #Get header
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
441 try:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
442 lsHeader = f.next()
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
443 except StopIteration:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
444 return (False,False)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
445 lsHeaderReducedToSamples = [sHeader for sHeader in lsHeader if sHeader in lsSampleOrder] if lsSampleOrder else lsHeader[1:]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
446
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
447 #If no sample ordering is given, set the ordering to what is in the file
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
448 if not lsSampleOrder:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
449 lsSampleOrder = lsHeaderReducedToSamples
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
450
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
451 #Preallocate matrix
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
452 mtrxData = np.zeros(shape=(len(lsSampleOrder),len(lsSampleOrder)))
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
453
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
454 #Make sure all samples requested are in the file
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
455 if(not len(lsSampleOrder) == len(lsHeaderReducedToSamples)): return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
456
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
457 for lsLine in f:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
458 if lsLine[0] in lsSampleOrder:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
459 iRowIndex = lsSampleOrder.index(lsLine[0])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
460
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
461 for i in xrange(1,len(lsSampleOrder)):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
462 iColumnIndexComing = lsHeader.index(lsSampleOrder[i])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
463 iColumnIndexGoing = lsSampleOrder.index(lsSampleOrder[i])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
464 mtrxData[iRowIndex,iColumnIndexGoing] = lsLine[iColumnIndexComing]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
465 mtrxData[iColumnIndexGoing,iRowIndex] = lsLine[iColumnIndexComing]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
466 tpleMData = mtrxData.shape
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
467 mtrxData = mtrxData if any(sum(ld)>0 for ld in mtrxData) or ((tpleMData[0]==1) and (tpleMData[1]==1)) else []
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
468 return (mtrxData,lsSampleOrder)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
469
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
470 #Test cases 2
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
471 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
472 def funcWriteMatrixFile(mtrxMatrix, ostmMatrixFile, lsSampleNames=None):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
473 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
474 Writes a square matrix to file.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
475
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
476 :param mtrxMatrix: Matrix to write to file
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
477 :type: Numpy array
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
478 :lsSampleNames: The names of the samples in the order of the matrix
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
479 :type: List of strings
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
480 :ostmBetaMatrixFile: File to write to
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
481 :type: String or file stream
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
482 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
483
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
484 if not sum(mtrxMatrix.shape)>0 or not ostmMatrixFile:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
485 return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
486
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
487 #Check to make sure the sample names are the correct length
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
488 tpleiShape = mtrxMatrix.shape
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
489 if not lsSampleNames:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
490 lsSampleNames = range(tpleiShape[0])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
491 if not(len(lsSampleNames) == tpleiShape[0]):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
492 print "".join(["Metric.funcWriteMatrixFile. Error= Length of sample names ("+str(len(lsSampleNames))+") and matrix ("+str(mtrxMatrix.shape)+") not equal."])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
493 return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
494
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
495 #Write to file
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
496 ostmOut = csv.writer(open(ostmMatrixFile,"w") if isinstance(ostmMatrixFile,str) else ostmMatrixFile, delimiter=ConstantsBreadCrumbs.c_matrixFileDelim )
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
497
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
498 #Add the additional space at the beginning of the sample names to represent the id row/column
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
499 lsSampleNames = [""]+list(lsSampleNames)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
500
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
501 #Write header and each row to file
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
502 ostmOut.writerow(lsSampleNames)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
503 [ostmOut.writerow([lsSampleNames[iIndex+1]]+mtrxMatrix[iIndex,].tolist()) for iIndex in xrange(tpleiShape[0])]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
504 return True