if (shared[1]->getAbundance(i) != 0) { nonZeroB++; }
}
- double totalTerm = 1 / (float) totalGroups;
double sum = 0.0;
for (int i = 0; i < shared[0]->getNumBins(); i++) {
int A = shared[0]->getAbundance(i);
double Aterm = A / (float) nonZeroA;
double Bterm = B / (float) nonZeroB;
+
+ int incidence = 0;
+ for(int j=0;j<shared.size();j++){
+ if(shared[j]->getAbundance(i) != 0){ incidence++; }
+ }
- sum += (totalTerm * ((Aterm-Bterm)*(Aterm-Bterm)));
+ if(incidence != 0){
+ sum += (((Aterm-Bterm)*(Aterm-Bterm))/incidence);
+ }
}
- data[0] = sqrt((totalOtus * sum));
+ data[0] = sqrt(totalOtus * sum);
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
denomTerm2 = sqrt(denomTerm2);
double denom = denomTerm1 * denomTerm2;
-
+
if (denom != 0) {
- data[0] = 1.0 - (numTerm / denom);
+ data[0] = (numTerm / denom);
}else {
data[0] = 1.0;
}
if ((tempA != 0) && (tempB != 0)) { S12++; }
}
- data[0] = S12 / ((float)((2 * S1) + (2 * S2) - (3 * S12)));
+ data[0] = 1.0 - S12 / ((float)((2 * S1) + (2 * S2) - (3 * S12)));
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
else { sumSharedAB += tempB; }
}
- data[0] = (2 * sumSharedAB) / (float)( sumSharedA + sumSharedB);
+ data[0] = 1.0 - (2 * sumSharedAB) / (float)( sumSharedA + sumSharedB);
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
UVest = uv->getUVest(shared);
//UVest[0] is Uest UVest[1] is Vest
- data[0] = (UVest[0] * UVest[1]) / ((float)(UVest[0] + UVest[1] - (UVest[0] * UVest[1])));
- if(data[0] > 1){data[0] = 1; }
+ data[0] = 1.0-(UVest[0] * UVest[1]) / ((float)(UVest[0] + UVest[1] - (UVest[0] * UVest[1])));
+ if(data[0] > 1){data[0] = 0; }
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
return data;
if ((tempA != 0) && (tempB != 0)) { S12++; }
}
- data[0] = S12 / (float)(S1 + S2 - S12);
+ data[0] = 1.0 - S12 / (float)(S1 + S2 - S12);
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
S1 = chaoS1->getValues(chaoS1Sabund);
S2 = chaoS2->getValues(chaoS2Sabund);
- data[0] = S12[0] / (float)(S1[0] + S2[0] - S12[0]);
+ data[0] = 1.0 - S12[0] / (float)(S1[0] + S2[0] - S12[0]);
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
if ((tempA != 0) && (tempB != 0)) { S12++; }
}
- data[0] = S12 / (float)(S1 + S2 - (2 * S12));
+ data[0] = 1.0 - S12 / (float)(S1 + S2 - (2 * S12));
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
if ((tempA != 0) && (tempB != 0)) { S12++; }
}
- data[0] = 0.5 * ((S12 / (float)S1) + (S12 / (float)S2));
+ data[0] = 1.0 - 0.5 * ((S12 / (float)S1) + (S12 / (float)S2));
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
if (tempA < tempB) { min = tempA; }
else { min = tempB; }
- data[0] = S12 / (float)(S12 + min);
+ data[0] = 1.0 - S12 / (float)(S12 + min);
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
d += relA * relB;
}
- morhorn = (2 * d) / (a + b);
+ morhorn = 1- (2 * d) / (a + b);
- if (isnan(morhorn) || isinf(morhorn)) { morhorn = 0; }
+ if (isnan(morhorn) || isinf(morhorn)) { morhorn = 1; }
data[0] = morhorn;
data[0] = (2 * UVest[0] * UVest[1]) / ((float)(UVest[0] + UVest[1]));
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
+ data[0] = 1-data[0];
return data;
}
if ((tempA != 0) && (tempB != 0)) { S12++; }
}
- data[0] = (2 * S12) / (float)(S1 + S2);
+ data[0] = 1.0-(2 * S12) / (float)(S1 + S2);
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
S1 = chaoS1->getValues(chaoS1Sabund);
S2 = chaoS2->getValues(chaoS2Sabund);
- data[0] = (2 * S12[0]) / (float)(S1[0] + S2[0]);
+ data[0] = 1.0-(2 * S12[0]) / (float)(S1[0] + S2[0]);
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
if (isnan(thetaN) || isinf(thetaN)) { thetaN = 0; }
- data[0] = thetaN;
+ data[0] = 1.0 - thetaN;
return data;
}
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) {
#include "spearman.h"
/***********************************************************************/
+
EstOutput Spearman::getValues(vector<SharedRAbundVector*> shared) {
try {
data.resize(1,0);
double sumRanks = 0.0;
int numOTUS = shared[0]->getNumBins();
- //calc the 2 denominators
- for (int i = 0; i < shared[0]->getNumBins(); i++) {
+ vector<double> rankVectorA(savA.getMaxRank()+1, 0);
+ int currentRankA = 0;
+ for(int i=savA.getMaxRank();i>0;i--){
+ int numWithAbundanceI = savA.get(i);
+
+ if(numWithAbundanceI > 1){ rankVectorA[i] = (currentRankA + 1 + currentRankA + numWithAbundanceI) / 2.0; }
+ else { rankVectorA[i] = currentRankA+numWithAbundanceI; }
+ currentRankA += numWithAbundanceI;
+ }
+ rankVectorA[0] = (numOTUS + currentRankA + 1) / 2.0;
+
+
+ vector<double> rankVectorB(savB.getMaxRank()+1, 0);
+ int currentRankB = 0;
+ for(int i=savB.getMaxRank();i>0;i--){
+ int numWithAbundanceI = savB.get(i);
+ if(numWithAbundanceI > 1){ rankVectorB[i] = (currentRankB + 1 + currentRankB + numWithAbundanceI) / 2.0; }
+ else { rankVectorB[i] = currentRankB+numWithAbundanceI; }
+ currentRankB += numWithAbundanceI;
+ }
+ rankVectorB[0] = (numOTUS + currentRankB + 1) / 2.0;
+
+
+
+ for (int i = 0; i < shared[0]->getNumBins(); i++) {
int Aij = shared[0]->getAbundance(i);
int Bij = shared[1]->getAbundance(i);
- int rankA = savA.get(Aij);
- int rankB = savB.get(Bij);
+ float rankA = rankVectorA[Aij];
+ float rankB = rankVectorB[Bij];
sumRanks += ((rankA - rankB) * (rankA - rankB));
}
-
- data[0] = 1.0 - ((6 * sumRanks) / (float) (numOTUS * (numOTUS-1)));
+ data[0] = 1.0 - ((6 * sumRanks) / (float) (numOTUS * ((numOTUS*numOTUS)-1)));
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
return data;
}
catch(exception& e) {
- m->errorOut(e, "Soergel", "getValues");
+ m->errorOut(e, "Spearman", "getValues");
exit(1);
}
}
+
/***********************************************************************/
double denom = denomTerm1 * denomTerm2;
- data[0] = 1.0 - (numTerm / denom);
+ data[0] = (numTerm / denom);
if (isnan(data[0]) || isinf(data[0])) { data[0] = 0; }
if(shared[1]->getAbundance(i) != 0){ countB++; }
}
- data[0] = 2*sTotal/(float)(countA+countB)-1;
+ data[0] = 2-2*sTotal/(float)(countA+countB);
return data;
}
catch(exception& e) {