X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=calculator.cpp;h=3aa6a57a3d34f5e840b1a35d243b7c2903708358;hp=6bac62d2090e89c748b274ae6cc553f7911ff80c;hb=d1c97b8c04bb75faca1e76ffad60b37a4d789d3d;hpb=20a2d0350a737a434c89f303662d64a8eeea7b05 diff --git a/calculator.cpp b/calculator.cpp index 6bac62d..3aa6a57 100644 --- a/calculator.cpp +++ b/calculator.cpp @@ -10,1181 +10,97 @@ #include "calculator.h" /***********************************************************************/ -void VecCalc::printElements(vector vec){ - try { - for(int i = 0; i < vec.size(); i++) - cout << vec.at(i) << " "; - cout << "\n\n"; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function printElements. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function printElements. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} - -/***********************************************************************/ - -void VecCalc::printElements(vector vec){ - try { - for(int i = 0; i < vec.size(); i++) - cout << vec.at(i) << " "; - cout << "\n\n"; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function printElements. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function printElements. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -int VecCalc::findString(vector vec, string str){ - try { - for(int i = 0; i < vec.size(); i++) - if(str.compare(vec.at(i)) == 0) - return i; - return -1; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function findString. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function findString. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } +int VecCalc::sumElements(vector vec){ + return sumElements(vec,0); } /***********************************************************************/ -double VecCalc::mean(vector vec){ - return sumElements(vec)/vec.size(); -} -/***********************************************************************/ -double VecCalc::stError(vector vec){ - try { - double sum = 0; - double m = mean(vec); - for(int i = 0; i < vec.size(); i++) - sum += pow(vec.at(i)-m,2); - return pow(sum/(vec.size()*(vec.size()-1)), .5); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function stError. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function stError. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } +int VecCalc::sumElements(vector vec, int index){ + + int sum = 0; + for(int i = index; i < vec.size(); i++) + sum += vec.at(i); + return sum; + } + /***********************************************************************/ double VecCalc::sumElements(vector vec){ - try { double sum = 0; for(int i = 0; i < vec.size(); i++) sum += vec.at(i); return sum; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function sumElements. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function sumElements. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } + } /***********************************************************************/ double VecCalc::sumElements(vector vec, int index){ - try { + double sum = 0; for(int i = index; i < vec.size(); i++) sum += vec.at(i); return sum; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function sumElements. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function sumElements. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } + } /***********************************************************************/ -double VecCalc::findMax(vector vec){ - try { - double max = -1000000.0; +int VecCalc::numNZ(vector vec){ + + int numNZ = 0; for(int i = 0; i < vec.size(); i++) - if(vec.at(i) > max) - max = vec.at(i); - return max; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function findMax. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function findMax. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } + if(vec.at(i) != 0) + numNZ++; + return numNZ; + } /***********************************************************************/ double VecCalc::numNZ(vector vec){ - try { + double numNZ = 0; for(int i = 0; i < vec.size(); i++) if(vec.at(i) != 0) numNZ++; return numNZ; } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function numNZ. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function numNZ. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -double VecCalc::numPos(vector vec){ - try { - double numPos = 0; - for(int i = 0 ; i < vec.size(); i++) - if(vec.at(i) > 0) - numPos++; - return numPos; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function numPos. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function numPos. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -double VecCalc::findMaxDiff(vector vec1, vector vec2){ - try { - double maxDiff = -10000000000.0; - for(int i = 0; i < vec1.size(); i++) - if(fabs(vec1.at(i)-vec2.at(i)) > maxDiff) - maxDiff = fabs(vec1.at(i)-vec2.at(i)); - return maxDiff; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function findMaxDiff. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function findMaxDiff. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -double VecCalc::findDStat(vector vec1, vector vec2, double num){ - try { - double mDiff = findMaxDiff(vec1, vec2); - return (mDiff+.5)/num; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function findDStat. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function findDStat. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::findQuartiles(vector vec){ - try { - vector quartiles; - double max = vec.at(vec.size()-1); - double r1 = max/4; - double r2 = max*3/4; - bool r1found = false; - bool r2found = false; - for(int i = 0; i < vec.size(); i++) - { - if(vec.at(i) > r1 && !r1found) - { - quartiles.push_back(i); - r1found = true; - } - if(vec.at(i) > r2 && !r2found) - { - quartiles.push_back(i); - i = vec.size(); - } - } - return quartiles; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function findQuartiles. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function findQuartiles. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} /***********************************************************************/ -vector VecCalc::add(vector vec, double x){ - try { - vector newVec; - for(int i = 0; i < vec.size(); i++) - newVec.push_back(vec.at(i)+x); - return newVec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function add. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function add. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::multiply(vector vec, double x){ - try { - vector newVec; - for(int i = 0; i < vec.size(); i++) - newVec.push_back(vec.at(i)*x); - return newVec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function multiply. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function multiply. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::power(vector vec, double p){ - try { - vector newVec; - for(int i = 0; i < vec.size(); i++) - newVec.push_back(pow(vec.at(i), p)); - return newVec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function power. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function power. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::addVecs(vector vec1, vector vec2) //Vectors must be the same size. -{ try { - vector newVec; - for(int i = 0; i < vec1.size(); i++) - newVec.push_back(vec1.at(i)+vec2.at(i)); - return newVec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function addVecs. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function addVecs. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::multVecs(vector vec1, vector vec2) //Vectors must be the same size. -{ try { - vector newVec; - for(int i = 0; i < vec1.size(); i++) - newVec.push_back(vec1.at(i)*vec2.at(i)); - return newVec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function multVecs. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function multVecs. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::remDup(vector vec){ - try { - vector newVec; - newVec.push_back(vec.at(0)); - for(int i = 1; i < vec.size(); i++) - if(vec.at(i) != vec.at(i-1)) - newVec.push_back(vec.at(i)); - return newVec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function remDup. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function remDup. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::genCVec(vector vec1){ - try { - vector vec2; - double sum = 0; - for(int i = 0; i < vec1.size(); i++) - { - sum += vec1.at(i); - vec2.push_back(sum); - } - return vec2; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function genCVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function genCVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::genRelVec(vector vec){ - try { - vector newVec; - double sum = sumElements(vec); - for(int i = 0; i < vec.size(); i++) - newVec.push_back(vec.at(i)/sum); - return newVec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function genRelVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function genRelVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::genDiffVec(vector vec1, vector vec2){ - try { - vector newVec; - for(int i = 0; i < vec1.size(); i++) - newVec.push_back(vec1.at(i)-vec2.at(i)); - return newVec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function genDiffVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function genDiffVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::genCSVec(vector vec){ - try { - vector newVec; - double curInd = vec.at(vec.size()-1); - double sumSpec = 0; - double cSumSpec = 0; - for(int i = vec.size()-1; i >= 0; i--) - { - if(vec.at(i) == curInd) - sumSpec++; - else - { - cSumSpec += sumSpec; - newVec.push_back(cSumSpec); - sumSpec = 1; - curInd = vec.at(i); - } - if(i == 0) - newVec.push_back(cSumSpec + sumSpec); - } - return newVec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function genCSVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function genCSVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::genTotVec(vector > vec){ - try { - vector newVec = vec.at(0); - for(int i = 1; i < vec.size(); i++) - newVec = addVecs(newVec, vec.at(i)); - return newVec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function genTotVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function genTotVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::quicksort(vector vec){ - try { - sort(vec.rbegin(), vec.rend()); - return vec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function quicksort. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function quicksort. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector > VecCalc::gen2DVec(vector vec, int div, int type){ - try { - vector > vec2D; - int gap = vec.size()/div; - for(int i = 0; i < div; i++) - { - vector inVec; - for(int j = 0; j < gap; j++) - if(type == 0) - inVec.push_back(vec.at(j + i*gap)); //Rows - else - inVec.push_back(vec.at(i + j*div)); //Columns - vec2D.push_back(inVec); - } - return vec2D; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function gen2DVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function gen2DVec. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -vector VecCalc::getSData(char name[]){ - try { - vector vec; - string data; - ifstream file(name); - if(file.is_open()) - { - while(file >> data) - vec.push_back(data); - file.close(); - } - return vec; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the VecCalc class Function getSData. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the VecCalc class function getSData. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -double BDiversity::getWhitt(vector vec1, vector vec2){ - try { - VecCalc vecCalc; - double numSpec = vecCalc.numNZ(vecCalc.addVecs(vec1,vec2)); - return 2*numSpec/(vecCalc.numNZ(vec1)+vecCalc.numNZ(vec2))-1; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the BDiversity class Function getWhitt. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the BDiversity class function getWhitt. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -double BDiversity::getMS(vector vec1, vector vec2){ - try { - VecCalc vecCalc; - double a = vecCalc.numNZ(vecCalc.multVecs(vec1, vec2)); - double b = vecCalc.numPos(vecCalc.addVecs(vecCalc.addVecs(vec1, vecCalc.multiply(vec2, -1)), vecCalc.multiply(vecCalc.multVecs(vec1, vec2), -1))); - double c = vecCalc.numPos(vecCalc.addVecs(vecCalc.addVecs(vec2, vecCalc.multiply(vec1, -1)), vecCalc.multiply(vecCalc.multVecs(vec2, vec1), -1))); - return a/(a+b+c); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the BDiversity class Function getMS. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the BDiversity class function getMS. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -double BDiversity::getSor(vector vec1, vector vec2){ - try { - double sum = 0; - double asum = 0; - double bsum = 0; - for(int i = 0; i < vec1.size(); i++) - { - asum += vec1.at(i); - bsum += vec2.at(i); - if(vec1.at(i) >= vec2.at(i)) - sum += vec2.at(i); - else - sum += vec1.at(i); - } - return 2*sum/(asum+bsum); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the BDiversity class Function getSor. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the BDiversity class function getSor. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -double BDiversity::getMor(vector vec1, vector vec2){ - try { - double sum = 0; - double asum = 0; - double bsum = 0; - double sum1 = 0; - double sum2 = 0; - for(int i = 0; i < vec1.size(); i++) - { - sum += vec1.at(i)*vec2.at(i); - asum += pow(vec1.at(i),2); - bsum += pow(vec2.at(i),2); - sum1 += vec1.at(i); - sum2 += vec2.at(i); - } - return 2*sum/((asum/pow(sum1,2)+bsum/pow(sum2,2))*(sum1*sum2)); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the BDiversity class Function getMor. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the BDiversity class function getMor. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -void BDiversity::printD(vector > columns, int type){ - try { - cout << " "; - for(int i = 0; i < columns.size(); i++) - cout << "Column:" << i << " "; - cout << "\n"; - for(int i = 0; i < columns.size(); i++) - { - cout << "Column " << i << ":"; - for(int j = 0; j < columns.size(); j++) - { - if(j > i) - { - double B; - if(type == 1) - B = getWhitt(columns.at(i), columns.at(j)); - else if(type == 2) - B = 1-getMS(columns.at(i), columns.at(j)); - else if(type == 3) - B = 1-getSor(columns.at(i), columns.at(j)); - else if(type == 4) - B = 1-getMor(columns.at(i), columns.at(j)); - - cout << B << " "; - } - else - cout << " "; - } - cout << "\n"; - } - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the BDiversity class Function printD. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the BDiversity class function printD. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -void BDiversity::doBD(vector vec, double cols)//vec = The data vector if the data table was read left-to-right, top-to-bottom. cols = the number of columns in the data table. -{ try { - VecCalc vecCalc; - vector > columns = vecCalc.gen2DVec(vec,cols,1); - - cout.setf(ios_base::fixed, ios_base::floatfield); - cout.precision(6);//This formats the data so the tables look pretty. - - //Whittaker's measure Bw (presence/absence data) - cout << "Whittaker's measure Bw (presence/absence data):\n"; - printD(columns, 1); - double sum = 0; - for(int i = 0; i < cols; i++) - sum += vecCalc.numNZ(columns.at(i)); - double meanRichness = sum/cols; - vector totVec = vecCalc.genTotVec(columns); - double totRichness = vecCalc.numNZ(totVec); - cout << "\nOverall B Diversity = " << totRichness/meanRichness << "\n\n\n";//The overall B Diversity - - //Marczewski-Steinhaus(MS) distance(Jaccard index) (presence/abscence data) - cout << "Marczewski-Steinhaus(MS) distance(Jaccard index) (presence/abscence data):\n"; - printD(columns, 2); - sum = 0; - for(int i = 0; i < cols; i++) - for(int j = 0; j < cols; j++) - if(j > i) - sum += vecCalc.numNZ(columns.at(i))+vecCalc.numNZ(columns.at(j)) - 2*vecCalc.numNZ(vecCalc.multVecs(columns.at(i), columns.at(j))); - cout << "\nOverall B Diversity = " << sum/cols << "\n\n\n";//The overall B Diversity - - //Sorensen quantitative index (abundance data) - cout << "Sorensen quantitative index (abundance data):\n"; - printD(columns, 3); - cout << "\n\n"; - - //Sorensen quantitative index (abundance data) - cout << "Morisita-Horn index (abundance data):\n"; - printD(columns,4); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the BDiversity class Function doBD. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the BDiversity class function doBD. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} - -/***********************************************************************/ -void BrokenStick::doBStick(vector vec)//vec = The data vector. -{ try { - VecCalc vecCalc; - vec = vecCalc.quicksort(vec); - double numInd = vecCalc.sumElements(vec); - double numSpec = vecCalc.numNZ(vec); - vector cObsVec = vecCalc.genCVec(vec); - vector cExpVec; - vec = vecCalc.power(vec, -1); - double sumExp = 0; - for(int i = 0; i < numSpec; i++) - { - double n = 0; - for(int j = i; j < numSpec; j++) - n += 1/(double)(j+1); - - sumExp += numInd/numSpec*n; - cExpVec.push_back(sumExp); - } - - //Statistical analysis - double maxDiff = vecCalc.findMaxDiff(cObsVec, cExpVec); - double DStatistic = maxDiff/numInd; - - cout << "D-Statistic = " << DStatistic << "\n"; - if(vec.size() > 30) - cout << "Critical value for 95% confidence interval = " << .886/sqrt(vec.size()) << "\n"; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the BrokenStick class Function doBStick. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the BrokenStick class function doBStick. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} +double TDTable::getConfLimit(int row, int col) //Rows are the degrees of freedom +{ + //Found on http://www.vgtu.lt/leidiniai/elektroniniai/Probability.pdf/Table%203.pdf -/***********************************************************************/ -double kEq(double k, double spec) -{ - return k/(1-k)*pow(1-k, spec)/(1-pow(1-k, spec)); -} -/***********************************************************************/ -void GeometricSeries::doGeomTest(vector vec)//vec = the data vector -{ try { - VecCalc vecCalc; - vec = vecCalc.quicksort(vec);//Sorts vec - double numInd = vecCalc.sumElements(vec);//numInd = The total number of individuals in the data set. - double numSpec = vecCalc.numNZ(vec);//numSpec = the number of nonzero elements in the data set. - double min = -1.0*vecCalc.findMax(vecCalc.multiply(vec, -1)); - double k = .5; - double step = .49999; - while(fabs(min - numInd*kEq(k, numSpec)) > .0001)//This uses a binary search to find the value of k. - { - if(numInd*kEq(k, numSpec) > min) - k += step; - else - k -= step; - step /= 2; - } - cout << "k = " << k << "\n"; - double cK = 1/(1-pow(1-k, numSpec)); - - vector cObsVec = vecCalc.genCVec(vec); - vector cExpVec; - double sumExp = 0; - for(int i = 0; i < vec.size(); i++) - { - sumExp += numInd*cK*k*pow(1-k, i); - cExpVec.push_back(sumExp); - } - double maxDiff = vecCalc.findMaxDiff(cObsVec, cExpVec); - double DStatistic = maxDiff/numInd; + //Confidence Level .90 .95 .975 .99 .995 .999 .9995 + double values[30][7] = {{3.078, 6.314, 12.706, 31.821, 63.656, 318.289, 636.578}, + {1.886, 2.920, 4.303, 6.965, 9.925, 22.328, 31.600}, + {1.638, 2.353, 3.182, 4.541, 5.841, 10.214, 12.924}, + {1.533, 2.132, 2.776, 3.747, 4.604, 7.173, 8.610}, + {1.476, 2.015, 2.571, 3.365, 4.032, 5.894, 6.869}, + {1.440, 1.943, 2.447, 3.143, 3.707, 5.208, 5.959}, + {1.415, 1.895, 2.365, 2.998, 3.499, 4.785, 5.408}, + {1.397, 1.860, 2.306, 2.896, 3.355, 4.501, 5.041}, + {1.383, 1.833, 2.262, 2.821, 3.250, 4.297, 4.781}, + {1.372, 1.812, 2.228, 2.764, 3.169, 4.144, 4.587}, + {1.363, 1.796, 2.201, 2.718, 3.106, 4.025, 4.437}, + {1.356, 1.782, 2.179, 2.681, 3.055, 3.930, 4.318}, + {1.350, 1.771, 2.160, 2.650, 3.012, 3.852, 4.221}, + {1.345, 1.761, 2.145, 2.624, 2.977, 3.787, 4.140}, + {1.341, 1.753, 2.131, 2.602, 2.947, 3.733, 4.073}, + {1.337, 1.746, 2.120, 2.583, 2.921, 3.686, 4.015}, + {1.333, 1.740, 2.110, 2.567, 2.898, 3.646, 3.965}, + {1.330, 1.734, 2.101, 2.552, 2.878, 3.610, 3.922}, + {1.328, 1.729, 2.093, 2.539, 2.861, 3.579, 3.883}, + {1.325, 1.725, 2.086, 2.528, 2.845, 3.552, 3.850}, + {1.323, 1.721, 2.080, 2.518, 2.831, 3.527, 3.819}, + {1.321, 1.717, 2.074, 2.508, 2.819, 3.505, 3.792}, + {1.319, 1.714, 2.069, 2.500, 2.807, 3.485, 3.768}, + {1.318, 1.711, 2.064, 2.492, 2.797, 3.467, 3.745}, + {1.316, 1.708, 2.060, 2.485, 2.787, 3.450, 3.725}, + {1.315, 1.706, 2.056, 2.479, 2.779, 3.435, 3.707}, + {1.314, 1.703, 2.052, 2.473, 2.771, 3.421, 3.689}, + {1.313, 1.701, 2.048, 2.467, 2.763, 3.408, 3.674}, + {1.311, 1.699, 2.045, 2.462, 2.756, 3.396, 3.660}, + {1.310, 1.697, 2.042, 2.457, 2.750, 3.385, 3.646}}; + + return values[row][col]; - //Statistical Analysis - cout << "D-Statistic = " << DStatistic << "\n"; - if(vec.size() > 30) - cout << "Critical value for 95% confidence interval = " << .886/sqrt(vec.size()) << "\n"; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the GeometricSeries class Function doGeomTest. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the GeometricSeries class function doGeomTest. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } } /***********************************************************************/ -void Jackknifing::doJK(vector vec, double cols)//vec = the data vector if the data table was read left-to-right, top-to-bottom. cols = The number of columns in the data table. -{ try { - VecCalc vecCalc; - SSBPDiversityIndices ssbp; - double rows = vec.size()/cols; - vector > species = vecCalc.gen2DVec(vec, rows, 0);//converts vec into a 2 dimensional vector - vector sumRows; - vector pVals; - for(int i = 0; i < rows; i++) - sumRows.push_back(vecCalc.sumElements(species.at(i))); - double st = 1/ssbp.getSimp(sumRows);//The observed estimate using the Simpson Index. Can be changed to use other indexes of diversity. - for(int i = 0; i < cols; i++) - { - vector newVec; - for(int j = 0; j < rows; j++) - newVec.push_back(vecCalc.sumElements(species.at(j))-species.at(j).at(i)); - pVals.push_back(cols*st-((cols-1)/ssbp.getSimp(newVec))); - } - double mean = vecCalc.mean(pVals); - double stErr = vecCalc.stError(pVals);//stErr = standard error - TDTable table; - double confidence = .95; - double confLimit; - cout << "Confidence Level (.8, .9, .95, .98, .99, .998, .999): "; - cin >> confidence; - double confLevels[] = {.80,.90,.95,.98,.99,.998,.999}; - for(int i = 0; i < 7; i++) - if(confidence == confLevels[i]) - { - confLimit = table.getConfLimit(cols-2,i); - i = 7; - } - //Statistical Analysis - cout << "Lower limit = " << mean - confLimit*stErr << "\n"; - cout << "Upper limit = " << mean + confLimit*stErr << "\n"; - cout << "Observed estimate = " << st << "\n\n"; - cout << "Jackknifed estimate = " << mean << "\n"; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the Jackknifing class Function doJK. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the Jackknifing class function doJK. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -void KS2SampleTest::doKSTest(vector abun1, vector abun2)//abun1 = 1st vector of abundances, abun2 = 2nd vector of abundances -{ try { - VecCalc vecCalc; - double numNZ1 = vecCalc.numNZ(abun1);//Number of nonzero elements in abun1 - double numNZ2 = vecCalc.numNZ(abun2);//Number of nonzero elements in abun2 - abun1 = vecCalc.quicksort(abun1);//Sorts abun1 - abun2 = vecCalc.quicksort(abun2);//Sorts abun2 - abun1 = vecCalc.genRelVec(abun1);//Generates the relative vector for abun1 - abun2 = vecCalc.genRelVec(abun2);//Generates the relative vector for abun2 - - abun1 = vecCalc.genCVec(abun1);//Generates the cumulative vector for abun1 - abun2 = vecCalc.genCVec(abun2);//Generates the cumulative vector for abun2 - - double maxDiff = vecCalc.findMaxDiff(abun1, abun2); - double DStatistic = maxDiff*numNZ1*numNZ2; - - cout << "Null Hypothesis = There is no difference.\n"; - cout << "D-Statistic = " << DStatistic << "\n"; - - double a = pow((numNZ1 + numNZ2)/(numNZ1*numNZ2),.5); - double pVal = exp(-2*pow(maxDiff/a,2)); - - if(numNZ1 > 25 && numNZ2 > 25) //If the sample sizes are both bigger than 25. - cout << "P-Value = " << pVal << "\n\n"; - else - { - cout << "D-Statistic must be higher than the critical value to reject the null hypothesis.\n" ; - cout << "90% Confidence Critical Value = " << 1.22*a*numNZ1*numNZ2 << "\n"; - cout << "95% Confidence Critical Value = " << 1.36*a*numNZ1*numNZ2 << "\n"; - } - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the KS2SampleTest class Function doKSTest. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the KS2SampleTest class function doKSTest. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} - -/***********************************************************************/ -double logS(double num) -{ - return -(1-num)*log(1-num)/num; -} - -/***********************************************************************/ -void LogSD::doLogSD(vector indVec, vector specVec) //indVec = individuals vector, specVec = species vector -{ try { - VecCalc vecCalc; - double numSpec = vecCalc.sumElements(specVec);//numSpec = The total number of species - cout << "number of species = " << numSpec << "\n"; - double numInd = vecCalc.sumElements(vecCalc.multVecs(indVec, specVec)); - double snRatio = numSpec/numInd; - double x = .5; - double step = .4999999999; - while(fabs(snRatio - logS(x)) > .00001) //This uses a binary search to find the value of x. - { - if(logS(x) > snRatio) - x += step; - else - x -= step; - step /= 2; - } - double alpha = numInd*(1-x)/x; - - int ind; - cout << "Number of individuals:"; //Ask the user for the number of individuals. - cin >> ind; - double spec = alpha*pow(x, ind)/ind; - cout << "Number of species expected = " << spec << "\n" << "X value = " << x << "\n" << "Alpha value= " << alpha << "\n";//Outputs the number of species expected with the given number of individuals. - - vector obsSpec; - vector cObsSpec; - vector expSpec; - vector cExpSpec; - vector cDiff; - - // Generates the cumulative observed species vector. - int oct = 1; - double octSumObs = 0; - for(int y = 0; y < specVec.size(); y++) - { - if(indVec.at(y) - .5 < pow(2.0, oct)) - octSumObs += specVec.at(y); - else - { - obsSpec.push_back(octSumObs); - octSumObs = specVec.at(y); - oct++; - } - if(y == specVec.size()-1) - obsSpec.push_back(octSumObs); - } - cObsSpec = vecCalc.genCVec(obsSpec); - cObsSpec = vecCalc.add(cObsSpec,-.5); - - // Generates the cumulative expected species vector. - oct = 1; - double octSumExp = 0; - for(int g = 1; g <= indVec.at(indVec.size()-1); g++) - { - if(g - .5 < pow(2.0, oct)) - octSumExp += alpha*pow(x,g)/(g); - else - { - expSpec.push_back(octSumExp); - octSumExp = alpha*pow(x,g)/(g); - oct++; - } - if(g == indVec.at(indVec.size()-1)) - expSpec.push_back(octSumExp); - } - cExpSpec = vecCalc.genCVec(expSpec); - - // Statistical Analysis - double dTStat = vecCalc.findDStat(cObsSpec, cExpSpec, numSpec); - cout << "D Test Statistic = " << dTStat << "\n"; - cout << ".05 confidence value = " << .89196/sqrt(numSpec) << "\n"; - cout << ".01 confidence value = " << 1.0471/sqrt(numSpec) << "\n\n"; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the LogSD class Function doLogSD. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the LogSD class function doLogSD. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -void QStatistic::doQStat(vector vec)//vec = The data vector. -{ try { - VecCalc vecCalc; - vector cVec = vecCalc.genCSVec(vec); - vector q = vecCalc.findQuartiles(cVec);//q.at(0) is the index of the first quartile; q.at(1) is the index of the second quartile. - vector nDupVec = vecCalc.remDup(vec);//nDupVec only contains one of every unique element in cVec. - double Q; - if(q.at(0) != 0)//The case if neither quartile is 0 or 1 - Q = (.5*(cVec.at(q.at(0))-cVec.at(q.at(0)-1)) + (cVec.at(q.at(1)-1)-cVec.at(q.at(0))) + .5*(cVec.at(q.at(1))-cVec.at(q.at(1)-1)))/log(nDupVec.at(nDupVec.size()-1-q.at(1))/nDupVec.at(nDupVec.size()-1-q.at(0))); - else if(q.at(0) == 0 && (q.at(1) == 0 || q.at(1) == 1))//The case if the quartiles are both at index 0 or one is at 0 and the other at 1. - Q = (.5*cVec.at(0) + .5*(cVec.at(1)-cVec.at(0)))/log(nDupVec.at(nDupVec.size()-2)/nDupVec.at(nDupVec.size()-1)); - else if(q.at(0) == 0 && q.at(1) > 1) //The case if the lower quartile is at index 0 and upper quartile index is above index 1. - Q = (.5*cVec.at(0) + (cVec.at(q.at(1)-1)-cVec.at(q.at(0))) + .5*(cVec.at(q.at(1))-cVec.at(q.at(1)-1)))/log(nDupVec.at(nDupVec.size()-1-q.at(1))/nDupVec.at(nDupVec.size()-1)); - - cout << "Q = " << Q << "\n"; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the QStatistic class Function doQStat. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the QStatistic class function doQStat. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -double SSBPDiversityIndices::getShan(vector vec)//vec = The data vector. -{ try { - VecCalc vecCalc; - double nz = vecCalc.numNZ(vec); - double nSum = vecCalc.sumElements(vec); - double H = 0; - for(int i = 0; i < nz; i++) - H += vec.at(i)/nSum*log(vec.at(i)/nSum); - H *= -1; - return H; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the SSBPDiversityIndices class Function getShan. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the SSBPDiversityIndices class function getShan. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -double SSBPDiversityIndices::getSimp(vector vec)//vec = The data vector. -{ try { - VecCalc vecCalc; - double nSum = vecCalc.sumElements(vec); - double D = 0; - for(int j = 0; j < vec.size(); j++) - D += vec.at(j)*(vec.at(j)-1)/(nSum*(nSum-1)); - return D; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the SSBPDiversityIndices class Function getSimp. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the SSBPDiversityIndices class function getSimp. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -double SSBPDiversityIndices::getBP(vector vec)//vec = The data vector. -{ try { - VecCalc vecCalc; - double nSum = vecCalc.sumElements(vec); - return vecCalc.findMax(vec)/nSum; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the SSBPDiversityIndices class Function getBP. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the SSBPDiversityIndices class function getBP. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -void SSBPDiversityIndices::doSSBP(vector vec)//vec = The data vector. -{ try { - VecCalc vecCalc; - double nz = vecCalc.numNZ(vec); - - //Shannon index - double H = getShan(vec); - cout << "H = " << H << "\n"; - cout << "Eveness = " << H/log(nz) << "\n\n"; - - //Simpson index - double D = getSimp(vec); - cout << "D diversity = " << 1/D << "\n"; - cout << "Eveness = " << 1/D/nz << "\n\n"; - - //Berger-Parker index - double BP = getBP(vec); - cout << "BP index = " << BP << "\n\n"; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the SSBPDiversityIndices class Function doSSBP. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the SSBPDiversityIndices class function doSSBP. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/***********************************************************************/ -double TDTable::getConfLimit(int row, int col) //Rows are the degrees of freedom -{ try { - //Confidence Level .80 .90 .95 .98 .99 .998 .999 - double values[33][7] = {{3.078, 6.314, 12.706, 31.821, 63.656, 318.289, 636.578}, - {1.886, 2.920, 4.303, 6.965, 9.925, 22.328, 31.600}, - {1.638, 2.353, 3.182, 4.541, 5.841, 10.214, 12.924}, - {1.533, 2.132, 2.776, 3.747, 4.604, 7.173, 8.610}, - {1.476, 2.015, 2.571, 3.365, 4.032, 5.894, 6.869}, - {1.440, 1.943, 2.447, 3.143, 3.707, 5.208, 5.959}, - {1.415, 1.895, 2.365, 2.998, 3.499, 4.785, 5.408}, - {1.397, 1.860, 2.306, 2.896, 3.355, 4.501, 5.041}, - {1.383, 1.833, 2.262, 2.821, 3.250, 4.297, 4.781}, - {1.372, 1.812, 2.228, 2.764, 3.169, 4.144, 4.587}, - {1.363, 1.796, 2.201, 2.718, 3.106, 4.025, 4.437}, - {1.356, 1.782, 2.179, 2.681, 3.055, 3.930, 4.318}, - {1.350, 1.771, 2.160, 2.650, 3.012, 3.852, 4.221}, - {1.345, 1.761, 2.145, 2.624, 2.977, 3.787, 4.140}, - {1.341, 1.753, 2.131, 2.602, 2.947, 3.733, 4.073}, - {1.337, 1.746, 2.120, 2.583, 2.921, 3.686, 4.015}, - {1.333, 1.740, 2.110, 2.567, 2.898, 3.646, 3.965}, - {1.330, 1.734, 2.101, 2.552, 2.878, 3.610, 3.922}, - {1.328, 1.729, 2.093, 2.539, 2.861, 3.579, 3.883}, - {1.325, 1.725, 2.086, 2.528, 2.845, 3.552, 3.850}, - {1.323, 1.721, 2.080, 2.518, 2.831, 3.527, 3.819}, - {1.321, 1.717, 2.074, 2.508, 2.819, 3.505, 3.792}, - {1.319, 1.714, 2.069, 2.500, 2.807, 3.485, 3.768}, - {1.318, 1.711, 2.064, 2.492, 2.797, 3.467, 3.745}, - {1.316, 1.708, 2.060, 2.485, 2.787, 3.450, 3.725}, - {1.315, 1.706, 2.056, 2.479, 2.779, 3.435, 3.707}, - {1.314, 1.703, 2.052, 2.473, 2.771, 3.421, 3.689}, - {1.313, 1.701, 2.048, 2.467, 2.763, 3.408, 3.674}, - {1.311, 1.699, 2.045, 2.462, 2.756, 3.396, 3.660}, - {1.310, 1.697, 2.042, 2.457, 2.750, 3.385, 3.646}, - {1.296, 1.671, 2.000, 2.390, 2.660, 3.232, 3.460}, - {1.289, 1.658, 1.980, 2.358, 2.617, 3.160, 3.373}, - {1.282, 1.645, 1.960, 2.326, 2.576, 3.091, 3.291}}; - return values[row][col]; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the TDTable class Function getConfLimit. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the TDTable class function getConfLimit. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} -/*********************************************************************** -void TrunLN::doTrunLN(vector indVec, vector specVec) //indVec = individuals vector, specVec = species vector -{ - VecCalc vecCalc; - double numSpec = vecCalc.sumElements(specVec); //numSpec = The total number of species - double numInd = vecCalc.sumElements(vecCalc.multVecs(indVec,specVec)); //numInd = The total number of individuals - - double obsMean = 0; - for(int i = 0; i < indVec.size(); i++) - obsMean += log10(indVec.at(i)); - obsMean /= numSpec; //obsMean = observed mean of the individuals vector - cout << "obsMean = " << obsMean << "\n"; - double variance = 0; - for(int t = 0; t < indVec.size(); t++) - variance += pow(log10(indVec.at(t))-obsMean,2)/numSpec; - - double rO = 0; - for(int k = 0; k < indVec.size(); k++) - rO += log10(indVec.at(k)); - rO /= indVec.size(); - double veilLine = .5;//The desired veil line. - double auxFunc = -(obsMean-rO)/(obsMean-log10(veilLine)); - double uX = obsMean-auxFunc*(obsMean-log10(veilLine)); - double vX = variance + auxFunc*pow(obsMean-log10(veilLine),2); - double z = (log10(veilLine)-uX)/pow(vX, .5); - double p = .5*(erf(z)+1); - double specRichness = numSpec/(1-p); - - double numUnseen = .5*(erf((log10(.5)-uX)/pow(vX,.5))+1)*specRichness; - - - vector cExp; - for(int i = 1; i < 8; i++) - { - double a = pow(10, i-1)+.5; - double b = log10(a); - double c = (b - uX)/pow(vX,.5); - double d = .5*(erf(c)+1); - double numS = d*specRichness; - double toPush = numS - numUnseen; - cExp.push_back(toPush); - } - vector cObs; - double sumOct = 0; - for(int i = 0; i < 8; i++) - { - sumOct = 0; - for(int r = 0; r < indVec.size(); r++) - { - if(indVec.at(r) < pow(10, i-1)+.5) - sumOct += specVec.at(r); - else - { - cObs.push_back(sumOct); - sumOct = specVec.at(r); - r = indVec.size(); - } - if(r == indVec.size()-1) - cObs.push_back(sumOct); - } - } - - //Statistical Analysis - double d = vecCalc.findDStat(cExp, cObs, numSpec); - cout << "DStat = " << d << "\n"; - cout << ".05 confidence value = " << .89196/sqrt(numSpec) << "\n"; - cout << ".01 confidence value = " << 1.0471/sqrt(numSpec) << "\n\n"; -} -/***********************************************************************/