]> git.donarmstrong.com Git - mothur.git/blob - geom.cpp
755c1ec81cd282224ad44f574ec13627a9fd1408
[mothur.git] / geom.cpp
1 /*
2  *  geom.cpp
3  *  Mothur
4  *
5  *  Created by Thomas Ryabin on 2/23/09.
6  *  Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.
7  *
8  */
9
10 #include "geom.h"
11
12 /***********************************************************************/
13
14 double Geom::kEq(double k, double spec){
15         return k/(1-k)*pow(1-k, spec)/(1-pow(1-k, spec));
16 }
17
18 RAbundVector Geom::getRAbundVector(SAbundVector* rank){
19                 vector <int> rData;
20                 int mr = 1;
21                 int nb = 0;
22                 int ns = 0;
23                 
24                 for(int i = rank->size()-1; i > 0; i--)
25                 {
26                         int cur = rank->get(i);
27                         if(mr == 1 && cur > 0)
28                                 mr = i;
29                         nb += cur;
30                         ns += i*cur;
31                         for(int j = 0; j < cur; j++)
32                                 rData.push_back(i);
33                 }
34                 
35                 RAbundVector rav = RAbundVector(rData, mr, nb, ns);
36                 rav.setLabel(rank->getLabel());
37                 return rav;
38 }
39
40 /***********************************************************************************/
41
42 /***********************************************************************************/
43 EstOutput Geom::getValues(SAbundVector* rank){
44         try {
45                 data.resize(3,0);
46                 
47                 rdata = getRAbundVector(rank);
48                 int numInd = rdata.getNumSeqs();
49                 int numSpec = rdata.getNumBins();
50                 int min = rdata.get(rdata.size()-1);
51                 double k = .5;
52                 double step = .49999;
53                 
54                 while(fabs(min - numInd*kEq(k, (double)numSpec)) > .0001) //This uses a binary search to find the value of k.
55                 {
56                         if(numInd*kEq(k, numSpec) > min)
57                                 k += step;
58                         else
59                                 k -= step;
60                         step /= 2;
61                 }
62                 
63                 double cK = 1/(1-pow(1-k, numSpec));
64                 double sumExp = 0;
65                 double sumObs = 0;
66                 double maxDiff = 0;
67                 
68                 for(int i = 0; i < numSpec; i++)
69                 {
70                         sumObs += rdata.get(i);
71                         sumExp += numInd*cK*k*pow(1-k, i);
72                         
73                         double diff = fabs(sumObs-sumExp);
74                         if(diff > maxDiff)      {       maxDiff = diff;         }
75                         
76                 }
77
78
79                 /*cout << "Geom:\n";
80                 cout << "D-Statistic = " << DStatistic << "\n";
81                 cout << "Critical value for 95% confidence interval = ";*/
82
83                 data[0] = maxDiff/numInd;
84                 data[1] = 0.886/sqrt(numSpec);
85                 data[2] = 1.031/sqrt(numSpec);
86
87                 /*cout << critVal << "\n";
88                 cout << "If D-Statistic is less than the critical value then the data fits the Geometric Series model w/ 95% confidence.\n\n";*/
89                                 
90                 if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
91                 if (isnan(data[1]) || isinf(data[1])) { data[1] = 0; }
92                 if (isnan(data[2]) || isinf(data[2])) { data[2] = 0; }
93                 
94                 return data;
95         }
96         catch(exception& e) {
97                 cout << "Standard Error: " << e.what() << " has occurred in the NPShannon class Function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
98                 exit(1);
99         }
100         catch(...) {
101                 cout << "An unknown error has occurred in the NPShannon class function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
102                 exit(1);
103         }       
104 }
105
106 /***********************************************************************/
107
108
109
110
111
112
113