需要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
