In [2]:
import codecs, pandas as pd, cPickle as pickle, nltk
from collections import Counter
%matplotlib inline

Read in MeSH terms for conditions and interventions, and thesaurus


In [3]:
corrections = {"Sarcoma, Ewing's": 'Sarcoma, Ewing',
               'Beta-Thalassemia': 'beta-Thalassemia',
               'Von Willebrand Disease, Type 3': 'von Willebrand Disease, Type 3',
               'Von Willebrand Disease, Type 2': 'von Willebrand Disease, Type 2',
               'Von Willebrand Disease, Type 1': 'von Willebrand Disease, Type 1',
               'Felty''s Syndrome': 'Felty Syndrome',
               'Von Hippel-Lindau Disease': 'von Hippel-Lindau Disease',
               'Retrognathism': 'Retrognathia',
               'Regurgitation, Gastric': 'Laryngopharyngeal Reflux',
               'Persistent Hyperinsulinemia Hypoglycemia of Infancy': 'Congenital Hyperinsulinism',
               'Von Willebrand Diseases': 'von Willebrand Diseases',
               'Pontine Glioma': 'Brain Stem Neoplasms',
               'Mental Retardation': 'Intellectual Disability',
               'Overdose': 'Drug Overdose',
               'Beta-Mannosidosis': 'beta-Mannosidosis',
               'Alpha 1-Antitrypsin Deficiency': 'alpha 1-Antitrypsin Deficiency',
               'Intervertebral Disk Displacement': 'Intervertebral Disc Displacement',
               'Alpha-Thalassemia': 'alpha-Thalassemia',
               'Mycobacterium Infections, Atypical': 'Mycobacterium Infections, Nontuberculous',
               'Legg-Perthes Disease': 'Legg-Calve-Perthes Disease',
               'Intervertebral Disk Degeneration': 'Intervertebral Disc Degeneration',
               'Alpha-Mannosidosis': 'alpha-Mannosidosis',
               'Gestational Trophoblastic Disease': 'Gestational Trophoblastic Neoplasms'
               }

In [4]:
cond = {}
for row in codecs.open('../data/condition_browse.txt','r','utf-8').readlines():
    row_id, trial_id, mesh_term = row.strip().split('|')
    if trial_id not in cond: cond[trial_id] = []
    if mesh_term in corrections:
        cond[trial_id].append(corrections[mesh_term])
    else:
        cond[trial_id].append(mesh_term)
    
interv = {}
for row in codecs.open('../data/intervention_browse.txt','r','utf-8').readlines():
    row_id, trial_id, mesh_term = row.strip().split('|')
    if trial_id not in interv: interv[trial_id] = []
    interv[trial_id].append(mesh_term)

mesh_terms = {}
mesh_lookup = {}
for row in codecs.open('../data/mesh_thesaurus.txt','r','utf-8').readlines():
    row_id, mesh_id, mesh_term = row.strip().split('|')
    mesh_lookup[mesh_id] = mesh_term
    if mesh_term not in mesh_terms: mesh_terms[mesh_term] = []
    mesh_terms[mesh_term].append(mesh_id)

Summarize some characteristics of the MeSH terms (and tree identifiers of each)


In [4]:
c = nltk.FreqDist([len(t) for t in cond.values()])

In [5]:
c.plot()



In [6]:
d = nltk.FreqDist([min([len(m) for m in mesh_terms[t[0]] if t[0] in mesh_terms]) for t in cond.values() 
                   if len(t) == 1 and t[0] in mesh_terms])

In [7]:
d.plot()



In [9]:
f = nltk.FreqDist([t[i] for t in cond.values()
                   for i in range(len(t))
                   if t[i] in mesh_terms and Counter([m[:3] for m in mesh_terms[t[i]]]).items() == [(u'C17', 1), (u'C04', 1)]])

In [10]:
f.items()


Out[10]:
[(u'Breast Neoplasms', 5033),
 (u'Skin Neoplasms', 223),
 (u'Myofibroma', 170),
 (u'Keratosis, Actinic', 149),
 (u'Breast Neoplasms, Male', 111),
 (u'Inflammatory Breast Neoplasms', 47),
 (u'Mastocytosis', 35),
 (u'Ganglion Cysts', 26),
 (u'Mastocytoma', 4),
 (u'Breast Cyst', 3),
 (u'Mastocytosis, Cutaneous', 2),
 (u'Neoplasms, Connective Tissue', 2)]

In [17]:
g = nltk.FreqDist([tuple(Counter([m[:3] for i in range(len(t)) if t[i] in mesh_terms
                   for m in mesh_terms[t[i]]]).items()) 
                   for t in cond.values()])

In [43]:
g.items()[:50]


Out[43]:
[(((u'C14', 1),), 3327),
 (((u'C17', 1), (u'C04', 1)), 3092),
 (((u'C19', 2), (u'C18', 2)), 2550),
 (((u'C04', 1),), 2299),
 (((u'C23', 1),), 2283),
 (((u'C04', 3),), 2257),
 (((u'F03', 1),), 2239),
 (((u'C02', 5), (u'C20', 2)), 2106),
 (((u'C08', 4), (u'C04', 2)), 1732),
 (((u'C08', 3), (u'C20', 1)), 1562),
 (((u'C12', 3), (u'C04', 1)), 1525),
 (((u'C11', 1),), 1307),
 (((u'F03', 2),), 1273),
 (((u'F03', 1), (u'C25', 1)), 1229),
 (((u'C23', 2),), 1151),
 (((u'F01', 1), (u'F03', 2)), 1148),
 (((u'C18', 1),), 1117),
 (((u'C23', 1), (u'C18', 1), (u'G07', 1), (u'E01', 1)), 1115),
 (((u'C20', 1), (u'C17', 1), (u'C05', 3)), 1105),
 (((u'C06', 1),), 1054),
 (((u'C08', 1), (u'C02', 1)), 1005),
 (((u'C14', 7),), 934),
 (((u'C23', 1), (u'C14', 1)), 898),
 (((u'C13', 1), (u'C12', 1)), 895),
 (((u'C04', 1), (u'C06', 5)), 877),
 (((u'C17', 1),), 859),
 (((u'C01', 1),), 847),
 (((u'C05', 1),), 847),
 (((u'C10', 3),), 815),
 (((u'C20', 2), (u'C04', 2), (u'C15', 2), (u'C14', 1)), 800),
 (((u'C19', 2), (u'C18', 2), (u'C20', 1)), 787),
 (((u'C20', 2), (u'C04', 2), (u'C15', 2)), 772),
 (((u'C06', 2),), 729),
 (((u'C10', 2), (u'F03', 1)), 715),
 (((u'C05', 2),), 710),
 (((u'C26', 1),), 705),
 (((u'C02', 6), (u'C06', 6)), 701),
 (((u'F01', 1), (u'F03', 1)), 698),
 (((u'C05', 4),), 697),
 (((u'C14', 2),), 666),
 (((u'C19', 1), (u'C18', 1)), 644),
 (((u'C10', 1),), 643),
 (((u'C08', 4),), 634),
 (((u'C10', 3), (u'C14', 3)), 617),
 (((u'C20', 2), (u'C04', 3), (u'C15', 2)), 603),
 (((u'C23', 2), (u'C14', 2)), 600),
 (((u'C20', 3), (u'C04', 3), (u'C15', 3)), 587),
 (((u'F01', 2),), 566),
 (((u'C17', 1), (u'C04', 2)), 537),
 (((u'C13', 2), (u'C12', 2)), 529)]

In [32]:
h = nltk.FreqDist([tuple(a.items()) 
                   for a in [Counter([m[:3] for c in v if c in mesh_terms for m in mesh_terms[c]]) 
                             for k, v in cond.items()]])

In [44]:
h.items()[:50]


Out[44]:
[(((u'C14', 1),), 3327),
 (((u'C17', 1), (u'C04', 1)), 3092),
 (((u'C19', 2), (u'C18', 2)), 2550),
 (((u'C04', 1),), 2299),
 (((u'C23', 1),), 2283),
 (((u'C04', 3),), 2257),
 (((u'F03', 1),), 2239),
 (((u'C02', 5), (u'C20', 2)), 2106),
 (((u'C08', 4), (u'C04', 2)), 1732),
 (((u'C08', 3), (u'C20', 1)), 1562),
 (((u'C12', 3), (u'C04', 1)), 1525),
 (((u'C11', 1),), 1307),
 (((u'F03', 2),), 1273),
 (((u'F03', 1), (u'C25', 1)), 1229),
 (((u'C23', 2),), 1151),
 (((u'F01', 1), (u'F03', 2)), 1148),
 (((u'C18', 1),), 1117),
 (((u'C23', 1), (u'C18', 1), (u'G07', 1), (u'E01', 1)), 1115),
 (((u'C20', 1), (u'C17', 1), (u'C05', 3)), 1105),
 (((u'C06', 1),), 1054),
 (((u'C08', 1), (u'C02', 1)), 1005),
 (((u'C14', 7),), 934),
 (((u'C23', 1), (u'C14', 1)), 898),
 (((u'C13', 1), (u'C12', 1)), 895),
 (((u'C04', 1), (u'C06', 5)), 877),
 (((u'C17', 1),), 859),
 (((u'C01', 1),), 847),
 (((u'C05', 1),), 847),
 (((u'C10', 3),), 815),
 (((u'C20', 2), (u'C04', 2), (u'C15', 2), (u'C14', 1)), 800),
 (((u'C19', 2), (u'C18', 2), (u'C20', 1)), 787),
 (((u'C20', 2), (u'C04', 2), (u'C15', 2)), 772),
 (((u'C06', 2),), 729),
 (((u'C10', 2), (u'F03', 1)), 715),
 (((u'C05', 2),), 710),
 (((u'C26', 1),), 705),
 (((u'C02', 6), (u'C06', 6)), 701),
 (((u'F01', 1), (u'F03', 1)), 698),
 (((u'C05', 4),), 697),
 (((u'C14', 2),), 666),
 (((u'C19', 1), (u'C18', 1)), 644),
 (((u'C10', 1),), 643),
 (((u'C08', 4),), 634),
 (((u'C10', 3), (u'C14', 3)), 617),
 (((u'C20', 2), (u'C04', 3), (u'C15', 2)), 603),
 (((u'C23', 2), (u'C14', 2)), 600),
 (((u'C20', 3), (u'C04', 3), (u'C15', 3)), 587),
 (((u'F01', 2),), 566),
 (((u'C17', 1), (u'C04', 2)), 537),
 (((u'C13', 2), (u'C12', 2)), 529)]

In [37]:
m = nltk.FreqDist([b for a in [Counter([m[:3] for c in v if c in mesh_terms for m in mesh_terms[c]]) 
                             for k, v in cond.items()] for b in a.keys()])

In [38]:
sorted(m.items())


Out[38]:
[(u'A10', 225),
 (u'A11', 184),
 (u'A12', 6),
 (u'A14', 1),
 (u'C01', 5591),
 (u'C02', 9251),
 (u'C03', 1109),
 (u'C04', 36805),
 (u'C05', 7794),
 (u'C06', 15268),
 (u'C07', 2047),
 (u'C08', 15496),
 (u'C09', 2231),
 (u'C10', 19431),
 (u'C11', 5037),
 (u'C12', 10237),
 (u'C13', 11387),
 (u'C14', 21057),
 (u'C15', 10411),
 (u'C16', 6775),
 (u'C17', 12047),
 (u'C18', 15182),
 (u'C19', 12080),
 (u'C20', 18640),
 (u'C21', 7),
 (u'C22', 96),
 (u'C23', 36392),
 (u'C24', 79),
 (u'C25', 3096),
 (u'C26', 4366),
 (u'E01', 3908),
 (u'E02', 24),
 (u'E05', 359),
 (u'F01', 5717),
 (u'F02', 439),
 (u'F03', 13868),
 (u'G04', 150),
 (u'G05', 262),
 (u'G07', 4738),
 (u'G08', 93),
 (u'G09', 83),
 (u'G10', 4),
 (u'G11', 255),
 (u'G12', 60),
 (u'G16', 196),
 (u'I01', 153),
 (u'N02', 1),
 (u'N06', 574)]

In [39]:
n = nltk.FreqDist([b for a in [Counter([m[:3] for c in v if c in mesh_terms for m in mesh_terms[c]]) 
                             for k, v in cond.items()] for b in a.keys() if len(a) == 1])

In [40]:
sorted(n.items())


Out[40]:
[(u'C01', 1062),
 (u'C02', 450),
 (u'C03', 615),
 (u'C04', 5749),
 (u'C05', 2450),
 (u'C06', 2055),
 (u'C07', 534),
 (u'C08', 1574),
 (u'C09', 133),
 (u'C10', 1702),
 (u'C11', 2263),
 (u'C12', 21),
 (u'C13', 560),
 (u'C14', 6475),
 (u'C15', 650),
 (u'C16', 95),
 (u'C17', 1234),
 (u'C18', 1495),
 (u'C19', 332),
 (u'C20', 527),
 (u'C23', 3746),
 (u'C24', 10),
 (u'C25', 37),
 (u'C26', 1450),
 (u'F01', 723),
 (u'F03', 3831)]

In [41]:
len(set([c for k, v in cond.items() for c in v]))


Out[41]:
3365

In [14]:
len([k for k, v in nltk.FreqDist([c for k, v in cond.items() for c in v]).items() if v >= 10])


Out[14]:
1834

In [ ]: