zoukankan      html  css  js  c++  java
  • 计算ttest 的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;
    }
  • 相关阅读:
    纪念我用word发布的第一篇文章
    第一个SpringMVCHelloWorld
    JSTL学习笔记
    bonecp的使用
    hdu 1556 树状数组
    hdu 1561 树形DP
    MYSQL使用笔记
    Android中简单实现Spinner的数据绑定
    Android中利用Application实现多个Activity间共享数据
    技术到底重要不重要?
  • 原文地址:https://www.cnblogs.com/emanlee/p/1320678.html
Copyright © 2011-2022 走看看