用Excel中的VBA編寫卡方測算相關(guān)程序
在生命科學(xué)及社會科學(xué)研究中,卡方(χ2)檢驗是最常用的統(tǒng)計分析方法之一[1-8]??ǚ剑?chi;2)檢驗是次數(shù)資料的顯著性檢驗方法,包括適合性檢驗和獨立性檢驗兩類[9]。適合性檢驗用于檢驗?zāi)承誀钣^察次數(shù)與該性狀的理論比率是否符合,如在遺傳分析中研究兩對性狀雜種后代的分離現(xiàn)象是否符合某一特定比率;而獨立性檢驗是用于判斷兩類因子是彼此相關(guān)還是相互獨立的,如:采用某種措施與預(yù)防某種災(zāi)害的關(guān)系。
卡平方的計算很復(fù)雜,但隨著計算機(jī)與統(tǒng)計軟件的普及,應(yīng)用計算機(jī)計算卡平方成為最準(zhǔn)確可靠的方法,各種大型統(tǒng)計軟件如SAS、SPSS、DPS等均應(yīng)用于卡平方的測算[10-12],一些研究者也研發(fā)了在Excel上編制運算表來實現(xiàn)卡平方測算的方法[13]。
使用如SAS、SPSS、DPS等大型統(tǒng)計軟件需要有較高花費;采用R統(tǒng)計軟件來編程進(jìn)行卡平方測算要求研究者有較強(qiáng)學(xué)術(shù)底蘊和計算機(jī)編程能力。這在客觀上限制了SAS、SPSS、DPS、R等統(tǒng)計軟件的普及應(yīng)用。Excel作為 Microsoft Office 家族成員,由于多數(shù)學(xué)生和科研人員都具有Excel基礎(chǔ)知識,采用Excel軟件計算卡平方無需考慮運行環(huán)境而受到歡迎。然而,采用編制運算表的方法還是讓人感到有些繁鎖,不易學(xué)習(xí)使用。鑒于此,本文采用一種基于Excel的VBA編程方法[14-15],編寫了“卡平方測算”相關(guān)程序,可在所有配備Office 2000以上版本的計算機(jī)上使用。“卡平方測算”在VBA程序運算時只需輸入最原始的數(shù)據(jù),應(yīng)用步驟實行最直觀的人機(jī)對話,任何初學(xué)者都可以即學(xué)即用輕松地掌握程序的使用方法;編寫完的程序成為工作模板后,可以任意復(fù)制或通過e-mail郵寄等方式進(jìn)行傳播、拷貝,因此這種方法受到使用者的一致好評。
本文介紹了該程序的源代碼及使用方法,讓所有不方便使用大型統(tǒng)計軟件的同行都可分享這些程序帶來的所有便利。
1 VBA程序源代碼
1.1 用于適合性檢驗的卡平方計算程序
Private Sub CommandButton1_Click()
Dim n As Integer
n=InputBox(請輸入數(shù)據(jù)組數(shù)n=?)
Cells(1,2).Value=(數(shù)據(jù)組數(shù)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數(shù)字a=?)
Cells(1,1).Value=A事件效果1數(shù)a
Cells(2,1).Value=a
b=InputBox(請輸入B事件效果1數(shù)字b=?)
Cells(1,2).Value=B事件效果1數(shù)字b
Cells(2,2).Value=b
a0=InputBox(請輸入A事件效果2數(shù)字a0=?)
Cells(1,3).Value=A事件效果2數(shù)a0
Cells(2,3).Value=a0
b0=InputBox(請輸入B事件效果2數(shù)字b0=?)
Cells(1,4).Value=B事件效果2數(shù)字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(請輸入數(shù)據(jù)組數(shù)C=?)
Cells(1,2).Value=(數(shù)據(jù)組數(shù)C)
Cells(2,2).Value=C
Cells(1,3).Value=A事件數(shù)值a0
Cells(1,4).Value=B事件數(shù)值b0
Cells(1,5).Value=a(i)+b(i)
R1=0]:R2=0
For i=1 To C
a0(i)=InputBox(請輸入A事件數(shù)值的第( i ) 個樣本a0( i )=?)
Cells(1+i,3).Value=a0(i)
b0(i)=InputBox(請輸入B事件數(shù)值的第( 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事件數(shù)值之和,R1
Cells(1,7).Value=B事件數(shù)值之和,R2
Cells(1,8).Value=AB事件所有數(shù)值之和,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
評論