source: orange-bioinformatics/obiGeneSetSig.py @ 1578:9bc83a60db78

Revision 1578:9bc83a60db78, 4.3 KB checked in by markotoplak, 2 years ago (diff)

Gene matcher now have a call function and return a Match object, which is used for matching. Backward compatibility was retained.

Line 
1import Orange
2import obiAssess
3import Orange.misc
4import obiGeneSets
5import obiGene
6import numpy
7from collections import defaultdict
8import statc
9import stats
10
11def selectGenesetsData(data, matcher, geneSets, minSize=3, maxSize=1000, minPart=0.1, classValues=None):
12    """
13    Returns gene sets and data which falling under upper criteria.
14    """
15    gso = obiGsea.GSEA(data, matcher=matcher, classValues=classValues, atLeast=0)
16    gso.addGenesets(geneSets)
17    okgenesets = gso.selectGenesets(minSize=minSize, maxSize=maxSize, minPart=minPart).keys()
18    gsetsnum = gso.to_gsetsnum(okgenesets)
19    return gso.data, okgenesets, gsetsnum
20
21class SetSig(object):
22
23    __new__ = Orange.misc._orange__new__(object)
24
25    def __init__(self, matcher, gene_sets, min_size=3, max_size=1000, min_part=0.1, class_values=None):
26        self.matcher = matcher
27        self.gene_sets = gene_sets
28        self.min_size = min_size
29        self.max_size = max_size
30        self.min_part = min_part
31        self.class_values = class_values
32
33    def __call__(self, data, weight_id=None):
34        data, oknames, gsetsnum = obiAssess.selectGenesetsData(data, 
35            self.matcher, self.gene_sets,
36            minSize=self.min_size, maxSize=self.max_size, 
37            minPart=self.min_part, classValues=self.class_values)
38
39        def setSig_example_geneset(ex, data):
40            """ ex contains only selected genes """
41
42            distances = [ [], [] ]   
43
44            def pearsonr(v1, v2):
45                try:
46                    return statc.pearsonr(v1, v2)[0]
47                except:
48                    return numpy.corrcoef([v1, v2])[0,1]
49
50            def pearson(ex1, ex2):
51                attrs = range(len(ex1.domain.attributes))
52                vals1 = [ ex1[i].value for i in attrs ]
53                vals2 = [ ex2[i].value for i in attrs ]
54                return pearsonr(vals1, vals2)
55
56            def ttest(ex1, ex2):
57                try:
58                    return stats.lttest_ind(ex1, ex2)[0]
59                except:
60                    return 0.0
61           
62            #maps class value to its index
63            classValueMap = dict( [ (val,i) for i,val in enumerate(data.domain.classVar.values) ])
64         
65            #create distances to all learning data - save or other class
66            for c in data:
67                distances[classValueMap[c[-1].value]].append(pearson(c, ex))
68
69            return ttest(distances[0], distances[1])
70
71        attributes = []
72
73        for name, gs in gsetsnum.items(): #for each geneset
74            #for each gene set: take the attribute subset and work on the attribute subset only
75            #only select the subset of genes from the learning data
76            at = Orange.feature.Continuous(name=name.id)
77
78            def t(ex, w, gs=gs, ldata=data):
79                domain = Orange.data.Domain([ldata.domain.attributes[ai] for ai in gs], ldata.domain.classVar)
80                datao = Orange.data.Table(domain, ldata)
81                example = Orange.data.Instance(domain, ex) #domains need to be the same
82                return setSig_example_geneset(example, datao)
83         
84            at.get_value_from = t
85            attributes.append(at)
86       
87        newdomain = Orange.data.Domain(attributes, data.domain.class_var)
88        return Orange.data.Table(newdomain, data)
89
90if __name__ == "__main__":
91
92    data = Orange.data.Table("iris")
93    gsets = obiGeneSets.collections({
94        "ALL": ['sepal length', 'sepal width', 'petal length', 'petal width'],
95        "f3": ['sepal length', 'sepal width', 'petal length'],
96        "l3": ['sepal width', 'petal length', 'petal width'],
97        })
98
99    fp = 120
100    ldata = Orange.data.Table(data.domain, data[:fp])
101    tdata = Orange.data.Table(data.domain, data[fp:])
102
103    matcher = obiGene.matcher([])
104
105    choosen_cv = ["Iris-setosa", "Iris-versicolor"]
106    def to_old_dic(d, data):
107        ar = defaultdict(list)
108        for ex1 in data:
109            ex = d(ex1)
110            for a,x in zip(d.attributes, ex):
111                ar[a.name].append(x.value)
112        return ar
113
114    def pp2(ar):
115        ol =  sorted(ar.items())
116        print '\n'.join([ a + ": " +str(b) for a,b in ol])
117
118    ass = SetSig(ldata, matcher=matcher, gene_sets=gsets, class_values=choosen_cv, min_part=0.0)
119    print ass.domain
120    ar = to_old_dic(ass.domain, data[:5])
121    pp2(ar)
Note: See TracBrowser for help on using the repository browser.