使用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