《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 用Excel中的VBA編寫卡方測(cè)算相關(guān)程序
用Excel中的VBA編寫卡方測(cè)算相關(guān)程序
來源:微型機(jī)與應(yīng)用2012年第19期
楊振宇1,2,楊海智3,楊信東1,4
(1.吉林農(nóng)業(yè)大學(xué) 農(nóng)學(xué)院,吉林 長(zhǎng)春 130118; 2.吉林省農(nóng)業(yè)科學(xué)院大豆所,吉林 公主嶺
摘要: 采用基于Excel的VBA編程方法,編寫了“卡平方測(cè)算”有關(guān)程序,經(jīng)教學(xué)科研工作中使用,獲得了理想的效果。介紹了該程序的源代碼及使用方法,供廣大科教人員下載使用。
Abstract:
Key words :

摘  要: 采用基于ExcelVBA編程方法,編寫了“卡平方測(cè)算”有關(guān)程序,經(jīng)教學(xué)科研工作中使用,獲得了理想的效果。介紹了該程序的源代碼及使用方法,供廣大科教人員下載使用。
關(guān)鍵詞: Excel;VBA編程;卡方檢驗(yàn)

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

Private Sub CommandButton1_Click()
Dim n As Integer
n=InputBox("請(qǐng)輸入數(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="實(shí)測(cè)值a0"
Cells(1,4).Value="理論值al"
Cells(1,5).Value="卡平方值x2"
For i=1 To n
a0(i)=InputBox("請(qǐng)輸入實(shí)測(cè)值的第"& i &"個(gè)樣本值")
Cells(1+i,3).Value=a0(i)
Next i
For i=1 To n
al(i)=InputBox("請(qǐng)輸入理論值的第"& i &"個(gè)樣本值")
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 用于獨(dú)立性檢驗(yàn)的卡平方計(jì)算程序
1.2.1 2×2表的獨(dú)立性測(cè)驗(yàn)

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("請(qǐng)輸入A事件效果1數(shù)字a=?")
Cells(1,1).Value="A事件效果1數(shù)a"
Cells(2,1).Value=a
b=InputBox("請(qǐng)輸入B事件效果1數(shù)字b=?")
Cells(1,2).Value="B事件效果1數(shù)字b"
Cells(2,2).Value=b
a0=InputBox("請(qǐng)輸入A事件效果2數(shù)字a0=?")
Cells(1,3).Value="A事件效果2數(shù)a0"
Cells(2,3).Value=a0
b0=InputBox("請(qǐng)輸入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表的獨(dú)立性測(cè)驗(yàn)
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("請(qǐng)輸入數(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("請(qǐng)輸入A事件數(shù)值的第("& i &")            個(gè)樣本a0("& i &")=?")
Cells(1+i,3).Value=a0(i)
b0(i)=InputBox("請(qǐng)輸入B事件數(shù)值的第("& i &")            個(gè)樣本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
1.2.3 r×c表的獨(dú)立性測(cè)驗(yàn)
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("請(qǐng)輸入數(shù)據(jù)組數(shù)C=?")
Cells(1,2).Value=("數(shù)據(jù)組數(shù)C")
Cells(2,2).Value=C
R=InputBox("請(qǐng)輸入數(shù)據(jù)組數(shù)R=?")
Cells(1,3).Value=("數(shù)據(jù)組數(shù)R")
Cells(2,3).Value=R
Cells(1,4).Value=" Gi數(shù)值"
Cells(1,5).Value=" Kj數(shù)值"
Cells(1,6).Value=" 所有數(shù)字之和,n"
For i=1 To C
For j=1 To R
a(i,j)=InputBox("請(qǐng)輸入第(" & i & ")行,第("& j         & ")列的樣本數(shù)值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 “卡平方測(cè)算”VBA程序的應(yīng)用步驟:

 


?。?)運(yùn)行環(huán)境:Win2003、WinXP、Win2000等。
?。?)VBA程序的應(yīng)用步驟:打開Excel“EC50、EC90測(cè)算”程序工作簿(在此過程中,若計(jì)算機(jī)屏幕顯示對(duì)話框,則應(yīng)選擇并點(diǎn)擊“啟用宏”),單擊(程序運(yùn)行命令)按鈕(本程序中該按鈕上面寫著“計(jì)算”),則程序開始運(yùn)行計(jì)算機(jī),屏幕依次出現(xiàn)對(duì)話框,按對(duì)話框所提問題逐個(gè)輸入數(shù)據(jù),輸完后瞬間即在程序工作簿頁(yè)面上顯示輸出結(jié)果(包括卡平方值)。
?。?)“卡平方測(cè)算”VBA程序的下載及拷貝方法:①下載源程序的方法參見文獻(xiàn)[6-7];②“卡平方測(cè)算” 文件的再拷貝:上述工作完成后,此Excel文件即成為一個(gè)工作模板,可以任意復(fù)制、粘貼或通過e-mail郵寄等方式進(jìn)行傳播和拷貝。
 本Excel文件所占內(nèi)存約為60 KB,與其他有類似功能的程序相比要小得多。上述4個(gè)程序也可以組合成一個(gè)較大的程序,但從應(yīng)用角度考慮,這樣做會(huì)浪費(fèi)計(jì)算機(jī)的內(nèi)部資源(因?yàn)槭孪嚷暶髁溯^多在當(dāng)次運(yùn)算中并不使用的變量),故本文未這樣處理。
參考文獻(xiàn)
[1] 武曉玲,周斌,孫石,等.大豆對(duì)大豆疫霉菌株P(guān)m14抗性的遺傳分析及基因定位[J].中國(guó)農(nóng)業(yè)科學(xué),2011,44(3):456-460.
[2] 王保通,李強(qiáng),胡茂林,等.小麥品種Libellula和N. strampelli抗條銹病主效、微效基因遺傳分析[J].植物病理學(xué)報(bào),2010,40(3):300-306.
[3] 張宏,任志龍,胡銀崗,等.陜麥139抗條銹病基因遺傳分析[J].作物學(xué)報(bào),2010,36(1):109-114.
[4] 何麗華,牛寶龍,齊曉朋,等.棉鈴蟲成蟲體色突變體的發(fā)現(xiàn)及其遺傳分析[J].核農(nóng)學(xué)報(bào),2007(4):397-400.
[5] 楊振宇,王曉麗,張曉波,等.部分抗SMV大豆品種成株抗性基因?qū)?shù)分析[J].吉林農(nóng)業(yè)大學(xué)學(xué)報(bào),2011,33(6):591-594.
[6] 龔瑞,楊炬,黎唏,等.2007-2010年度寧夏流感監(jiān)測(cè)結(jié)果分析[J].寧夏醫(yī)學(xué)雜志,2011,33(3):222-224.
[7] 錢峰.基于卡方檢驗(yàn)的國(guó)內(nèi)外知識(shí)管理研究熱點(diǎn)比較[J].情報(bào)雜志,2008(9):56-58.
[8] 徐向陽.卡方檢驗(yàn)在學(xué)生成績(jī)差異性分析中的應(yīng)用[J].常州技術(shù)師范學(xué)院學(xué)報(bào),2001,7(4):13-16.
[9] 蓋鈞鎰.試驗(yàn)統(tǒng)計(jì)方法[M].北京,中國(guó)農(nóng)業(yè)出版社,2000.
[10] 詹秋文.Excel和SAS在生物統(tǒng)計(jì)學(xué)的應(yīng)用比較[J].生物學(xué)雜志,2009,26(1):74-75,83.
[11] 向窮,施樹良,李鈺.常用統(tǒng)計(jì)軟件在生物統(tǒng)計(jì)中的應(yīng)用比較[J].現(xiàn)代生物醫(yī)學(xué)進(jìn)展,2009,9(9):1775-1777,1789.
[12] 唐啟義,馮明光.實(shí)用統(tǒng)計(jì)分析及其DPS數(shù)據(jù)處理系統(tǒng)[M].北京:科學(xué)出版社,2002:188-95.
[13] 譚永強(qiáng),余華強(qiáng),陳橋生,等.利用Excel軟件建立卡方檢驗(yàn)分析模板在農(nóng)業(yè)統(tǒng)計(jì)中的應(yīng)用[J].湖北農(nóng)業(yè)科學(xué),2010,49(12):3192-3195.
[14] 龔沛曾,陸慰民.Visual Basic程序設(shè)計(jì)教程(6.0版)[M].北京:高等教育出版社,2001.
[15] 李曉玫,楊小平.Excel中的VBA程序設(shè)計(jì)[J].四川師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2004(4):423-426.
[16] 馬海霞,劉 影,王艷紅,等.用EXCEL中的VBA編寫“多項(xiàng)式的三角函數(shù)擬合單峰曲線”程序[J].菌物研究,2009,7(3-4):195-200.
[17] 段顯德,王艷紅,楊信東.用EXCEL中的VBA編寫“試卷分析”程序[J].通化師范學(xué)院學(xué)報(bào),2010,31(8):52-53.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。