1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
/*
* uvest.cpp
* Dotur
*
* Created by Sarah Westcott on 1/8/09.
* Copyright 2009 Schloss Lab UMASS Amherst. All rights reserved.
*
*/
#include "uvest.h"
/***********************************************************************/
//This is used by SharedJAbund and SharedSorAbund
EstOutput UVEst::getUVest(vector<SharedRAbundVector*> shared) {
try {
EstOutput results;
results.resize(2,0);
int S12, Atotal, Btotal, f1A, f2A, f1B, f2B, sumSharedA, sumSharedB, sumSharedA1, sumSharedB1, tempA, tempB;
S12 = 0; Atotal = 0; Btotal = 0; f1A = 0; f2A = 0; f1B = 0; f2B = 0; sumSharedA = 0; sumSharedB = 0; sumSharedA1 = 0; sumSharedB1 = 0;
float Upart1, Upart2, Upart3, Vpart1, Vpart2, Vpart3, Uest, Vest;
Upart1 = 0.0; Upart2 = 0.0; Upart3 = 0.0; Vpart1 = 0.0; Vpart2 = 0.0; Vpart3 = 0.0;
/*Xi, Yi = abundance of the ith shared OTU in A and B
ntotal, mtotal = total number of sequences sampled in A and B
I(•) = if the argument, •, is true then I(•) is 1; otherwise it is 0.
sumSharedA = the sum of all shared otus in A
sumSharedB = the sum of all shared otus in B
sumSharedA1 = the sum of all shared otus in A where B = 1
sumSharedB1 = the sum of all shared otus in B where A = 1 */
for (int i = 0; i < shared[0]->getNumBins(); i++) {
//store in temps to avoid multiple repetitive function calls
tempA = shared[0]->getAbundance(i);
tempB = shared[1]->getAbundance(i);
Atotal += tempA;
Btotal += tempB;
if ((tempA != 0) && (tempB != 0)) {//they are shared
sumSharedA += tempA;
sumSharedB += tempB;
//does A have one or two
if (tempA == 1) { f1A++; sumSharedB1 += tempB;}
else if (tempA == 2) { f2A++; }
//does B have one or two
if (tempB == 1) { f1B++; sumSharedA1 += tempA;}
else if (tempB == 2) { f2B++; }
}
}
Upart1 = sumSharedA / (float) Atotal;
Upart2 = ((Btotal - 1) * f1B) / (float) (Btotal * 2 * f2B);
Upart3 = sumSharedA1 / (float) Atotal;
if (isnan(Upart1) || isinf(Upart1)) { Upart1 = 0; }
if (isnan(Upart2) || isinf(Upart2)) { Upart2 = 0; }
if (isnan(Upart3) || isinf(Upart3)) { Upart3 = 0; }
Uest = Upart1 + (Upart2 * Upart3);
Vpart1 = sumSharedB / (float) Btotal;
Vpart2 = ((Atotal - 1) * f1A) / (float) (Atotal * 2 * f2A);
Vpart3 = sumSharedB1 / (float) Btotal;
if (isnan(Vpart1) || isinf(Vpart1)) { Vpart1 = 0; }
if (isnan(Vpart2) || isinf(Vpart2)) { Vpart2 = 0; }
if (isnan(Vpart3) || isinf(Vpart3)) { Vpart3 = 0; }
Vest = Vpart1 + (Vpart2 * Vpart3);
if (Uest > 1) { Uest = 1; }
if (Vest > 1) { Vest = 1; }
results[0] = Uest;
results[1] = Vest;
return results;
}
catch(exception& e) {
m->errorOut(e, "UVEst", "getUVest");
exit(1);
}
}
/***********************************************************************/
|