void hwe::estHWE(double *x,double *loglike,int nInd){ double l=HWE_like(x,loglike,nInd); int iter=50; double d=l; int printer=0; for(int i=0;i<iter;i++){ HWE_EM(x,loglike,nInd); l=HWE_like(x,loglike,nInd); if(d>l+0.01){ // fprintf(stderr,"d %f\tl %f\n",d,l); printer=1; } d=l; } if(printer & 0){ x[0]=0.05; x[1]=0.05; l=HWE_like(x,loglike,nInd); for(int i=0;i<iter;i++){ fprintf(stderr,"like %d\t%f\tf %f\tF %f\t%d\n",i,l,x[0],x[1],nInd); HWE_EM(x,loglike,nInd); l=HWE_like(x,loglike,nInd); } for(int ind=0;ind<nInd;ind++){ fprintf(stdout,"likes %f, %f, %f\n",loglike[ind*3+0],loglike[ind*3+1],loglike[ind*3+2]); } fflush(stderr); exit(0); } //print here // fprintf(stderr,"like %d\t%f\tf %f\tF %f\t%d\n",iter,l,x[0],x[1],nInd); }
void hwe::run(funkyPars *pars){ if(doHWE==0) return; // pars->hweStruct = new funkyHWE;//old funkyHWE *hweStruct = new funkyHWE;//new double *freq = new double[pars->numSites]; double *F = new double[pars->numSites]; double *like0 = new double[pars->numSites]; double *likeF = new double[pars->numSites]; double **loglike3; loglike3=angsd::get3likes(pars); for(int s=0;s<pars->numSites;s++){ if(pars->keepSites[s]==0) continue; //start parameter double x[2]; x[0]=0.05; x[1]=0.05; estHWE(x,loglike3[s],pars->nInd); freq[s]=x[0]; F[s]=x[1]; likeF[s] = HWE_like(x,loglike3[s],pars->nInd); x[1]=0.0; x[0]=pars->results->asso->freq[s]; like0[s] = HWE_like(x,loglike3[s],pars->nInd); // fprintf(stderr,"%f\t%f\n",x[0],x[1]); //fprintf(stderr,"%f\t%f\t%f\n",loglike3[s][0],loglike3[s][1],loglike3[s][2]); } //old // pars->hweStruct->freq=freq; // pars->hweStruct->F=F; hweStruct->freq=freq; hweStruct->F=F; hweStruct->like0=like0; hweStruct->likeF=likeF; pars->extras[index] = hweStruct; for(int s=0;s<pars->numSites;s++) delete[] loglike3[s]; delete[] loglike3; }
void abcHWE::run(funkyPars *pars){ if(doHWE==0) return; funkyHWE *hweStruct = new funkyHWE; double *freq = new double[pars->numSites]; double *freqHWE = new double[pars->numSites]; double *F = new double[pars->numSites]; double *like0 = new double[pars->numSites]; double *likeF = new double[pars->numSites]; double **loglike3; loglike3=angsd::get3likesRescale(pars); for(int s=0;s<pars->numSites;s++){ if(pars->keepSites[s]==0) continue; //est under HWE freqHWE[s] = angsd::estFreq(loglike3[s],pars->nInd); //start parameter double x[2]; x[1]=0.0; //F x[0]=freqHWE[s]; // freq //log like for HWE freq like0[s] = HWE_like(x,loglike3[s],pars->nInd); //start parameter for EM_F x[0]=freqHWE[s]; x[1]=0.05; estHWE(x,loglike3[s],pars->nInd); freq[s]=x[0]; F[s]=x[1]; likeF[s] = HWE_like(x,loglike3[s],pars->nInd); // fprintf(stderr,"%f\t%f\n",x[0],x[1]); //fprintf(stderr,"%f\t%f\t%f\n",loglike3[s][0],loglike3[s][1],loglike3[s][2]); float lrt= 2*like0[s]-2*likeF[s]; if(lrt<0) lrt=0; if(lrt<LRT_thres) pars->keepSites[s] =0; } hweStruct->freq=freq; hweStruct->freqHWE=freqHWE; hweStruct->F=F; hweStruct->like0=like0; hweStruct->likeF=likeF; pars->extras[index] = hweStruct; for(int s=0;s<pars->numSites;s++) delete[] loglike3[s]; delete[] loglike3; }