annotate galaxy_micropita/src/breadcrumbs/src/UtilityMath.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: Utility class for generic math functions.
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 #Import libaries
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
36 import itertools
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
37 import numpy as np
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
38 import operator
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
39 import random
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 class UtilityMath():
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
43 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
44 Class to perform misc math methods.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
45 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
46
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
47 ##
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
48 #Happy path test 2
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
49 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
50 def funcConvertToBHQValue(ldPValues, iNumberOfTests=None):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
51 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
52 Convert a list of p-value to a list of q-values.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
53
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
54 :param ldPValues: List of doubles (p-values) to convert.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
55 :type List
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
56 :param iNumberOfTests: Number of (multiple) tests if different than the ldValue length. If not set the length of ldPValues is used.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
57 :type Integer
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
58 :return List: List of Q-values made with a BH modification.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
59 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
60
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
61 #If the number of tests is not specified, use the number of pvalues
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
62 if(iNumberOfTests == None):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
63 iNumberOfTests = len(ldPValues)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
64 #Used to hold the pvalues as they are being manipulated
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
65 lsConvertToQValues = list()
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
66 #Is used to set the ordr of the pvalues as they are placed in the lsConvertToQValues
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
67 dOrder = 1
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
68 for dValue in ldPValues:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
69 lsConvertToQValues.append([dValue,dOrder,None])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
70 dOrder = dOrder + 1
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
71
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
72 #Sort by pvalue
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
73 lsConvertToQValues.sort(key=lambda x: x[0])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
74
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
75 #Used to keep track of the current test number
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
76 iTest = 1
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
77 for dConvValue in lsConvertToQValues:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
78 dConvValue[2] = dConvValue[0] * iNumberOfTests / iTest
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
79 iTest = iTest + 1
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
80
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
81 #Sort by original order
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
82 lsConvertToQValues.sort(key=lambda x: x[1])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
83
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
84 #return just 1 dimension (the qvalue)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
85 return [ldValues[2] for ldValues in lsConvertToQValues]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
86
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
87 #Happy path tested 5
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
88 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
89 def funcSampleWithReplacement(aData, iSelect):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
90 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
91 Sample from a vector of data (aData) with replacement iSelect many objects.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
92
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
93 :param aData: Data to sample from with replacement.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
94 :type List
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
95 :param iSelect: Amount of data to select from the original data population.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
96 :type Integer.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
97 :return List: List of sampled data.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
98 Returns an empty list on error.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
99 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
100
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
101 if iSelect and aData:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
102 iDataSize = len(aData)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
103 funcRandom, funcInt = random.random, int
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
104 lsSampling = operator.itemgetter(*[funcInt(funcRandom() * iDataSize) for selected in itertools.repeat(None, iSelect)])(aData)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
105 if isinstance(lsSampling, basestring):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
106 lsSampling = [lsSampling]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
107 return lsSampling
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
108 return []
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
109
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
110 #Happy Path Tested 2
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
111 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
112 def funcSumRowsOfColumns(npaAbundance, lsSampleNames):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
113 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
114 Takes the column names of a npArray and sums the rows into one column.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
115
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
116 :param npaAbundance: Array of data to sum.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
117 :type Numpy Array
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
118 :param lsSampleNames: List of sample names.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
119 :type List List of strings.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
120 :return List List of data summed at each row.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
121 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
122
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
123 #Compress by data name
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
124 npPooledSample = npaAbundance[lsSampleNames[0]]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
125 for strSampleName in lsSampleNames[1:]:
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
126 #When combining, combine counts by summing
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
127 npPooledSample = npPooledSample + npaAbundance[strSampleName]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
128 return list(npPooledSample)
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
129
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
130 #Testing Status: Light happy path testing 2
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
131 @staticmethod
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
132 def funcTransposeDataMatrix(npaMatrix, fRemoveAdornments=False):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
133 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
134 Transposes a numpy array.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
135
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
136 :param npaMatrix: Data matrix to transpose.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
137 :type Numpy Array
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
138 :param fRemoveAdornments: Remove the first column before transposing.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
139 :type Boolean True indicates removing the column.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
140 :return Boolean or Numpy Array: Transposed array or a boolean indicating error.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
141 Boolean False is returned on error.
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
142 """
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
143
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
144 #Validate parameters
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
145 if(not ValidateData.funcIsValidNPArray(npaMatrix)):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
146 print "".join(["Utility_Math:transposeDataMatrix::Error, transposeDataMatrix was an invalid structured array. Value =",str(npaMatrix)])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
147 return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
148 if(not ValidateData.funcIsValidBoolean(fRemoveAdornments)):
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
149 print "".join(["Utility_Math:transposeDataMatrix::Error, fRemoveAdornments was an invalid boolean. Value =",str(fRemoveAdornments)])
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
150 return False
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
151
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
152 #Change to samples x taxa as is needed for the compute method below
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
153 #Also remove the first row which is taxa identification
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
154 conversionMatrix = [list(row)[fRemoveAdornments:] for row in npaMatrix]
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
155 return np.array(conversionMatrix).transpose()
8fb4630ab314 Uploaded
sagun98
parents:
diff changeset
156