35 double e, f, g, meanx, meany, kk, bb, ke, be, rr, sumsdcy=0.0;
36 double sumx=0.0, sumy=0.0, sumsx=0.0, sumsdx=0.0, sumsdy=0.0, sumdxdy=0.0;
37 double sumxy=0.0, sumsy=0.0;
41 fprintf(stdout,
"pearson(x[], y[], %d, *k, *kSD, *b, *bSD, *r, *ySD)\n", nr);
45 if(x==NULL || y==NULL || nr<2)
return(1);
49 f=x[1]-x[0];
if(fabs(f)<1.0E-50)
return(1);
50 *k=(y[1]-y[0])/f; *b=y[0]-(*k)*x[0];
51 *kSD=*bSD=*ySD=0.; *r=1.;
57 sumx+=x[i]; sumy+=y[i];
58 sumsx+=x[i]*x[i]; sumsy+=y[i]*y[i];
61 meanx=sumx/(double)nr;
62 meany=sumy/(double)nr;
65 f=x[i]-meanx; sumsdx+=f*f;
66 g=y[i]-meany; sumsdy+=g*g;
69 if(sumsdx<1.0e-50 || sumsdy<1.0e-50)
return(3);
71 kk=sumdxdy/sumsdx; *k=kk;
73 bb=(sumsdx*sumy - sumx*sumdxdy)/((
double)nr*sumsdx); *b=bb;
80 if(sumsdcy<=1.0e-12) e=0.0;
else e=sqrt(sumsdcy/(
double)(nr-2)); *ySD=e;
82 ke=e/sqrt(sumsdx); be=e/sqrt((
double)nr-sumx*sumx/sumsx);
84 be=sqrt(sumsdcy/(
double)(nr-2))/sqrt((
double)nr-(sumx*sumx)/sumsx);
86 rr=(sumxy-((sumx*sumy)/(double)nr)) /
87 sqrt((sumsx-sumx*sumx/(
double)nr)*(sumsy-sumy*sumy/(
double)nr));
89 if(nr>4) rr*=1.0+(1.0-rr*rr)/(
double)(2*(nr-4));
92 fprintf(stdout,
"k=%14.7e +- %14.7e\n", kk, ke);
93 fprintf(stdout,
"b=%14.7e +- %14.7e\n", bb, be);
94 fprintf(stdout,
"r=%14.7e ySD=%14.7e\n", rr, e);
135 nx=(
double*)calloc(nr,
sizeof(
double));
if(nx==NULL)
return 1;
136 ny=(
double*)calloc(nr,
sizeof(
double));
if(ny==NULL) {free((
char*)nx);
return 1;}
139 for(i=0, j=0; i<nr; i++)
if(is[i]) {nx[j]=x[i]; ny[j]=y[i]; j++;}
142 i=
pearson(nx, ny, j, k, kSD, b, bSD, r, ySD); free((
char*)nx); free((
char*)ny);
178 nx=(
double*)calloc(nr,
sizeof(
double));
if(nx==NULL)
return 1;
179 ny=(
double*)calloc(nr,
sizeof(
double));
if(ny==NULL) {free((
char*)nx);
return 1;}
182 for(i=0, j=0; i<nr; i++)
183 if(!isnan(x[i]) && !isnan(y[i])) {nx[j]=x[i]; ny[j]=y[i]; j++;}
186 i=
pearson(nx, ny, j, k, kSD, b, bSD, r, ySD); free((
char*)nx); free((
char*)ny);
226 fprintf(stdout,
"pearson4(x[], y[], %d, %g, %g, *k, *kSD, *b, *bSD, *r, *ySD)\n", nr,start,end);
230 if((nx=(
double*)calloc(nr,
sizeof(
double)))==NULL)
return -3;
231 if((ny=(
double*)calloc(nr,
sizeof(
double)))==NULL) {free((
char*)nx);
return -3;}
234 for(i=0, j=0; i<nr; i++)
235 if(x[i]>=start && x[i]<=end && !isnan(x[i]) && !isnan(y[i])) {
236 nx[j]=x[i]; ny[j]=y[i]; j++;}
239 i=
pearson(nx, ny, j, k, kSD, b, bSD, r, ySD);
240 free((
char*)nx); free((
char*)ny);
278 int i, n, m, x1, x2, b1, b2, bm;
280 double tk, tkSD, tb, tbSD, tr, tySD;
284 fprintf(stdout,
"best_pearson(x, y, %d, %d, %d, %d, k, kSD, b, bSD, r, ySD)\n",
285 nr, min_nr, *first, *last);
290 nx=(
double*)calloc(nr,
sizeof(
double));
if(nx==NULL)
return 0;
291 ny=(
double*)calloc(nr,
sizeof(
double));
if(ny==NULL) {free((
char*)nx);
return 0;}
293 if(*last>nr-1) *last=nr-1;
294 if(*first<0) *first=0;
295 for(i=*first, n=0; i<=*last; i++)
296 if(!isnan(x[i]) && !isnan(y[i])) {nx[n]=x[i]; ny[n]=y[i]; n++;}
299 if(n<2 || n<min_nr) {free((
char*)nx); free((
char*)ny);
return 0;}
301 i=
pearson(nx, ny, n, k, kSD, b, bSD, r, ySD);
302 free((
char*)nx); free((
char*)ny);
303 if(i)
return 0;
else return n;
307 *k=*kSD=*b=*bSD=*r=*ySD=0.; b1=b2=bm=0;
308 for(x1=0, m=n; n-x1>min_nr; x1++) {
310 for(x2=n-1, m=x2-x1+1; m>=min_nr; x2--, m--) {
311 if(
pearson(nx+x1, ny+x1, m, &tk, &tkSD, &tb, &tbSD, &tr, &tySD))
315 (tr==*r && m==bm && x1>b1) ||
316 (tr==*r && m==bm && x1==b1 && tk>*k) ) {
318 *k=tk; *kSD=tkSD; *b=tb; *bSD=tbSD; *r=tr; *ySD=tySD;
325 for(i=*first; i<=*last; i++)
326 if(x[i]==nx[b1] && y[i]==ny[b1]) {*first=i;
break;}
327 for(i=*last; i>=*first; i--)
328 if(x[i]==nx[b2] && y[i]==ny[b2]) {*last=i;
break;}
331 free((
char*)nx); free((
char*)ny);
358 double sumsqr, sqrsum;
360 for(i=0, sumsqr=sqrsum=0.0, n=0; i<nr; i++)
if(!isnan(x[i]) && !isnan(y[i])) {
361 sumsqr+=x[i]*x[i]; sqrsum+=x[i]; n++;}
363 *xmean=sqrsum/(double)n;
364 if(n==1) *xsd=0.0;
else {
366 *xsd=sqrt( (sumsqr - sqrsum/(
double)n) / (
double)(n-1) );
368 for(i=0, sumsqr=sqrsum=0.0, n=0; i<nr; i++)
if(!isnan(x[i]) && !isnan(y[i])) {
369 sumsqr+=y[i]*y[i]; sqrsum+=y[i]; n++;}
371 *ymean=sqrsum/(double)n;
372 if(n==1) *ysd=0.0;
else {
374 *ysd=sqrt( (sumsqr - sqrsum/(
double)n) / (
double)(n-1) );
399 double xsum=0.0, ysum=0.0, x2sum=0.0, xysum=0.0, delta;
403 if(x==NULL || y==NULL)
return(1);
407 for(i=0, nn=0; i<n; i++) {
408 if(isnan(x[i]) || isnan(y[i]))
continue;
409 xsum+=x[i]; ysum+=y[i]; x2sum+=x[i]*x[i]; xysum+=x[i]*y[i]; nn++;
412 delta=(double)nn*x2sum - xsum*xsum;
if(delta==0.0)
return(3);
413 *m=((double)nn*xysum - xsum*ysum)/delta;
414 *c=(x2sum*ysum - xsum*xysum)/delta;
443 int i, ret, i_at_max=0;
444 double slope, ic, max_slope, ic_at_max=0.0;
447 if(x==NULL || y==NULL)
return(1);
449 if(slope_n>n)
return(3);
453 for(i=0; i<=n-slope_n; i++) {
454 ret=
regr_line(x+i, y+i, slope_n, &slope, &ic);
if(ret)
continue;
455 if(slope>max_slope) {max_slope=slope; ic_at_max=ic; i_at_max=i;}
457 if(max_slope==-1.0E200)
return(10);
458 if(m!=NULL) *m=max_slope;
459 if(c!=NULL) *c=ic_at_max;
460 if(xi!=NULL) {
if(max_slope!=0.0) *xi=-ic_at_max/max_slope;
else *xi=0.0;}
462 *xh=0.0;
for(i=i_at_max; i<i_at_max+slope_n; i++) *xh+=x[i];
463 *xh/=(double)slope_n;
496 int i, ret, i_at_max=0;
497 double slope, ic, max_slope, ic_at_max=0.0;
500 if(x==NULL || y==NULL)
return(1);
502 if(slope_n>n)
return(3);
506 for(i=0; i<=n-slope_n; i++)
if(x[i]>=x_start) {
507 ret=
regr_line(x+i, y+i, slope_n, &slope, &ic);
if(ret)
continue;
508 if(slope>max_slope) {max_slope=slope; ic_at_max=ic; i_at_max=i;}
510 if(max_slope==-1.0E200)
return(10);
511 if(m!=NULL) *m=max_slope;
512 if(c!=NULL) *c=ic_at_max;
513 if(xi!=NULL) {
if(max_slope!=0.0) *xi=-ic_at_max/max_slope;
else *xi=0.0;}
515 *xh=0.0;
for(i=i_at_max; i<i_at_max+slope_n; i++) *xh+=x[i];
516 *xh/=(double)slope_n;
Header file for libtpcmodel.
int highest_slope_after(double *x, double *y, int n, int slope_n, double x_start, double *m, double *c, double *xi, double *xh)
int highest_slope(double *x, double *y, int n, int slope_n, double *m, double *c, double *xi, double *xh)
int pearson4(double *x, double *y, int nr, double start, double end, double *k, double *kSD, double *b, double *bSD, double *r, double *ySD)
Calculate slope and intercept of a line and Pearson's correlation coefficient.
int regr_line(double *x, double *y, int n, double *m, double *c)
int pearson2(double *x, double *y, char *is, int nr, double *k, double *kSD, double *b, double *bSD, double *r, double *ySD)
int pearson(double *x, double *y, int nr, double *k, double *kSD, double *b, double *bSD, double *r, double *ySD)
int pearson3(double *x, double *y, int nr, double *k, double *kSD, double *b, double *bSD, double *r, double *ySD)
int mean(double *x, double *y, int nr, double *xmean, double *xsd, double *ymean, double *ysd)
int best_pearson(double *x, double *y, int nr, int min_nr, int *first, int *last, double *k, double *kSD, double *b, double *bSD, double *r, double *ySD)