#include #include #include float betai(float,float,float); float betacf(float,float,float); void ttest(float data1[], int n1, float data2[], int n2, float *t, float *prob){ float var1, var2, svar, df, ave1, ave2; /* void avevar();*/ /* float betai();*/ avevar(data1, n1, &ave1, &var1); avevar(data2, n2, &ave2, &var2); df=(float)(n1+n2-2); svar=((n1-1)*var1+(n2-1)*var2)/df; *t=(ave1-ave2)/sqrt(svar*(1.0/n1+1.0/n2)); *prob=betai(0.5f, 0.5f, 0.6f); /* *prob=betai(0.5*df, 0.5, df/(df+(*t)*(*t)));*/ } void avevar(float data[], int n, float *ave, float *svar){ int j; float s; *ave= (*svar)=0.0; for (j=1; j<=n; j++){ *ave += data[j]; } *ave /= n; for (j=1; j<=n; j++){ s=data[j]-(*ave); *svar += s*s; } *svar /= (n-1); } float betai(float a, float b, float x){ float bt; /* float gammln(), betacf(); void nrerror(); */ if (x < 0.0 || x > 1.0){ nrerror("Ickebra x i rutinen BETAI"); } if (x == 0 || x == 1){ bt = 0.0; } else { bt = exp(gammln(a+b)-gammln(a)-gammln(b)+a*log(x)+b*log(1.0-x)); } if (x<(a+1.0)/(a+b+2.0)){ return bt*betacf(a,b,x)/a; } else { return 1.0-bt*betacf(b, a, 1.0-x)/b; } } #define ITMAX 100 #define EPS 3.0e-7 float betacf(float a, float b, float x){ float qap, qam, qab, em, tem, d; float bz, bm=1.0, bp, bpp; float az=1.0, am = 1.0, ap, app, aold; int m; /*void nrerror();*/ qab=a+b; qap=a+1.0; qam=a-1.0; bz=1.0-qab*x/qap; for (m=1; m<=ITMAX; m++){ em = (float) m; tem = em + em; d = em*(b-em)*x/((qam+tem)*(a+tem)); ap = az + d*am; bp = bz + d*bm; d = -(a+em)*(qab+em)*x/((qap+tem)*(a+tem)); app = ap + d*az; bpp = bp + d* bz; aold = az; am = ap/bpp; bm= bp/bpp; az = app/bpp; bz=1.0; if (fabs(az-aold) < (EPS*fabs(az))){ return az; } nrerror("a eller b storskrider, eller ITMAX underskrider i bETACF"); } } float gammp (float a, float x){ float gamser, gammcf, gln; /* void gser(), gcf(), nrerror();*/ if (x < 0.0 || x > 1.0){ nrerror("obruklig input i rutinen GAMMP"); } if (x < (a+1.0)){ gser(&gamser, a, x, &gln); return gamser; } else { gcf(&gammcf, a, x, &gln); return 1-gammcf; } } float gammq(float a, float x){ float gamser, gammcf, gln; /* void gcf(), gser(), nrerror();*/ if (x<0.0 || x > 1.0){ nrerror("obruklig input i rutinen GAMMQ"); } if (x < (a+1.0)){ gser(&gamser, a, x, &gln); return 1.0-gamser; } else { gcf(&gammcf, a, x, &gln); return gammcf; } } void gser(float *gamser, float a, float x, float *gln){ int n; float sum, del, ap; /* float gammln(); void nrerror(); */ *gln=gammln(a); if (x<=0.0){ if (x<0.0){ nrerror("x < 0 i rutinen GSER"); } *gamser = 0.0; return; } else{ ap=a; del = sum=1.0/a; for (n=1; n<=ITMAX; n++){ ap+= 1.0; del *= x/ap; sum += del; if (fabs(del) < fabs(sum)*EPS){ *gamser = sum*exp(-x+a*log(x)-(*gln)); return; } } nrerror(" a för stor, ITMAX för liten i rutinen GSER"); return; } } void gcf( float *gammcf, float a, float x, float *gln){ int n; float gold = 0.0, g, fac = 1.0, b1 = 1.0; float b0=0.0, anf, ana, an, a1, a0=1.0; /* float gammln(); void nrerror(); */ *gln = gammln(a); a1=x; for (n=1; n<=ITMAX; n++){ an = (float) n; ana = an-a; a0 = (a1+a0*ana)*fac; b0 = (b1+b0*ana)*fac; anf=an*fac; a1=x*a0+anf*a1; b1=x*b0+anf*b1; if (a1){ fac = 1.0/a1; g=b1*fac; if(fabs((g-gold)/g) < EPS){ *gammcf=exp(-x+a*log(x)-(*gln))*g; return; } gold=g; } } nrerror("a för stort, ITMAX för litet i rutinen GCF"); } void nrerror(char error_text[]) /* Numerical Recipes standard error handler */ { /* void exit();*/ fprintf(stderr,"Model run-time error...\n"); fprintf(stderr,"%s\n",error_text); fprintf(stderr,"...now exiting to system...\n"); exit(1); } ERRORS: statpak.c:25: warning: conflicting types for 'avevar' statpak.c:15: warning: previous implicit declaration of 'avevar' was here statpak.c:132: warning: conflicting types for 'gser' statpak.c:107: warning: previous implicit declaration of 'gser' was here statpak.c:166: warning: conflicting types for 'gcf' statpak.c:111: warning: previous implicit declaration of 'gcf' was here statpak.c:199: warning: conflicting types for 'nrerror' statpak.c:48: warning: previous implicit declaration of 'nrerror' was here /usr/lib/gcc/i386-redhat-linux/4.0.2/../../../crt1.o(.text+0x18): In function `_start': : undefined reference to `main' /tmp/ccCIQrBE.o(.text+0xb4): In function `ttest': statpak.c: undefined reference to `sqrt' /tmp/ccCIQrBE.o(.text+0x21d): In function `betai': statpak.c: undefined reference to `gammln' /tmp/ccCIQrBE.o(.text+0x234):statpak.c: undefined reference to `gammln' /tmp/ccCIQrBE.o(.text+0x24b):statpak.c: undefined reference to `gammln' /tmp/ccCIQrBE.o(.text+0x277):statpak.c: undefined reference to `log' /tmp/ccCIQrBE.o(.text+0x2a1):statpak.c: undefined reference to `log' /tmp/ccCIQrBE.o(.text+0x2b9):statpak.c: undefined reference to `exp' /tmp/ccCIQrBE.o(.text+0x60c): In function `gser': statpak.c: undefined reference to `gammln' /tmp/ccCIQrBE.o(.text+0x6df):statpak.c: undefined reference to `log' /tmp/ccCIQrBE.o(.text+0x700):statpak.c: undefined reference to `exp' /tmp/ccCIQrBE.o(.text+0x774): In function `gcf': statpak.c: undefined reference to `gammln' /tmp/ccCIQrBE.o(.text+0x853):statpak.c: undefined reference to `log' /tmp/ccCIQrBE.o(.text+0x874):statpak.c: undefined reference to `exp'