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

  • 相关阅读:
    ASP.NET登录记住用户名
    .NET枚举类型转为List类型
    display:inline-block 去除间隙
    sublime text 3 常用快捷键 、常用插件
    使用背景图代码
    Photo Shop 修改、维护
    前端协作流程
    Photo Shop切图
    Photo Shop 设置
    Flex 弹性布局
  • 原文地址:https://www.cnblogs.com/codecamel/p/8324695.html
Copyright © 2020-2023  润新知