#include #include #include #include #include #include #include #include #include #include #include #include #include "util.h" #include // Single trait, fixed effects models using namespace std; class TermData{ public: double value; unsigned level; }; class DataNode{ public: vector trmVec; double depVar; }; class MME; class ModelTerm{ public: unsigned start; string name; static MME *myMMEPtr; Recoder myRecoder; vector factors; unsigned code(string str){return myRecoder.code(str);} unsigned nLevels(){return myRecoder.size();} string getTermString(); unsigned getTermLevel (){ return code(getTermString()); } double getTermValue (); }; class MME { public: string fileName; Tokenizer colType; Tokenizer colName; Tokenizer colData; unsigned numCols; unsigned depCol; vector modelTrmVec; vector dataVec; unsigned numTerms; unsigned mmeSize; matvec::doubleMatrix lhs; matvec::Vector rhs, sol; void putColNames(string str); void putColTypes(string str); void inputData(); void displayData(); static double getDouble(string& Str); void calcStarts(); void getSolution(); void calcWPW(); void display(); }; string ModelTerm::getTermString(){ unsigned numFactors = factors.size(); string trmStr; unsigned factorIndex = factors[0]; if(myMMEPtr->colType[factorIndex]=="COV"){ trmStr = myMMEPtr->colName[factorIndex]; } else { trmStr = myMMEPtr->colData[factorIndex]; } for (unsigned i=1;icolType[factorIndex]=="COV"){ trmStr += "*" + myMMEPtr->colName[factorIndex]; } else{ trmStr += "*" + myMMEPtr->colData[factorIndex]; } } return trmStr; } double ModelTerm::getTermValue(){ unsigned numFactors = factors.size(); double value = 1.0; for (unsigned i=0;icolType[factorIndex]=="COV"){ string covStr = myMMEPtr->colData[factorIndex]; value *= MME::getDouble(covStr); } } return value; } void MME::putColNames(string str){ string sep(" "); colName.getTokens(str,sep); numCols = colName.size(); } void MME::putColTypes(string str){ string sep(" "); colType.getTokens(str,sep); if (numCols!=colType.size()){ cerr <<"number of column names and column types do not match\n"; exit (-1); } for (unsigned i=0;i> val; return val; } void MME::calcStarts(){ modelTrmVec[0].start = 0; for (unsigned i=1;i::iterator it; for (it=modelTrmVec[i].myRecoder.begin(); it!=modelTrmVec[i].myRecoder.end();it++){ unsigned ii = modelTrmVec[i].start + it->second - 1; cout << setw(10) << it->first << " " << sol[ii] << endl; } } } MME* ModelTerm::myMMEPtr; int main() { try{ matvec::SESSION.initialize("matvec_trash"); MME mme; ModelTerm::myMMEPtr = &mme; mme.fileName = "Data/twoway.dat"; mme.putColNames("A B y"); mme.putColTypes("CLASS CLASS DEP"); ModelTerm mterm; mterm.name = "A"; mterm.factors.resize(1); mterm.factors[0] = 0; mme.modelTrmVec.push_back(mterm); mterm.name = "B"; mterm.factors[0] = 1; mme.modelTrmVec.push_back(mterm); mterm.name = "A*B"; mterm.factors.resize(2); mterm.factors[0] = 0; mterm.factors[1] = 1; mme.modelTrmVec.push_back(mterm); mme.getSolution(); mme.display(); getch(); } catch (matvec::exception &ex) { cerr << ex.what() << "\n"; exit(1); } catch (...) { cerr << "other exceptions were caught\n"; exit(1); } }