当前位置:文档之家› spss中怎样进行fisher精确概率法统计

spss中怎样进行fisher精确概率法统计

spss中怎样进行fisher精确概率法统计最短距离法是把两个类之间的距离定义为一个类中的所有案例与另一类中的所有案例之间的距离最小者.缺点是它有链接聚合的趋势,因为类与类之间的距离为所有距离中最短者,两类合并以后,它与其他类之间的距离缩小了,这样容易形成一个较大的类.所以此方法效果并不好,实际中不太用. 2.最长距离法是把类与类之间的距离定义为两类中离得最远的两个案例之间的距离.最长距离法克服了最短距离法链接聚合的缺点,两类合并后与其他类的距离是原来两个类中的距离最大者,加大了合并后的类与其他类的距离. 3.平均联结法,最短最长距离法都只用两个案例之间的距离来确定两类之间的距离,没有充分利用所有案例的信息,平均联结法把两类之间的距离定义为两类中所有案例之间距离的平均值,不再依赖于特殊点之间的距离,有把方差小的类聚到一起的趋势,效果较好,应用较广泛. 4.重心法,把两类之间的距离定义为两类重心之间的距离,每一类的重心是该类中所有案例在各个变量的均值所代表的点.与上面三种不同的是,每合并一次都要重新计算重心.重心法也较少受到特殊点的影响.重心法要求用欧氏距离,其主要缺点是在聚类过程中,不能保证合并的类之间的距离呈单调增加的趋势,也即本次合并的两类之间的距离可能小于上一次合并的两类之间的距离.5.离差平方和法,也称沃尔德法.思想是同一类内案例的离差平方和应该较小,不同类之间案例的离差平方和应该较大.求解过程是首先使每个案例自成一类,每一步使离差平方和增加最小的两类合并为一类,直到所有的案例都归为一类为止.采用欧氏距离,它倾向于把案例数少的类聚到一起,发现规模和形状大致相同的类.此方法效果较好,使用较广.个独立样本率比较的χ2检验属四格表资料χ2检验。

这类资料在医学研究中较为多见。

例如比较两种方法治疗某种疾病的有效率是否相同治疗结果如下:有效无效有效率(%)试验组 12 1对照组 3 8可以在SPSS中进行统计分析,具体操作详见附件中的.EXE文件。

在读取统计结果时,应当注意χ2检验的适用条件,正确选择Pearson卡方检验、Yates校正卡方检验、Fisher 精确概率法(本法不属于χ2检验)。

第三节四格表资料的Fisher确切概率法前面提及,当四格表资料中出现,或,或用公式(8-1)与公式(8-4)计算出值后所得的概率时,需改用四格表资料的Fisher确切概率(Fisher probabilities in 2×2 table)。

该法是由年)提出的,其理论依据是超几何分布(hypergeometric distribution),并非检验的范畴。

但由于在实际应用中常用它作为四格表资料假设检验的补充,故把此法列入本章。

下面以例8-1介绍其基本思想与检验步骤。

例8-1 某医师为研究乙肝免疫球蛋白预防胎儿宫内感染HBV的效果,将33例HBsAg阳性孕妇随机分为预防注射组和非预防组,结果见表8-3。

问两组新生儿的HBV总体感染率有无差别?表8-3两组新生儿HBV感染率的比较组别阳性阴性合计感染率(%)预防注射组41822非预防组5611合计92433一、基本思想在四格表周边合计数固定不变的条件下,计算表内4个实际频数变动时的各种组合之概率;再按检验假设用单侧或双侧的累计概率,依据所取的检验水准做出推断。

1.各组合概率的计算在四格表周边合计数不变的条件下,表内4个实际频数,,,变动的组合数共有“周边合计中最小数+1”个。

如例7-4,表内4个实际频数变动的组合数共有个,依次为:(1)(2)(3)(4)(5)22121220319418983746556ad-bc= -198ad-bc= -165ad-bc= -132ad-bc =-99ad-bc= -66(6)(7)(8)(9)(10)5176167158141347382911011ad-bc= -33ad-bc=0ad-bc=33ad-bc=66ad-bc= 99各组合的概率服从超几何分布,其和为1。

可按公式(8-9)计算(8-9)式中,,,,等符号的意义同表7-1;!为阶乘符号。

2.累计概率的计算单、双侧检验不同。

设现有样本四格表中的交叉积差,其概率为,其余情况下的组合四格表的交叉积差记为,概率记为。

(1)单侧检验若现有样本四格表中,须计算满足和条件的各种组合下四格表的累计概率。

若,则计算满足和条件的各种组合下四格表的累计概率。

(2)双侧检验计算满足和条件的各种组合下四格表的累计概率。

若遇到或时,四格表内各种组合的序列呈对称分布,此时按单侧检验规定条件只计算单侧累计概率,然后乘以2即得双侧累计概率。

二、检验步骤本例,宜用四格表资料的Fisher确切概率法直接计算累计概率。

检验步骤为:(1):,即两组新生儿HBV的总体感染率相等:,即两组新生儿HBV的总体感染率不等(2)计算现有样本四格表的和及各组合下四格表的,见表8-4。

本例、。

(3)计算满足条件的各组合下四格表的概率。

(4)计算同时满足和条件的四格表的累计概率。

本例、、、、和满足条件,累计概率为表8-4例8-1的 Fisher确切概率法计算表四格表组合12292-198212183-165220 74-1324319 65-995* 418 56-66* *65177 -337 6 16 3 8 08 7 15 2 9 339 8 14 1 10 6610131199* 为现有样本。

按检验水准不拒绝H0,尚不能认为预防注射与非预防的新生儿HBV的总体感染率不等。

#include<>#include <>#include<> /*清屏*/#include <> /*显示目录*/#include<>#define MAX 80void input(); /*输入数据函数*/void sort();/*排序数据函数*/void sort1();void sort2();void sort3();void display();/*显示数据函数*/void display1();void insert(); /*插入数据函数*/void del(); /*删除数据函数*/void average(); /*平均值函数*/void find();/*查找数据函数*/void find1();void find2();void save(); /*保存数据函数*/void read(); /*读出数据函数*/void del_file(); /*删除文件函数*/ void modify(); /*修改文件函数*/int now_no=0;struct student{int no;char name[20];char sex[4];float score1;float score2;float score3;float sort;float ave;float sum;};struct student stu[MAX],*p;main()/*主函数*/{int as;char ch;do{start: printf("\n\n\n\t\t\t欢迎使用学生成绩管理系统\n");printf("\n\n\n\n\n\n\t\t******************按任意键继续********************");ch=getch();}while(!ch);system("cls");/*一下为功能选择模块*/do{printf("\n\t\t\t\t1.录入学员信息\n\t\t\t\t2.显示学员总成绩信息\n\t\t\t\t3.对总成绩排序\n\t\t\t\t4.显示学员单科成绩排序\n\t\t\t\t5.添加学员信息\n\t\t\t\t6.删除学员信息\n\t\t\t\t7.修改学员信息\n\t\t\t\t8.查询学员信息\n\t\t\t\t9.从文件读入学员信息\n\t\t\t\t10.删除文件中学员信息\n\t\t\t\t11.保存学员信息\n\t\t\t\t12.退出\n");printf("\t\t\t\t选择功能选项(输入所选功能前的数字):");fflush(stdin);/*可用可不用,用于清除缓存防止下次用scanf输入是出现错误*/scanf("%d",&as);switch(as){case 1:system("cls");input();break;case 2:system("cls");display();break;case 3:system("cls");sort();break;case 4:system("cls");display1();break;case 5:system("cls");insert();break;case 6:system("cls");del();break;case 7:system("cls");modify();break;case 8:system("cls");find();break;case 9:system("cls");read();break;case 10:system("cls");del_file();break;case 11:system("cls");save();break;case 12:system("exit");exit(0);default:system("cls");goto start;}}while(1);/*while(1),1表示真,所以while(1)表示永远循环下去,一般在while(1)的循环体内都有break 或者return 跳出循环*//*至此功能选择结束*/}void input()/*原始数据录入模块*/{int i=0;char ch;do{printf("\t\t\t\t1.录入学员信息\n输入第%d个学员的信息\n",i+1);printf("\n输入学生编号:");scanf("%d",&stu[i].no);fflush(stdin);printf("\n输入学员姓名:");fflush(stdin);gets(stu[i].name);printf("\n输入学员性别:");fflush(stdin);gets(stu[i].sex);printf("\n输入学员成绩1:");scanf("%f",&stu[i].score1);printf("\n输入学员成绩2:");fflush(stdin);scanf("%f",&stu[i].score2);printf("\n输入学员成绩3:");fflush(stdin);scanf("%f",&stu[i].score3);printf("\n\n");i++;now_no=i;printf("是否继续输入(Y/N)");fflush(stdin);ch=getch();system("cls");}while(ch!='n'&&ch!='N');system("cls");}void sort()/*排序数据函数*/{struct student temp;int i,j;average();for(i=1;i<now_no;i++){for(j=1;j<=now_no-i;j++){if(stu[j-1].ave<stu[j].ave){temp=stu[j];stu[j]=stu[j-1];stu[j-1]=temp;}}}printf("排序以完成进入功能2可进行显示\n");system("pause");system("cls");}void sort1()/*排序数据函数*/{struct student temp;int i,j;for(i=1;i<now_no;i++){for(j=1;j<=now_no-i;j++){if(stu[j-1].score1<stu[j].score1){temp=stu[j];stu[j]=stu[j-1];stu[j-1]=temp;}}}}void sort2()/*排序数据函数*/{struct student temp;int i,j;for(i=1;i<now_no;i++){for(j=1;j<=now_no-i;j++){if(stu[j-1].score2<stu[j].score2){temp=stu[j];stu[j]=stu[j-1];stu[j-1]=temp;}}}}void sort3()/*排序数据函数*/{struct student temp;int i,j;for(i=1;i<now_no;i++){for(j=1;j<=now_no-i;j++){if(stu[j-1].score3<stu[j].score3){temp=stu[j];stu[j]=stu[j-1];stu[j-1]=temp;}}}}void display()/*显示数据函数*/{int i;char as;average();do{printf("\t\t\t班级学员信息列表\n");printf("\t编号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n");for(i=0;i<now_no&&stu[i].name[0];i++)printf("\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i]. name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave);printf("\t\t按任意键返回主菜单.");fflush(stdin);as=getch();}while(!as);system("cls");}void display1()/*显示数据函数*/{int i;char as;do{printf("\t\t\t班级学员score1成绩排序\n");printf("\t编号\t姓名\t性别\t成绩1\n");sort1();for(i=0;i<now_no&&stu[i].name[0];i++)printf("\t%d\t%s\t%s\t%.2f\t\n",stu[i].no,stu[i].name,stu[i].sex ,stu[i].score1);printf("\t\t\t班级学员score2成绩排序\n");printf("\t编号\t姓名\t性别\t成绩2\n");sort2();for(i=0;i<now_no&&stu[i].name[0];i++)printf("\t%d\t%s\t%s\t%.2f\t\n",stu[i].no,stu[i].name,stu[i].s ex,stu[i].score2);printf("\t\t\t班级学员score3成绩排序\n");printf("\t编号\t姓名\t性别\t成绩3\n");sort3();for(i=0;i<now_no&&stu[i].name[0];i++)printf("\t%d\t%s\t%s\t%.2f\t\n",stu[i].no,stu[i].name,stu[i].s ex,stu[i].score3);printf("\t\t按任意键返回主菜单.");fflush(stdin);as=getch();}while(!as);system("cls");}void insert()/*插入数据函数*/{char ch;do{printf("\n\t\t输入新插入学员队信息\n");printf("\n输入学生编号:");scanf("%d",&stu[now_no].no);fflush(stdin);printf("\n输入学员姓名:");fflush(stdin);gets(stu[now_no].name);printf("\n输入学员性别:");fflush(stdin);gets(stu[now_no].sex);printf("\n输入学员成绩1:");fflush(stdin);scanf("%f",&stu[now_no].score1);printf("\n输入学员成绩2:");fflush(stdin);scanf("%f",&stu[now_no].score2);printf("\n输入学员成绩3:");fflush(stdin);scanf("%f",&stu[now_no].score3);printf("\n\n");now_no=now_no+1;sort();printf("是否继续输入(Y/N)");fflush(stdin);ch=getch();system("cls");}while(ch!='n'&&ch!='N');}void del()/*删除数据函数*/{int inum,i;printf("输入要删除学员的编号:");fflush(stdin);scanf("%d",&inum);for(i=0;i<now_no;i++){if(stu[i].no==inum){if(i==now_no)now_no-=1;else{stu[i]=stu[now_no-1];now_no-=1;}sort();break;}}system("cls");}void save()/*保存数据函数*/{FILE *fp;int i;char filepath[20];printf("输入要保存的文件路径:");fflush(stdin);gets(filepath);if((fp=fopen(filepath,"w"))==NULL){printf("\n保存失败!");exit(0);}for(i=0;i<now_no;i++){stu[i].sum=stu[i].score1+stu[i].score2+stu[i].score3;stu[i].ave=stu[i].sum/3;fprintf(fp,"\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i] .no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave );}fclose(fp);printf("学生信息已保存在%s中!\n",filepath);system("pause");system("cls");}void find()/*查询函数*/{int i;char str[20],as;do{printf("输入要查询的学生姓名:");fflush(stdin);gets(str);for(i=0;i<now_no;i++)if(!strcmp(stu[i].name,str)){printf("\t编号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n");printf("\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no, stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave);}printf("\t\t按任意键返回主菜单.");fflush(stdin);as=getch();}while(!as);system("cls");}void average()/*求平均数*/{int i;for(i=0;i<now_no;i++){stu[i].sum=stu[i].score1+stu[i].score2+stu[i].score3;stu[i].ave=stu[i].sum/3;}}void modify()/*修改数据函数*/{int i;char str[20];printf("输入要修改的学生姓名:");fflush(stdin);gets(str);for(i=0;i<now_no;i++){if(!strcmp(stu[i].name,str)){system("cls");printf("\n\t\t输入新插入学员队信息\n");printf("\n输入学生编号:");fflush(stdin);scanf("%d",&stu[i].no);printf("\n输入学员性别:");fflush(stdin);gets(stu[i].sex);printf("\n输入学员成绩1:");fflush(stdin);scanf("%f",&stu[i].score1);printf("\n输入学员成绩2:");fflush(stdin);scanf("%f",&stu[i].score2);printf("\n输入学员成绩3:");fflush(stdin);scanf("%f",&stu[i].score3);printf("\n\n");sort();break;}}system("cls");}void read(){FILE *fp;int i;char filepath[20];printf("输入要读入的文件路径:");fflush(stdin);gets(filepath);if((fp=fopen(filepath,"r"))==NULL){printf("找不到%s文件!\n",filepath);system("pause");exit(0);}now_no=0;for(i=0;i<MAX&&!feof(fp);i++){fscanf(fp,"\t%d\t%s\t%s\t%f\t%f\t%f\t%f\n",&stu[i].no,stu[i].name,st u[i].sex,&stu[i].score1,&stu[i].score2,&stu[i].score3,&stu[i].ave);now_no++;}fclose(fp);printf("保存的在文件%s中的所有信息已经读入!\n",filepath);system("pause"); /*按任意键继续*/system("cls");}void del_file(){FILE *fp;char filepath[20];printf("输入要删除的文件路径:");fflush(stdin);gets(filepath);fp=fopen(filepath,"w");fclose(fp);printf("保存的在文件%s中的所有信息已经删除!\n",filepath); system("pause");system("cls");}。

相关主题