parameters::parameters(datafile dat, model nv_mod, model ref_mod,parameters ref_param,int compo,int iter){ const MatrixXi & omega=nv_mod.Get_model(),ref_omega=ref_mod.Get_model(),mat=dat.Get_mat_datafile(); const int g=omega.rows(),unique=mat.rows(); m_proba=ref_param.m_proba; m_proba_block.resize(g); m_param.resize(g); for (int k=0;k<g;k++){ if (k!=compo){ m_param[k].resize(omega.rowwise().maxCoeff()(k)+1); m_param[k]=ref_param.m_param[k]; m_proba_block[k].resize(unique,omega.rowwise().maxCoeff()(k)+1); m_proba_block[k]=ref_param.m_proba_block[k]; for (int b=0;b<(omega.rowwise().maxCoeff()(k)+1) ;b++){ if ((omega.row(k).array()==b).any()){ m_param[k][b]=ref_param.m_param[k][b]; } } }else{ m_param[k].resize(omega.rowwise().maxCoeff()(k)+1); m_proba_block[k].resize(unique,omega.rowwise().maxCoeff()(k)+1); for (int b=0;b<(omega.rowwise().maxCoeff()(k)+1) ;b++){ if ((omega.row(k).array()==b).any()){ if ((((omega.row(k).array()==b)==(ref_omega.row(k).array()==b)).prod())==1){ m_param[k][b]=ref_param.m_param[k][b]; }else{ m_param[k][b]=param_block(k,b,dat,nv_mod,m_proba.col(k).array()/m_proba.rowwise().sum().array(),1); if ((omega.row(k).array()==b).count()>1){ int prem=0; while(omega(k,prem)!=b){prem++;} if (mat.col(prem).maxCoeff()>5){ m_param[k][b]=m_param[k][b].Optimise_gamma(k,b,dat,nv_mod,5,m_proba.col(k).array()/m_proba.rowwise().sum().array(),dat.Get_eff_datafile()); } } } } } } } m_propor=uniforme(g); Probapost( nv_mod , mat ); Compte_nbparam(dat,nv_mod); Likelihood(dat.Get_eff_datafile()); Estimation(1,0,iter,dat,nv_mod); }
void parameters::Estimation_discrete(int nbtent, datafile dat, model mod){ const MatrixXi & omega=mod.Get_model(); const int g=omega.rows(); for (int k=0;k<g;k++){ for (int b=0;b<(omega.row(k).maxCoeff()+1);b++){ if ((omega.row(k).array()==b).count()>1){ m_param[k][b]=m_param[k][b].Optimise_gamma(k,b,dat,mod,nbtent, m_proba.col(k).array()/m_proba.rowwise().sum().array(),dat.Get_eff_datafile()); } } } }
void parameters::Mstep(datafile dat, model mod){ const MatrixXi & omega=mod.Get_model(),mat=dat.Get_mat_datafile(); const VectorXd & eff=dat.Get_eff_datafile(); for (int k=0;k<m_proba.cols();k++){ m_propor(k)= (eff.array()*(m_proba.col(k)).array()/m_proba.rowwise().sum().array()).sum() / eff.sum(); for (int b=0;b<mat.cols();b++){ if ((omega.row(k).array()==b).any()){ const VectorXi & who=mod.Get_var_block(k,b); m_param[k][b].Mstep(who,mat,m_proba_block[k].col(b),m_proba.col(k).array()/m_proba.rowwise().sum().array(),eff); } } } }
void parameters::Probapost(model mod, const MatrixXi & mat){ const MatrixXi & omega=mod.Get_model(); m_proba=MatrixXd::Ones(mat.rows(),omega.rows()); for (int k = 0; k < omega.rows(); ++k) { m_proba_block[k]=m_proba_block[k].Ones(mat.rows(),(omega.rowwise().maxCoeff()(k)+1)); for (int b = 0; b < (omega.rowwise().maxCoeff()(k)+1); ++b){ if ((omega.row(k).array()==b).any()){ const VectorXi & who=mod.Get_var_block(k,b); if (who.rows()>1){ m_proba_block[k].col(b)=m_param[k][b].proba_indpt(who,mat)+m_param[k][b].proba_dpt(who,mat); }else{ m_proba_block[k].col(b)=m_param[k][b].proba_indpt(who,mat); } } } m_proba.col(k)=m_propor(k)* (m_proba_block[k].rowwise().prod()).array(); } }
void parameters::Compte_nbparam(datafile dat,model mod){ const MatrixXi & omega=mod.Get_model(); int g=omega.rows(); m_nbparam=g-1; for (int k=0;k<g;k++){ for (int b=0;b<(omega.rowwise().maxCoeff()(k)+1) ;b++){ if ((omega.row(k).array()==b).any()){ const VectorXi & who=mod.Get_var_block(k,b); const VectorXi modalite=dat.Get_modalite(who); if (who.rows()==1){ m_nbparam+=modalite(0)-1; }else{ for (int h=0;h<modalite.rows();h++){ m_nbparam+=modalite(h)-1; } m_nbparam+=modalite(0); if ((modalite(1)==2)&&(who.rows()==2)){m_nbparam--;} } } } } }
parameters::parameters(datafile dat, model mod){ // TODO Auto-generated constructor stub const MatrixXi & omega=mod.Get_model(),mat=dat.Get_mat_datafile(); const int g=omega.rows(),unique=mat.rows(); m_proba=MatrixXd::Ones(unique,g); m_proba_block.resize(g); m_param.resize(g); for (int k=0;k<g;k++){ m_param[k].resize(omega.rowwise().maxCoeff()(k)+1); m_proba_block[k].resize(unique,omega.rowwise().maxCoeff()(k)+1); for (int b=0;b<(omega.rowwise().maxCoeff()(k)+1) ;b++){ if ((omega.row(k).array()==b).any()){ m_param[k][b]=param_block(k,b,dat,mod,VectorXd::Ones(mat.rows()),1); } } } m_propor=uniforme(g); Probapost( mod , mat ); Compte_nbparam(dat,mod); Likelihood(dat.Get_eff_datafile()); Estimation(1,0,6,dat,mod); }