1
2
3
4
5
6
7
8
9 """Unit tests for PyMVPA miscelaneouse functions operating on datasets and requiring SciPy"""
10
11 import unittest
12
13 import numpy as N
14
15 from mvpa.base import externals
16
17 from mvpa.datasets import Dataset
18 from mvpa.datasets.miscfx import removeInvariantFeatures
19
20 if externals.exists('scipy', raiseException=True):
21 from scipy import linalg
22 from mvpa.datasets.miscfx import detrend
23
25
27 thr = 1e-9;
28 samples = N.array( [[1.0, 2, 3, 3, 2, 1],
29 [-2.0, -4, -6, -6, -4, -2]], ndmin=2 ).T
30
31 chunks = [0, 0, 0, 1, 1, 1]
32 chunks_bad = [ 0, 0, 1, 1, 1, 0]
33 target_all = N.array( [[-1.0, 0, 1, 1, 0, -1],
34 [2, 0, -2, -2, 0, 2]], ndmin=2 ).T
35
36
37 ds = Dataset(samples=samples, labels=chunks, chunks=chunks,
38 copy_samples=True)
39 detrend(ds, perchunk=False)
40
41 self.failUnless(linalg.norm(ds.samples - target_all) < thr,
42 msg="Detrend should have detrended all the samples at once")
43
44
45 ds_bad = Dataset(samples=samples, labels=chunks, chunks=chunks_bad,
46 copy_samples=True)
47 self.failUnlessRaises(ValueError, detrend, ds_bad, perchunk=True)
48
49
50 ds = Dataset(samples=samples, labels=chunks, chunks=chunks,
51 copy_samples=True)
52 detrend(ds, perchunk=True)
53
54 self.failUnless(linalg.norm(ds.samples) < thr,
55 msg="Detrend should have detrended each chunk separately")
56
57 self.failUnless(ds.samples.shape == samples.shape,
58 msg="Detrend must preserve the size of dataset")
59
60
61
62 ds = Dataset(samples=N.array([[1.0, 2, 3, 1, 2, 3]], ndmin=2).T,
63 labels=chunks, chunks=chunks, copy_samples=True)
64 detrend(ds, perchunk=True)
65 self.failUnless(linalg.norm(ds.samples) < thr,
66 msg="Detrend should have removed all the signal")
67
68
69 ds = Dataset(samples=samples, labels=chunks, chunks=chunks,
70 copy_samples=True)
71 detrend(ds, perchunk=False, model='regress', polyord=1)
72 self.failUnless(linalg.norm(ds.samples - target_all) < thr,
73 msg="Detrend should have detrended all the samples at once")
74
75 ds = Dataset(samples=samples, labels=chunks, chunks=chunks,
76 copy_samples=True)
77 (res, reg) = detrend(ds, perchunk=True, model='regress', polyord=2)
78 psamps = ds.samples.copy()
79 self.failUnless(linalg.norm(ds.samples) < thr,
80 msg="Detrend should have detrended each chunk separately")
81
82 self.failUnless(ds.samples.shape == samples.shape,
83 msg="Detrend must preserve the size of dataset")
84
85 ods = Dataset(samples=samples, labels=chunks, chunks=chunks,
86 copy_samples=True)
87 opt_reg = reg.copy()
88 (ores, oreg) = detrend(ods, perchunk=True, model='regress',
89 opt_reg=opt_reg)
90 dsamples = (ods.samples - psamps).sum()
91 self.failUnless(abs(dsamples) <= 1e-10,
92 msg="Detrend for polyord reg should be same as opt_reg " + \
93 "when popt_reg is the same as the polyord reg. But got %g" \
94 % dsamples)
95
96 self.failUnless(linalg.norm(ds.samples) < thr,
97 msg="Detrend should have detrended each chunk separately")
98
99
100
101 target_mixed = N.array( [[-1.0, 0, 1, 0, 0, 0],
102 [2.0, 0, -2, 0, 0, 0]], ndmin=2 ).T
103
104 ds = Dataset(samples=samples, labels=chunks, chunks=chunks,
105 copy_samples=True)
106 (res, reg) = detrend(ds, perchunk=True, model='regress', polyord=[0,1])
107 self.failUnless(linalg.norm(ds.samples - target_mixed) < thr,
108 msg="Detrend should have baseline corrected the first chunk, " + \
109 "but baseline and linear detrended the second.")
110
111
112 ds = Dataset(samples=samples, labels=chunks, chunks=chunks,
113 copy_samples=True)
114 (res, reg) = detrend(ds, perchunk=True, model='regress', polyord=1)
115 opt_reg = reg[N.ix_(range(reg.shape[0]),[1,3])]
116 final_samps = ds.samples.copy()
117 ds = Dataset(samples=samples, labels=chunks, chunks=chunks,
118 copy_samples=True)
119 (res, reg) = detrend(ds, perchunk=True, model='regress', polyord=0)
120 (res, reg) = detrend(ds, perchunk=True, model='regress',
121 opt_reg=opt_reg)
122 self.failUnless(linalg.norm(ds.samples - final_samps) < thr,
123 msg="Detrend of polyord 1 should be same as detrend with " + \
124 "0 followed by opt_reg the same as a 1st order.")
125
126
127
130
131
132 if __name__ == '__main__':
133 import runner
134