一个数据筛选的小程序
  • 题目:
    • 某疾病组女性A月经失调比例高于对照疾病组B。这是一个值得报道的结果。但是,A组女性的年龄也显著低于B组。
    • 已知年龄会对月经规律性造成影响,那么A组的阳性结果是否是因为年龄差异呢?
  • 设想:
    • 为了回答这一问题,最好能找到年龄差异不大的人群进行比较。
    • 因此,我设想用程序随机删除A组中年龄较小的患者,使得两组最终年龄差距在不显著的程度,再观察两组是否存在差异
  • 实现随机删除的手段:
    • 为A组设立随机数,然后再符合条件的病例中,删除随机数最小的一个。
  • 工具(痛点):

    • mysql数据库
    • numpy统计处理,mean
    • scipy统计处理,t-test
  • mysql的问题在于数据类型“?”,“%s”,“%d(大误)”,“%r(大误)”等,傻傻搞不清楚

    • 初学总结,不管什么数据类型,一律“%s”,最不易出错。
  • numpy/scipy的安装

    • (win10/python2.7)
    • pip install numpy报错Unable to find vcvarsall.bat,找不到microsoft visual c++
    • 尝试过多种办法如

      • 安装microsoft visual c++ compiler package for python27
      • 安装打包的数据分析包Anaconda(大误,不能与原来的python一起用)
      • 下载numpy包手动安装
      • 更改VS90COMNTOOLS的指向等,都没有用。
      • 最后发现下面这个方法可行:

        • After doing a lot of things, I upgraded pip, setuptools and virtualenv.

          python -m pip install -U pip
          pip install -U setuptools
          pip install -U virtualenv
          
        • I did steps 1, 2 in my virtual environment as well as globally. Next, I installed the package through pip and it worked.
      • scipy安装使用pip也报错,说是还缺少两个重要组件。觉得太麻烦,于是直接下载了win版的安装程序,安装成功。

  • 运行

    • 大概删除了A组54-56个患者后(意味着仅保留了30个左右),两组差异的p值小于0.3
  • 有待改进

    • 仅将年龄数据代入测试,下一步需要将其他关键数据代入,便于直接观察所测指标
    • 将被删除的患者代号、删除后结果保存到文件

      import csv
      import MySQLdb
      import random
      db = MySQLdb.connect(host='localhost',
          user = 'root', passwd='Sww6416!')
      cur=db.cursor()
      cur.execute('CREATE SCHEMA IF NOT EXISTS HMage')
      cur.execute('USE HMage')
      cur.execute('DROP TABLE IF EXISTS HM_age')
      cur.execute('''CREATE TABLE HM_age
          (
          No INTEGER NOT NULL PRIMARY KEY,
          Tag CHAR(1) NOT NULL,
          age FLOAT NOT NULL,
          randomnumber FLOAT 
          )''')
      
      HMagedata = csv.reader(file('HMscreen.csv'))
      for row in HMagedata:
          No = int(row[0])
          Tag = row[1]
          age = float(row[2])
          randomnumber = random.random()
          cur.execute('''INSERT INTO HM_age (No, Tag, age,randomnumber)
              VALUES(%s,%s, %s, %s)''',
              (No, Tag, age,randomnumber))
      cur.execute('SELECT age FROM HM_age WHERE Tag=%s','M')
      list_M = cur.fetchall()
      
      cur.execute('SELECT age FROM HM_age WHERE Tag=%s','H')
      list_H = cur.fetchall()
      
      count = 0
      from numpy import mean
      from scipy.stats import ttest_ind
      while True:
          t, p = ttest_ind(list_H, list_M)
          print t, p
          if p>0.3:
              break
          elif t>0:
              Mmean = mean(list_M)
              print Mmean
              cur.execute('SELECT No FROM HM_age WHERE Tag="M" AND     age<%s ORDER BY randomnumber',(Mmean,))
              deleterow=cur.fetchone()
              count += 1
              print 'round',count,'delete',deleterow
              cur.execute('DELETE FROM HM_age WHERE No = %s',(deleterow[0]))
              cur.execute('SELECT age FROM HM_age WHERE Tag="M"')
              list_M = cur.fetchall()
      print mean(list_H),mean(list_M)    
      db.commit()
      cur.close()