计算t-test 的C程序

/* gdb output   程序还未调试成功:http://ubuntuforums.org/archive/index.php/t-412096.html   */

/*(gdb) run
Starting program: /home/nrh1/code/testt

Program received signal SIGSEGV, Segmentation fault.
0x0804967f in var ()   
*/

/* function to calculate ttest ttest.c
*/
#include 
<stdio.h>
#include 
<math.h>

#define square(x) (x*x)
void ttest(double *data1, unsigned int n1, double *data2, unsigned int n2, double *tstatistic, double *tprob);
int main()

{

/* declare arrays of x and y data from statistical methods in cell biology 2nd edition pg 45*/
double a[8]= {3.2,1.6,5.7,2.8,5.5,1.2,6.1,2.9};
double b[8]= {3.8,1.0,8.4,3.6,5.0,3.5,7.3,4.8};
unsigned 
int na=8;
unsigned 
int nb=8;
double* t;
double *prob;

ttest( a, na, b, nb, 
&t, &prob);
printf(
"tvalue %f\n"&t);

printf(
"tvalue %f\n"&prob);
/* program closing brace    */

/*uses part of stats lib stats.c the relevant functions are shown below ftest code is nt mine but works very well I've used it in other contexts   */

/*
ttest assumes homogenity of variance, uses ftest probability code to calculate probability of the significance of the t statistic

*/


double var(double *data, unsigned int n)
{
unsigned 
int i;
double average=0.0;
double s, temp, var;

for (i=0; i<n; n++)
average
=average+data[n]; /* calculate average   */

average
=average/n;

var
=temp=s=0.0/* now variance  */
for (i=0; i<n; n++)
{
s
=data[n]-average;
temp
=temp+s;
var
=var+(s*s);

}
return (var-temp*temp/n)/(n-1);
/* function closing brace   */
/* end of function */

void ttest(double *data1, unsigned int n1, double *data2, unsigned int n2, double *tstatistic, double *tprob)
{

double nmean(unsigned int count, double *data); /* function declarations within function    */
double pof(double F, unsigned int df1, unsigned int df2);
double var(double *data, unsigned int n);
double svar=0.0;
double var1=0.0;
double var2=0.0;
double mean1=0.0;
double mean2=0.0;
double df=0.0;
/*double *tstatistic=0.0;  */
/*double *tprob=0.0     */

mean1
=nmean(n1, data1); /*calculate means for individual data sets    */
mean2
=nmean(n2, data2);
var1
=var(data1, n1); /*calculate variances for individual data sets     */
var2
=var(data2, n2);
df
=n1+n2-2/* calculate overall df                 */
svar
=((n1-1)*var1+(n2-1)*var2)/df; /* pooled variance  */
*tstatistic=(mean1-mean2)/sqrt(svar*(1.0/n1+1.0/n2)); /* calculate t value    */
*tprob=pof(((*tstatistic)*(*tstatistic)), 1, df); /*probability        */
/* function closing brace      */

/* end of function */


/*FUNCTION pof: probability of F */
/*ALGORITHM Compute probability of F ratio.

*/

/*
example if F=1.432923 and df1=3 and df2=5 p=0.337564
*/
double pof(double F, unsigned int df1, unsigned int df2)
{

int i, j;
int a, b;
double w, y, z, d, p;

if (F < F_EPSILON || df1 < 1 || df2 < 1)
p
=1.0;
else
{
= df1%2 ? 1 : 2;
= df2%2 ? 1 : 2;
= (F * df1) / df2;

= 1.0 / (1.0 + w);
if (a == 1)
if (b == 1)
{
= sqrt (w);
= I_PI; /* 1 / 3.14159 */
= y * z / p;
= 2.0 * y * atan (p);
}
else
{
= sqrt (w * z);
= 0.5 * p * z / w;
}
else if (b == 1)
{
= sqrt (z);
= 0.5 * z * p;
= 1.0 - p;
}
else
{
= z * z;
= w * z;
}
= 2.0 * w / z;

for (j = b + 2; j <= df2; j += 2)
{
*= (1.0 + a / (j - 2.0)) * z;
= (a == 1 ? p + d * y / (j - 1.0) : (p + w) * z);
}

= w * z;
= 2.0 / z;
= df2 - 2;
for (i = a + 2; i <= df1; i += 2)
{
= i + b;
*= y * j / (i - 2.0);
-= z * d / j;
}
/* correction for approximation errors suggested in certification */
if (p < 0.0)
= 0.0;
else if (p > 1.0)
= 1.0;
p
= (1.0-p);
return p;
}
return p;
}
posted @ 2008-10-27 19:47  emanlee  阅读(1028)  评论(0编辑  收藏  举报