#include "sharedthetayc.h"
/***********************************************************************/
-EstOutput SharedThetaYC::getValues(SharedRAbundVector* shared1, SharedRAbundVector* shared2) {
+EstOutput ThetaYC::getValues(vector<SharedRAbundVector*> 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;
+ float Atotal = 0;
+ float Btotal = 0;
+ float thetaYC = 0;
+ float pi = 0;
+ float qi = 0;
+ float a = 0;
+ float b = 0;
+ float d = 0;
+
+ float sumPcubed = 0;
+ float sumQcubed = 0;
+ float sumPQsq = 0;
+ float 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]->size(); i++) {
//store in temps to avoid multiple repetitive function calls
- Atotal += shared1->getAbundance(i);
- Btotal += shared2->getAbundance(i);
+ Atotal += (float)shared[0]->getAbundance(i);
+ Btotal += (float)shared[1]->getAbundance(i);
}
//calculate the theta denominator sums
- for (int j = 0; j < shared1->size(); j++) {
+ for (int j = 0; j < shared[0]->size(); 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; }
+ float varA = 4 / Atotal * (sumPcubed - a * a);
+ float varB = 4 / Btotal * (sumQcubed - b * b);
+ float varD = sumPQsq / Atotal + sumPsqQ / Btotal - d * d * (1/Atotal + 1/Btotal);
+ float covAD = 2 / Atotal * (sumPsqQ - a * d);
+ float covBD = 2 / Btotal * (sumPQsq - b* d);
+
+ float varT = d * d * (varA + varB) / pow(a + b - d, (float)4.0) + pow(a+b, (float)2.0) * varD / pow(a+b-d, (float)4.0)
+ - 2.0 * (a + b) * d / pow(a + b - d, (float)4.0) * (covAD + covBD);
+
+ float 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; }
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);
- }
}
/***********************************************************************/