static int low_lsq_y_ax_b(int n, real *xr, double *xd, real yr[], real *a, real *b, real *r, real *chi2) { gmx_stats_t lsq = gmx_stats_init(); int ok; for (int i = 0; (i < n); i++) { double pt; if (xd != NULL) { pt = xd[i]; } else if (xr != NULL) { pt = xr[i]; } else { gmx_incons("Either xd or xr has to be non-NULL in low_lsq_y_ax_b()"); } if ((ok = gmx_stats_add_point(lsq, pt, yr[i], 0, 0)) != estatsOK) { gmx_stats_free(lsq); return ok; } } ok = gmx_stats_get_ab(lsq, elsqWEIGHT_NONE, a, b, NULL, NULL, chi2, r); gmx_stats_free(lsq); return ok; }
static int low_lsq_y_ax_b(int n, real *xr, double *xd, real yr[], real *a, real *b, real *r, real *chi2) { int i, ok; gmx_stats_t lsq; lsq = gmx_stats_init(); for (i = 0; (i < n); i++) { if ((ok = gmx_stats_add_point(lsq, (NULL != xd) ? xd[i] : xr[i], yr[i], 0, 0)) != estatsOK) { return ok; } } if ((ok = gmx_stats_get_ab(lsq, elsqWEIGHT_NONE, a, b, NULL, NULL, chi2, r)) != estatsOK) { return ok; } return estatsOK; /* double x,y,yx,xx,yy,sx,sy,chi2; yx=xx=yy=sx=sy=0.0; for (i=0; i<n; i++) { if (xd != NULL) { x = xd[i]; } else { x = xr[i]; } y = yr[i]; yx += y*x; xx += x*x; yy += y*y; sx += x; sy += y; } * a = (n*yx-sy*sx)/(n*xx-sx*sx); * b = (sy-(*a)*sx)/n; * r = sqrt((xx-sx*sx)/(yy-sy*sy)); chi2 = 0; if (xd != NULL) { for(i=0; i<n; i++) chi2 += dsqr(yr[i] - ((*a)*xd[i] + (*b))); } else { for(i=0; i<n; i++) chi2 += dsqr(yr[i] - ((*a)*xr[i] + (*b))); } if (n > 2) return sqrt(chi2/(n-2)); else return 0; */ }
static void line() { gmx_rng_t rng; gmx_stats_t line; int i, dy, ok, n = 1000; real y, a, b, da, db, aver, sigma, error, chi2, R, rfit; const real a0 = 0.23, b0 = 2.7; FILE *fp; for (dy = 0; (dy < 2); dy++) { rng = gmx_rng_init(13); line = gmx_stats_init(); for (i = 0; (i < n); i++) { y = a0*i+b0+50*(gmx_rng_uniform_real(rng)-0.5); if ((ok = gmx_stats_add_point(line, i, y, 0, dy*0.1)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } } /* Line with slope test */ if ((ok = gmx_stats_get_ab(line, elsqWEIGHT_NONE, &a, &b, &da, &db, &chi2, &rfit)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } if ((ok = gmx_stats_get_corr_coeff(line, &R)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } if (dy == 0) { fp = fopen("line0.xvg", "w"); } else { fp = fopen("line1.xvg", "w"); } if ((ok = gmx_stats_dump_xy(line, fp)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } fclose(fp); printf("Line with eqn. y = %gx + %g with noise%s\n", a0, b0, (dy == 0) ? "" : " and uncertainties"); printf("Found: a = %g +/- %g, b = %g +/- %g\n", a, da, b, db); if ((ok = gmx_stats_done(line)) != estatsOK) { fprintf(stderr, "%s\n", gmx_stats_message(ok)); } gmx_rng_destroy(rng); } }
int lsq_y_ax_b_error(int n, real x[], real y[], real dy[], real *a, real *b, real *da, real *db, real *r, real *chi2) { gmx_stats_t lsq = gmx_stats_init(); int ok; for (int i = 0; (i < n); i++) { ok = gmx_stats_add_point(lsq, x[i], y[i], 0, dy[i]); if (ok != estatsOK) { gmx_stats_free(lsq); return ok; } } ok = gmx_stats_get_ab(lsq, elsqWEIGHT_Y, a, b, da, db, chi2, r); gmx_stats_free(lsq); return ok; }
void printmol(t_corr *curr, const char *fn, const char *fn_pdb, int *molindex, t_topology *top, rvec *x, int ePBC, matrix box, const output_env_t oenv) { #define NDIST 100 FILE *out; gmx_stats_t lsq1; int i, j; real a, b, D, Dav, D2av, VarD, sqrtD, sqrtD_max, scale; t_pdbinfo *pdbinfo = NULL; int *mol2a = NULL; out = xvgropen(fn, "Diffusion Coefficients / Molecule", "Molecule", "D", oenv); if (fn_pdb) { if (top->atoms.pdbinfo == NULL) { snew(top->atoms.pdbinfo, top->atoms.nr); } pdbinfo = top->atoms.pdbinfo; mol2a = top->mols.index; } Dav = D2av = 0; sqrtD_max = 0; for (i = 0; (i < curr->nmol); i++) { lsq1 = gmx_stats_init(); for (j = 0; (j < curr->nrestart); j++) { real xx, yy, dx, dy; while (gmx_stats_get_point(curr->lsq[j][i], &xx, &yy, &dx, &dy, 0) == estatsOK) { gmx_stats_add_point(lsq1, xx, yy, dx, dy); } } gmx_stats_get_ab(lsq1, elsqWEIGHT_NONE, &a, &b, NULL, NULL, NULL, NULL); gmx_stats_done(lsq1); sfree(lsq1); D = a*FACTOR/curr->dim_factor; if (D < 0) { D = 0; } Dav += D; D2av += sqr(D); fprintf(out, "%10d %10g\n", i, D); if (pdbinfo) { sqrtD = std::sqrt(D); if (sqrtD > sqrtD_max) { sqrtD_max = sqrtD; } for (j = mol2a[molindex[i]]; j < mol2a[molindex[i]+1]; j++) { pdbinfo[j].bfac = sqrtD; } } } xvgrclose(out); do_view(oenv, fn, "-graphtype bar"); /* Compute variance, stddev and error */ Dav /= curr->nmol; D2av /= curr->nmol; VarD = D2av - sqr(Dav); printf("<D> = %.4f Std. Dev. = %.4f Error = %.4f\n", Dav, std::sqrt(VarD), std::sqrt(VarD/curr->nmol)); if (fn_pdb && x) { scale = 1; while (scale*sqrtD_max > 10) { scale *= 0.1; } while (scale*sqrtD_max < 0.1) { scale *= 10; } GMX_RELEASE_ASSERT(pdbinfo != NULL, "Internal error - pdbinfo not set for PDB input"); for (i = 0; i < top->atoms.nr; i++) { pdbinfo[i].bfac *= scale; } write_sto_conf(fn_pdb, "molecular MSD", &top->atoms, x, NULL, ePBC, box); } }
int lsq_y_ax_b_error(int n, real x[], real y[], real dy[], real *a, real *b, real *da, real *db, real *r, real *chi2) { gmx_stats_t lsq; int i, ok; lsq = gmx_stats_init(); for (i = 0; (i < n); i++) { if ((ok = gmx_stats_add_point(lsq, x[i], y[i], 0, dy[i])) != estatsOK) { return ok; } } if ((ok = gmx_stats_get_ab(lsq, elsqWEIGHT_Y, a, b, da, db, chi2, r)) != estatsOK) { return ok; } if ((ok = gmx_stats_done(lsq)) != estatsOK) { return ok; } sfree(lsq); return estatsOK; /* double sxy,sxx,syy,sx,sy,w,s_2,dx2,dy2,mins; sxy=sxx=syy=sx=sy=w=0.0; mins = dy[0]; for(i=1; (i<n); i++) mins = min(mins,dy[i]); if (mins <= 0) gmx_fatal(FARGS,"Zero or negative weigths in linear regression analysis"); for (i=0; i<n; i++) { s_2 = dsqr(1.0/dy[i]); sxx += s_2*dsqr(x[i]); sxy += s_2*y[i]*x[i]; syy += s_2*dsqr(y[i]); sx += s_2*x[i]; sy += s_2*y[i]; w += s_2; } sxx = sxx/w; sxy = sxy/w; syy = syy/w; sx = sx/w; sy = sy/w; dx2 = (sxx-sx*sx); dy2 = (syy-sy*sy); * a=(sxy-sy*sx)/dx2; * b=(sy-(*a)*sx); * chi2=0; for(i=0; i<n; i++) * chi2+=dsqr((y[i]-((*a)*x[i]+(*b)))/dy[i]); * chi2 = *chi2/w; * da = sqrt(*chi2/((n-2)*dx2)); * db = *da*sqrt(sxx); * r = *a*sqrt(dx2/dy2); if (debug) fprintf(debug,"sx = %g, sy = %g, sxy = %g, sxx = %g, w = %g\n" "chi2 = %g, dx2 = %g\n", sx,sy,sxy,sxx,w,*chi2,dx2); if (n > 2) * chi2 = sqrt(*chi2/(n-2)); else * chi2 = 0; */ }