摘 要:采用基于Excel的VBA编程方法,编写了“卡平方测算”有关程序,经教学科研工作中使用,获得了理想的效果。介绍了该程序的源代码及使用方法,供广大科教人员下载使用。
关键词:Excel;VBA编程;卡方检验
在生命科学及社会科学研究中,卡方(χ2)检验是最常用的统计分析方法之一[1-8]。卡方(χ2)检验是次数资料的显著性检验方法,包括适合性检验和独立性检验两类[9]。适合性检验用于检验某性状观察次数与该性状的理论比率是否符合,如在遗传分析中研究两对性状杂种后代的分离现象是否符合某一特定比率;而独立性检验是用于判断两类因子是彼此相关还是相互独立的,如:采用某种措施与预防某种灾害的关系。
卡平方的计算很复杂,但随着计算机与统计软件的普及,应用计算机计算卡平方成为最准确可靠的方法,各种大型统计软件如SAS、SPSS、DPS等均应用于卡平方的测算[10-12],一些研究者也研发了在Excel上编制运算表来实现卡平方测算的方法[13]。
使用如SAS、SPSS、DPS等大型统计软件需要有较高花费;采用R统计软件来编程进行卡平方测算要求研究者有较强学术底蕴和计算机编程能力。这在客观上限制了SAS、SPSS、DPS、R等统计软件的普及应用。Excel作为 Microsoft Office 家族成员,由于多数学生和科研人员都具有Excel基础知识,采用Excel软件计算卡平方无需考虑运行环境而受到欢迎。然而,采用编制运算表的方法还是让人感到有些繁锁,不易学习使用。鉴于此,本文采用一种基于Excel的VBA编程方法[14-15],编写了“卡平方测算”相关程序,可在所有配备Office 2000以上版本的计算机上使用。“卡平方测算”在VBA程序运算时只需输入最原始的数据,应用步骤实行最直观的人机对话,任何初学者都可以即学即用轻松地掌握程序的使用方法;编写完的程序成为工作模板后,可以任意复制或通过e-mail邮寄等方式进行传播、拷贝,因此这种方法受到使用者的一致好评。
本文介绍了该程序的源代码及使用方法,让所有不方便使用大型统计软件的同行都可分享这些程序带来的所有便利。
1 VBA程序源代码
1.1 用于适合性检验的卡平方计算程序
Private Sub CommandButton1_Click()
Dim n As Integer
n=InputBox("请输入数据组数n=?")
Cells(1,2).Value=("数据组数n")
Cells(2,2).Value=n
Dim a0(0 To 99)As Single
Dim al(0 To 99)As Single
Dim x2 As Integer
Cells(1,3).Value="实测值a0"
Cells(1,4).Value="理论值al"
Cells(1,5).Value="卡平方值x2"
For i=1 To n
a0(i)=InputBox("请输入实测值的第"& i &"个样本值")
Cells(1+i,3).Value=a0(i)
Next i
For i=1 To n
al(i)=InputBox("请输入理论值的第"& i &"个样本值")
Cells(1+i,4).Value=al(i)
Next i
x=0
For i=1 To n
x=x+((a0(i)-al(i))^2)/al(i)
Next i
Cells(2,5).Value=x
End Sub
1.2 用于独立性检验的卡平方计算程序
1.2.1 2×2表的独立性测验
Private Sub CommandButton1_Click()
Dim a As Integer :Dim b As Integer:Dim a0 As Integer:Dim b0 As Integer
Dim n As Integer
Dim a1 As Single:Dim b1 As Single:Dim a01 As Single:Dim b01 As Single
Dim E11 As Single:Dim E12 As Single:Dim E21 As Single:Dim E22 As Single
Dim c1 As Single:Dim c2 As Single:Dim c3 As Single:Dim c4 As Single
Dim x As Single
a=InputBox("请输入A事件效果1数字a=?")
Cells(1,1).Value="A事件效果1数a"
Cells(2,1).Value=a
b=InputBox("请输入B事件效果1数字b=?")
Cells(1,2).Value="B事件效果1数字b"
Cells(2,2).Value=b
a0=InputBox("请输入A事件效果2数字a0=?")
Cells(1,3).Value="A事件效果2数a0"
Cells(2,3).Value=a0
b0=InputBox("请输入B事件效果2数字b0=?")
Cells(1,4).Value="B事件效果2数字b0"
Cells(2,4).Value=b0
n=a0+b0+a+b
aa0=a+a0:bb0=b+b0:ab=a+b:a0b0=a0+b0
E11=aa0*ab/n:E12=aa0*a0b0/n
E21=bb0*ab/n:E22=bb0*a0b0/n
c1=Abs(a-E11):c2=Abs(a0-E12):c3=Abs(b-E21):c4=Abs(b0-E22)
x=((c1-0.5)^2)/E11+((c2-0.5)^2)/E12+((c3-0.5) ^2)/E21+((c4-0.5)^2)/E22
Cells(1,5).Value="卡平方值x2"
Cells(2,5).Value=x
End Sub
1.2.2 2×c表的独立性测验
Private Sub CommandButton1_Click()
Dim C As Integer :Dim R As Single :Dim d As Single:Dim h As Single
Dim x As Single
Dim a0(0 To 99) As Single :Dim b0(0 To 99) As Single:Dim g(0 To 99) As Single
C=InputBox("请输入数据组数C=?")
Cells(1,2).Value=("数据组数C")
Cells(2,2).Value=C
Cells(1,3).Value="A事件数值a0"
Cells(1,4).Value="B事件数值b0"
Cells(1,5).Value="a(i)+b(i)"
R1=0]:R2=0
For i=1 To C
a0(i)=InputBox("请输入A事件数值的第("& i &") 个样本a0("& i &")=?")
Cells(1+i,3).Value=a0(i)
b0(i)=InputBox("请输入B事件数值的第("& i &") 个样本b0(" & i & ")=?")
Cells(1+i,4).Value=b0(i)
g(i)=a0(i)+b0(i)
Cells(1+i,5).Value=g(i)
R1=R1+a0(i):R2=R2+b0(i)
Next i
R=R1+R2
Cells(1,6).Value="A事件数值之和,R1"
Cells(1,7).Value="B事件数值之和,R2"
Cells(1,8).Value="AB事件所有数值之和,R"
Cells(2,6).Value=R1:Cells(2,7).Value=R2:Cells (2,8).Value=R
h=0
For i=1 To C
h=h+a0(i)^2/g(i)
Next i
x=(h - R1 ^ 2 / R) * R ^ 2 / R1 / R2
Cells(1,9).Value=" 卡平方值x2"
Cells(2,9).Value=x
End Sub
1.2.3 r×c表的独立性测验
Private Sub CommandButton1_Click()
Dim C As Integer:Dim R As Integer :Dim n As Single:Dim h As Single
Dim x As Single
Dim a(0 To 99,0 To 99) As Single
Dim g(0 To 99) As Single
Dim k(0 To 99) As Single
C=InputBox("请输入数据组数C=?")
Cells(1,2).Value=("数据组数C")
Cells(2,2).Value=C
R=InputBox("请输入数据组数R=?")
Cells(1,3).Value=("数据组数R")
Cells(2,3).Value=R
Cells(1,4).Value=" Gi数值"
Cells(1,5).Value=" Kj数值"
Cells(1,6).Value=" 所有数字之和,n"
For i=1 To C
For j=1 To R
a(i,j)=InputBox("请输入第(" & i & ")行,第("& j & ")列的样本数值a(i,j)=?")
Next j
Next i
For i=1 To C
For j=1 To R
g(i)=g(i)+a(i,j)
Cells(1+i,4).Value=g(i)
Next j
Next i
For j=1 To R
For i=1 To C
k(j)=k(j)+a(i,j)
Cells(1+j,5).Value=k(j)
Next i
Next j
For i=1 To C
n=n+g(i)
Next i
Cells(2,6).Value=n
h=0
For i=1 To C
For j=1 To R
h=h+a(i,j)^2/g(i)/k(j)
Next j
Next i
x=n * (h-1)
Cells(1,9).Value=" 卡平方值x2"
Cells(2,9).Value=x
End Sub
2 “卡平方测算”VBA程序的应用步骤:
(1)运行环境:Win2003、WinXP、Win2000等。
(2)VBA程序的应用步骤:打开Excel“EC50、EC90测算”程序工作簿(在此过程中,若计算机屏幕显示对话框,则应选择并点击“启用宏”),单击(程序运行命令)按钮(本程序中该按钮上面写着“计算”),则程序开始运行计算机,屏幕依次出现对话框,按对话框所提问题逐个输入数据,输完后瞬间即在程序工作簿页面上显示输出结果(包括卡平方值)。
(3)“卡平方测算”VBA程序的下载及拷贝方法:①下载源程序的方法参见文献[6-7];②“卡平方测算” 文件的再拷贝:上述工作完成后,此Excel文件即成为一个工作模板,可以任意复制、粘贴或通过e-mail邮寄等方式进行传播和拷贝。
本Excel文件所占内存约为60 KB,与其他有类似功能的程序相比要小得多。上述4个程序也可以组合成一个较大的程序,但从应用角度考虑,这样做会浪费计算机的内部资源(因为事先声明了较多在当次运算中并不使用的变量),故本文未这样处理。
参考文献
[1] 武晓玲,周斌,孙石,等.大豆对大豆疫霉菌株Pm14抗性的遗传分析及基因定位[J].中国农业科学,2011,44(3):456-460.
[2] 王保通,李强,胡茂林,等.小麦品种Libellula和N. strampelli抗条锈病主效、微效基因遗传分析[J].植物病理学报,2010,40(3):300-306.
[3] 张宏,任志龙,胡银岗,等.陕麦139抗条锈病基因遗传分析[J].作物学报,2010,36(1):109-114.
[4] 何丽华,牛宝龙,齐晓朋,等.棉铃虫成虫体色突变体的发现及其遗传分析[J].核农学报,2007(4):397-400.
[5] 杨振宇,王晓丽,张晓波,等.部分抗SMV大豆品种成株抗性基因对数分析[J].吉林农业大学学报,2011,33(6):591-594.
[6] 龚瑞,杨炬,黎唏,等.2007-2010年度宁夏流感监测结果分析[J].宁夏医学杂志,2011,33(3):222-224.
[7] 钱峰.基于卡方检验的国内外知识管理研究热点比较[J].情报杂志,2008(9):56-58.
[8] 徐向阳.卡方检验在学生成绩差异性分析中的应用[J].常州技术师范学院学报,2001,7(4):13-16.
[9] 盖钧镒.试验统计方法[M].北京,中国农业出版社,2000.
[10] 詹秋文.Excel和SAS在生物统计学的应用比较[J].生物学杂志,2009,26(1):74-75,83.
[11] 向穷,施树良,李钰.常用统计软件在生物统计中的应用比较[J].现代生物医学进展,2009,9(9):1775-1777,1789.
[12] 唐启义,冯明光.实用统计分析及其DPS数据处理系统[M].北京:科学出版社,2002:188-95.
[13] 谭永强,余华强,陈桥生,等.利用Excel软件建立卡方检验分析模板在农业统计中的应用[J].湖北农业科学,2010,49(12):3192-3195.
[14] 龚沛曾,陆慰民.Visual Basic程序设计教程(6.0版)[M].北京:高等教育出版社,2001.
[15] 李晓玫,杨小平.Excel中的VBA程序设计[J].四川师范大学学报(自然科学版),2004(4):423-426.
[16] 马海霞,刘 影,王艳红,等.用EXCEL中的VBA编写“多项式的三角函数拟合单峰曲线”程序[J].菌物研究,2009,7(3-4):195-200.
[17] 段显德,王艳红,杨信东.用EXCEL中的VBA编写“试卷分析”程序[J].通化师范学院学报,2010,31(8):52-53.