double HomovaCommand::runHOMOVA(ofstream& HOMOVAFile, map<string, vector<int> > groupSampleMap, double alpha){ try { map<string, vector<int> >::iterator it; int numGroups = groupSampleMap.size(); vector<double> ssWithinOrigVector; double bValueOrig = calcBValue(groupSampleMap, ssWithinOrigVector); double counter = 0; for(int i=0;i<iters;i++){ vector<double> ssWithinRandVector; map<string, vector<int> > randomizedGroup = getRandomizedGroups(groupSampleMap); double bValueRand = calcBValue(randomizedGroup, ssWithinRandVector); if(bValueRand >= bValueOrig){ counter++; } } double pValue = (double) counter / (double) iters; string pString = ""; if(pValue < 1/(double)iters){ pString = '<' + toString(1/(double)iters); } else { pString = toString(pValue); } //print homova table it = groupSampleMap.begin(); HOMOVAFile << it->first; m->mothurOut(it->first); it++; for(;it!=groupSampleMap.end();it++){ HOMOVAFile << '-' << it->first; m->mothurOut('-' + it->first); } HOMOVAFile << '\t' << bValueOrig << '\t' << pString; m->mothurOut('\t' + toString(bValueOrig) + '\t' + pString); if(pValue < alpha){ HOMOVAFile << "*"; m->mothurOut("*"); } for(int i=0;i<numGroups;i++){ HOMOVAFile << '\t' << ssWithinOrigVector[i]; m->mothurOut('\t' + toString(ssWithinOrigVector[i])); } HOMOVAFile << endl; m->mothurOutEndLine(); return pValue; } catch(exception& e) { m->errorOut(e, "HomovaCommand", "runHOMOVA"); exit(1); } }
double AnosimCommand::runANOSIM(ofstream& ANOSIMFile, vector<vector<double> > dMatrix, map<string, vector<int> > groupSampleMap, double alpha) { try { vector<vector<double> > rankMatrix = convertToRanks(dMatrix); double RValue = calcR(rankMatrix, groupSampleMap); int pCount = 0; for(int i=0;i<iters;i++){ map<string, vector<int> > randGroupSampleMap = getRandomizedGroups(groupSampleMap); double RValueRand = calcR(rankMatrix, randGroupSampleMap); if(RValue <= RValueRand){ pCount++; } } double pValue = (double)pCount / (double) iters; string pString = ""; if(pValue < 1/(double)iters){ pString = '<' + toString(1/(double)iters); } else { pString = toString(pValue); } map<string, vector<int> >::iterator it=groupSampleMap.begin(); m->mothurOut(it->first); ANOSIMFile << it->first; it++; for(it;it!=groupSampleMap.end();it++){ m->mothurOut('-' + it->first); ANOSIMFile << '-' << it->first; } m->mothurOut('\t' + toString(RValue) + '\t' + pString); ANOSIMFile << '\t' << RValue << '\t' << pString; if(pValue < alpha){ ANOSIMFile << "*"; m->mothurOut("*"); } ANOSIMFile << endl; m->mothurOutEndLine(); return pValue; } catch(exception& e) { m->errorOut(e, "AnosimCommand", "calcAnisom"); exit(1); } }
double AmovaCommand::runAMOVA(ofstream& AMOVAFile, map<string, vector<int> > groupSampleMap, double alpha) { try { map<string, vector<int> >::iterator it; int numGroups = groupSampleMap.size(); int totalNumSamples = 0; for(it = groupSampleMap.begin();it!=groupSampleMap.end();it++){ totalNumSamples += it->second.size(); } double ssTotalOrig = calcSSTotal(groupSampleMap); double ssWithinOrig = calcSSWithin(groupSampleMap); double ssAmongOrig = ssTotalOrig - ssWithinOrig; double counter = 0; for(int i=0;i<iters;i++){ map<string, vector<int> > randomizedGroup = getRandomizedGroups(groupSampleMap); double ssWithinRand = calcSSWithin(randomizedGroup); if(ssWithinRand < ssWithinOrig){ counter++; } } double pValue = (double)counter / (double) iters; string pString = ""; if(pValue < 1/(double)iters){ pString = '<' + toString(1/(double)iters); } else { pString = toString(pValue); } //print anova table it = groupSampleMap.begin(); AMOVAFile << it->first; m->mothurOut(it->first); it++; for(it;it!=groupSampleMap.end();it++){ AMOVAFile << '-' << it->first; m->mothurOut('-' + it->first); } AMOVAFile << "\tAmong\tWithin\tTotal" << endl; m->mothurOut("\tAmong\tWithin\tTotal\n"); AMOVAFile << "SS\t" << ssAmongOrig << '\t' << ssWithinOrig << '\t' << ssTotalOrig << endl; m->mothurOut("SS\t" + toString(ssAmongOrig) + '\t' + toString(ssWithinOrig) + '\t' + toString(ssTotalOrig) + '\n'); int dfAmong = numGroups - 1; double MSAmong = ssAmongOrig / (double) dfAmong; int dfWithin = totalNumSamples - numGroups; double MSWithin = ssWithinOrig / (double) dfWithin; int dfTotal = totalNumSamples - 1; double Fs = MSAmong / MSWithin; AMOVAFile << "df\t" << dfAmong << '\t' << dfWithin << '\t' << dfTotal << endl; m->mothurOut("df\t" + toString(dfAmong) + '\t' + toString(dfWithin) + '\t' + toString(dfTotal) + '\n'); AMOVAFile << "MS\t" << MSAmong << '\t' << MSWithin << endl << endl; m->mothurOut("MS\t" + toString(MSAmong) + '\t' + toString(MSWithin) + "\n\n"); AMOVAFile << "Fs:\t" << Fs << endl; m->mothurOut("Fs:\t" + toString(Fs) + '\n'); AMOVAFile << "p-value: " << pString; m->mothurOut("p-value: " + pString); if(pValue < alpha){ AMOVAFile << "*"; m->mothurOut("*"); } AMOVAFile << endl << endl; m->mothurOutEndLine();m->mothurOutEndLine(); return pValue; } catch(exception& e) { m->errorOut(e, "AmovaCommand", "runAMOVA"); exit(1); } }