X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=sharedthetayc.cpp;fp=sharedthetayc.cpp;h=6c0f6c7f91bf46bf314c7e16cfcf6997bed4f388;hb=0caf3fbabaa3ece404f8ce77f4c883dc5b1bf1dc;hp=0000000000000000000000000000000000000000;hpb=1b73ff67c83892a025e597dabd9df6fe7b58206a;p=mothur.git diff --git a/sharedthetayc.cpp b/sharedthetayc.cpp new file mode 100644 index 0000000..6c0f6c7 --- /dev/null +++ b/sharedthetayc.cpp @@ -0,0 +1,86 @@ +/* + * sharedthetayc.cpp + * Dotur + * + * Created by Sarah Westcott on 1/8/09. + * Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved. + * + */ + +#include "sharedthetayc.h" + +/***********************************************************************/ +EstOutput ThetaYC::getValues(vector shared) { + try { + data.resize(3,0.0000); + + 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 < shared[0]->getNumBins(); i++) { + //store in temps to avoid multiple repetitive function calls + Atotal += (double)shared[0]->getAbundance(i); + Btotal += (double)shared[1]->getAbundance(i); + } + + //calculate the theta denominator sums + for (int j = 0; j < shared[0]->getNumBins(); j++) { + //store in temps to avoid multiple repetitive function calls + pi = shared[0]->getAbundance(j) / Atotal; + qi = shared[1]->getAbundance(j) / Btotal; + + a += pi * pi; + b += qi * qi; + d += pi * qi; + + sumPcubed += pi * pi * pi; + sumQcubed += qi * qi * qi; + sumPQsq += pi * qi * qi; + sumPsqQ += pi * pi * qi; + } + + 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]; + return data; + } + catch(exception& e) { + m->errorOut(e, "ThetaYC", "getValues"); + exit(1); + } +} + +/***********************************************************************/