X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=sharedthetayc.cpp;h=864c6e63712cdc78d2cc0320ff2869c6deff196f;hp=ad2e1c574302b678f9d503dc235ef3b5a6b38db2;hb=b206f634aae1b4ce13978d203247fb64757d5482;hpb=25cde7ff05bbe741da1712f2c740e0bc8706e523 diff --git a/sharedthetayc.cpp b/sharedthetayc.cpp index ad2e1c5..864c6e6 100644 --- a/sharedthetayc.cpp +++ b/sharedthetayc.cpp @@ -10,55 +10,81 @@ #include "sharedthetayc.h" /***********************************************************************/ -EstOutput SharedThetaYC::getValues(SharedRAbundVector* shared1, SharedRAbundVector* shared2) { +EstOutput ThetaYC::getValues(vector shared) { try { - data.resize(1,0); + data.resize(3,0.0000); - int Atotal, Btotal, tempA, tempB; - Atotal = 0; Btotal = 0; - float thetaYC, sumSharedA, sumSharedB, a, b, d; - thetaYC = 0.0; sumSharedA = 0.0; sumSharedB = 0.0; a = 0.0; b = 0.0; d = 0.0; + double Atotal = 0; + double Btotal = 0; + double thetaYC = 0; + double pi = 0; + double qi = 0; + double a = 0; + double b = 0; + double d = 0; + + double sumPcubed = 0; + double sumQcubed = 0; + double sumPQsq = 0; + double sumPsqQ = 0; //get the total values we need to calculate the theta denominator sums - for (int i = 0; i < shared1->size(); i++) { + for (int i = 0; i < shared[0]->getNumBins(); i++) { //store in temps to avoid multiple repetitive function calls - Atotal += shared1->getAbundance(i); - Btotal += shared2->getAbundance(i); + Atotal += (double)shared[0]->getAbundance(i); + Btotal += (double)shared[1]->getAbundance(i); } //calculate the theta denominator sums - for (int j = 0; j < shared1->size(); j++) { + for (int j = 0; j < shared[0]->getNumBins(); j++) { //store in temps to avoid multiple repetitive function calls - tempA = shared1->getAbundance(j); - tempB = shared2->getAbundance(j); - - //they are shared - if ((tempA != 0) && (tempB != 0)) { - if (Atotal != 0) { sumSharedA = (tempA / (float)Atotal); } - if (Btotal != 0) { sumSharedB = (tempB / (float)Btotal); } + pi = shared[0]->getAbundance(j) / Atotal; + qi = shared[1]->getAbundance(j) / Btotal; + + a += pi * pi; + b += qi * qi; + d += pi * qi; - a += sumSharedA * sumSharedA; - b += sumSharedB * sumSharedB; - d += sumSharedA * sumSharedB; - } + sumPcubed += pi * pi * pi; + sumQcubed += qi * qi * qi; + sumPQsq += pi * qi * qi; + sumPsqQ += pi * pi * qi; } - thetaYC = d / (float) (a + b - d); + thetaYC = d / (a + b - d); if (isnan(thetaYC) || isinf(thetaYC)) { thetaYC = 0; } + double varA = 4 / Atotal * (sumPcubed - a * a); + double varB = 4 / Btotal * (sumQcubed - b * b); + double varD = sumPQsq / Atotal + sumPsqQ / Btotal - d * d * (1/Atotal + 1/Btotal); + double covAD = 2 / Atotal * (sumPsqQ - a * d); + double covBD = 2 / Btotal * (sumPQsq - b* d); + + double varT = d * d * (varA + varB) / pow(a + b - d, (double)4.0) + pow(a+b, (double)2.0) * varD / pow(a+b-d, (double)4.0) + - 2.0 * (a + b) * d / pow(a + b - d, (double)4.0) * (covAD + covBD); + + double ci = 1.95 * sqrt(varT); + data[0] = thetaYC; + data[1] = thetaYC - ci; + data[2] = thetaYC + ci; + + if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; } + if (isnan(data[1]) || isinf(data[1])) { data[1] = 0; } + if (isnan(data[2]) || isinf(data[2])) { data[2] = 0; } + data[0] = 1.0 - data[0]; + double hold = data[1]; + data[1] = 1.0 - data[2]; + data[2] = 1.0 - hold; + return data; } catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the SharedThetaYC class Function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + m->errorOut(e, "ThetaYC", "getValues"); exit(1); } - catch(...) { - cout << "An unknown error has occurred in the SharedThetaYC class Function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } } /***********************************************************************/