首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用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 Sub1.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个程序也可以组合成一个较大的程序,但从应用角度考虑,这样做会浪费计算机的内部资源(因为事先声明了较多在当次运算中并不使用的变量),故本文未这样处理。
返回列表