使用python 批量 配對t檢驗 醫學 基礎研究 數據分析


需要excel數據源文件的請去http://download.csdn.net/download/camelbrand/10216783下載,只保留少數列的數據,剩余的2000多個數據已經被我刪除了。

幫學醫的同學弄完一個python數據處理的程序,怕以后忘記了,記錄下來

t檢驗是計量資料的假設檢驗中最為簡單常用的,當樣本含量n較小時,比如n小於60。配對t檢驗又稱成對t檢驗,適用於配對設計的計量資料。配對設計是將受試對象按照某些重要特征,如可疑混雜因素性別等配成對子,每對中的兩個受試對象隨機分配到兩處理組。

要計算的部分數據如下,從列LINC01587開始,一共有2027列數據:

其中Solid Tissue Normal和Primary Tumor是一對,如第2行和第3行是一對,第4行和第5行是一對,以此類推。需要完成的工作是從LINC01587開始,計算該列的數據的差異有無統計學意義。通常使用的spss工具來計算,安裝IBM SPSS Statics之后,先來個demo學習計算LINC01587演示下。

1.啟動IBM SPSS Statics,選擇輸入數據,點擊確定

2.彈出界面中,新建變量視圖,如下圖所示填入參數Solid代表Solid Tissue Normal

Primary代表Primary Tumor,然后點擊數據視圖

按照上面的表格數據,將列LINC01587以此填入,如下圖所示,其中0E-13表示為0

3.點擊分析,選擇比較均值,然后選擇配對樣本T檢驗

 

彈出界面中,按下鍵盤上的Ctrl鍵,然后依次選中左邊紅色框內的Solid和Primary,然后點擊右邊紅框內的的箭頭

 

如上圖所示,點擊確定,SPSS輸出計算結果如下,其中右下角紅色框內的是我們需要的結果。

上圖計算得到的p值是0.188。

第一個表格是數據的基本描述。

第二個是數據前后變化的相關系數,那個概率P值是相關系數的概率值,概率大於顯著性水平0.05,則說明數據變化前后沒有顯著的線性變化,線性相關程度較弱。

第三個表格是數據相減后與0的比較,通過概率值為0,小於顯著性水平0.05,則拒絕原假設,相減的差值與0有較大差別,則表明數據變化前后有顯著的變化。

 

但是數據源有2027列數據都需要計算,工作量巨大,可以考慮使用python來完成這部分工作。

那么我們設計python程序需要完成的工作包括:

1.打開excel數據文件,並讀取文件數據

2.依次對所有列數據進行計算,並輸出p值計算結果。

地址為http://blog.csdn.net/hjh00/article/details/48530183的博客,最后一部分內容給出了如何使用python完成配對t檢驗的程序

使用python開發程序,首先需要安裝python,本人的電腦上已經安裝了python的開發環境,具體配置參考python教程(按照這個教程一步一步來學習入門)https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

配置好python之后,在windows CMD命令行輸入python,顯示我的python版本號是 Python 3.6.1

上面博客給出的配對t檢驗計算程序如下圖,但是安裝好python之后,可能電腦上並沒有scipy.stats,為了安裝scipy(后面部門的excel處理功能可能也沒有安裝),可以參考網址:

https://www.cnblogs.com/babyfei/p/7080047.html?utm_source=itdadao&utm_medium=referral

安裝好python開發環境之后,要完成上面SPSS計算的工作,我們只需要列出下,加了#號的都是注釋,不會執行,我的程序只是把列表變量a和b替換成列LINC01587的數據,其中a是Solid Tissue Normal,b代表Primary Tumor

# http://blog.csdn.net/hjh00/article/details/48530183
from scipy.stats import ttest_rel  
#a = [3,4,1,1,1,3,3,6,5,1,4,5,4,4,3,6,7,7,7,8]  
#b = [7,6,7,8,7,6,5,6,4,2,5,4,3,6,7,5,4,3,8,7]  
a = [0.1934107598010,0.0894060200161,0.0718704187628,0.3608183477340,0.0367125061353,0,0.1279727464080,0]
b=  [0,0.0736396246482,0.0427039152731,0,0.0701365405069,0.0104761411961,0.1097963382500,0.0093947227584]
t,p=ttest_rel(a,b)  
print (t  )
print (p  )

執行上面的程序,分別打印t和p,紅色框內的p值與上面SPSS計算的p值結果一致:

那么接下來的工作只需要設計使用python對excel文件進行處理的部分了,我的代碼如下(實際調試我使用了軟件Geany作為編輯器,可以很方便的編輯和運行python程序):

 1 # -*- coding: utf-8 -*- 
 2 import  xdrlib ,sys
 3 import xlrd
 4 from scipy.stats import ttest_rel  
 5 
 6 #打開excel文件
 7 def open_excel(file= 'test.xlsx'):
 8     try:
 9         data = xlrd.open_workbook(file)
10         return data
11     except Exception as e:
12         print (str(e))
13 
14 #根據名稱獲取Excel表格中的數據   參數:file:Excel文件路徑     colnameindex:表頭列名所在行的索引  ,by_name:Sheet1名稱
15 def excel_table_byname(file= 'test.xlsx', colnameindex=0, by_name=u'Sheet1'):    
16     data = open_excel(file) #打開excel文件
17     table = data.sheet_by_name(by_name) #根據sheet名字來獲取excel中的sheet
18     nrows = table.nrows #行數 
19     nCol = table.ncols  #列數
20     print("row count is",nrows)
21     print("colume count is",nCol)
22     colnames = table.row_values(colnameindex) #某一行數據 
23     list =[] #裝讀取結果的序列
24     for rownum in range(0, nrows): #遍歷每一行的內容
25          row = table.row_values(rownum) #根據行號獲取行
26          if row: #如果行存在
27              app = [] #一行的內容
28              for i in range(len(colnames)): #一列列地讀取行的內容
29                 app.append(row[i])
30              list.append(app) #裝載數據
31            
32     return list
33     
34 def get_col(table,col,fstStr):
35     listdata = []
36     #sprint(col,type(col))
37     for row in table:
38         if(row[0]==fstStr):
39             listdata.append(row[col])        
40     return listdata            
41 
42 #主函數
43 def main():
44    tables = excel_table_byname()
45    f = open("./excel.txt", 'w+')  
46    print("main function", file=f)
47    print(type(tables), file=f) 
48    TotalCol = len(tables[0])  
49    #for row in tables:
50        #print (row)
51    p_result = [];   
52    for n in range(8,TotalCol):
53        print("calculate",n, file=f)       
54        list1 = get_col(tables,n,"Solid Tissue Normal")
55        list2 = get_col(tables,n,"Primary Tumor")
56        t,p=ttest_rel(list1,list2)
57        p_result.append(p)  
58    print("calc over", file=f)
59    print(p_result, file=f)
60 if __name__=="__main__":
61     main()

針對其他格式不一致的表格,改程序未必生效,比較關鍵的參數是38行row[0]中的0,以及52行的數字8,都是根據excel表內容自定義寫入的。

print(xxx,file=f)的結果會輸出到python程序文件所在目錄的excel.txt文本文檔中,輸出結果如下,最后一行就是從LINC01587列開始計算的p值,nan表示該列數據計算的p無效

main function
<class 'list'>
calculate 8
calculate 9
calculate 10
calculate 11
calculate 12
calculate 13
calc over
[0.18763370952460945, 0.6178834746354206, 0.45183198301444494, nan, nan, 0.3665736965096091]

后續還可以直接使用python將計算結果寫入excel表中,我這里只做到了通過txt文本打印輸出。如果有時間,可以繼續開發研究一下。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

my mail:shaw2321@163.com

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM