source: orange-bioinformatics/obiGeneSetSig.py @ 1572:b36656308a2c

Revision 1572:b36656308a2c, 3.8 KB checked in by markotoplak, 2 years ago (diff)

Started obiGeneSetSig (new interface for gene set signatures) with Minca's SetSig.

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