[Scipy-svn] r2351 - in trunk/Lib/sandbox/models: . tests
scipy-svn at scipy.org
scipy-svn at scipy.org
Sun Dec 3 23:46:46 EST 2006
Author: jonathan.taylor
Date: 2006-12-03 22:46:41 -0600 (Sun, 03 Dec 2006)
New Revision: 2351
Modified:
trunk/Lib/sandbox/models/__init__.py
trunk/Lib/sandbox/models/cox.py
trunk/Lib/sandbox/models/formula.py
trunk/Lib/sandbox/models/glm.py
trunk/Lib/sandbox/models/model.py
trunk/Lib/sandbox/models/tests/test_formula.py
trunk/Lib/sandbox/models/tests/test_glm.py
Log:
other changes to scipy.sandbox.models -- still in progress!
Modified: trunk/Lib/sandbox/models/__init__.py
===================================================================
--- trunk/Lib/sandbox/models/__init__.py 2006-12-04 04:43:50 UTC (rev 2350)
+++ trunk/Lib/sandbox/models/__init__.py 2006-12-04 04:46:41 UTC (rev 2351)
@@ -6,11 +6,5 @@
from glm import model as glm
from rlm import model as rlm
-
-import unittest
-def suite():
- return unittest.TestSuite([tests.suite()])
-
-
-from numpy.testing import ScipyTest
-test = ScipyTest().test
+from numpy.testing import NumpyTest
+test = NumpyTest().test
Modified: trunk/Lib/sandbox/models/cox.py
===================================================================
--- trunk/Lib/sandbox/models/cox.py 2006-12-04 04:43:50 UTC (rev 2350)
+++ trunk/Lib/sandbox/models/cox.py 2006-12-04 04:46:41 UTC (rev 2351)
@@ -209,4 +209,4 @@
c = coxph(subjects, f)
c.cache()
- c.newton([0.4])
+# c.newton([0.4])
Modified: trunk/Lib/sandbox/models/formula.py
===================================================================
--- trunk/Lib/sandbox/models/formula.py 2006-12-04 04:43:50 UTC (rev 2350)
+++ trunk/Lib/sandbox/models/formula.py 2006-12-04 04:46:41 UTC (rev 2351)
@@ -266,7 +266,7 @@
def __call__(self, *args, **kw):
"""
A quantitative is just like term, except there is an additional
- transformation: self.transfrom.
+ transformation: self.transform.
"""
return self.transform(term.__call__(self, *args, **kw))
@@ -374,16 +374,20 @@
allvals.shape = (1,) + allvals.shape
return allvals
- def hasterm(self, term):
+ def hasterm(self, query_term):
"""
Determine whether a given term is in a formula.
"""
- if not isinstance(term, formula):
- return term.termname in self.termnames()
- elif len(term.terms) == 1:
- term = term.terms[0]
- return term.termname in self.termnames()
+ if not isinstance(query_term, formula):
+ if type(query_term) == type("name"):
+ try: query = self[query_term]
+ except: return False
+ elif isinstance(query_term, term):
+ return query_term.termname in self.termnames()
+ elif len(query_term.terms) == 1:
+ query_term = query_term.terms[0]
+ return query_term.termname in self.termnames()
else:
raise ValueError, 'more than one term passed to hasterm'
@@ -394,14 +398,14 @@
else:
raise KeyError, 'formula has no such term: %s' % repr(name)
- def termcolumns(self, term, dict=False):
+ def termcolumns(self, query_term, dict=False):
"""
Return a list of the indices of all columns associated
to a given term.
"""
- if self.hasterm(term):
- names = term.names()
+ if self.hasterm(query_term):
+ names = query_term.names()
value = {}
for name in names:
value[name] = self._names.index(name)
Modified: trunk/Lib/sandbox/models/glm.py
===================================================================
--- trunk/Lib/sandbox/models/glm.py 2006-12-04 04:43:50 UTC (rev 2350)
+++ trunk/Lib/sandbox/models/glm.py 2006-12-04 04:46:41 UTC (rev 2351)
@@ -28,23 +28,25 @@
if Y is None: Y = self.Y
return self.family.deviance(Y, results.mu) / scale
- def next(self, results, Y):
+ def next(self):
+ results = self.results; Y = self.Y
self.weights = self.family.weights(results.mu)
self.initialize(self.design)
Z = results.predict + self.family.link.deriv(results.mu) * (Y - results.mu)
newresults = wls_model.fit(self, Z)
+ newresults.Y = Y
newresults.mu = self.family.link.inverse(newresults.predict)
self.iter += 1
return newresults
- def cont(self, results, tol=1.0e-05):
+ def cont(self, tol=1.0e-05):
"""
Continue iterating, or has convergence been obtained?
"""
if self.iter >= model.niter:
return False
- curdev = self.deviance(results=results)
+ curdev = self.deviance(results=self.results)
if N.fabs((self.dev - curdev) / curdev) < tol:
return False
@@ -72,7 +74,7 @@
self.scale = self.results.scale = self.estimate_scale()
while self.cont(self.results):
- self.results = self.next(self.results, Y)
+ self.results = self.next()
self.scale = self.results.scale = self.estimate_scale()
return self.results
Modified: trunk/Lib/sandbox/models/model.py
===================================================================
--- trunk/Lib/sandbox/models/model.py 2006-12-04 04:43:50 UTC (rev 2350)
+++ trunk/Lib/sandbox/models/model.py 2006-12-04 04:46:41 UTC (rev 2351)
@@ -64,9 +64,10 @@
raise NotImplementedError
def newton(self, theta):
- def f(theta):
- return -self.logL(theta)
- self.results = scipy.optimize.fmin(f, theta)
+ raise NotImplementedError
+# def f(theta):
+# return -self.logL(theta)
+# self.results = scipy.optimize.fmin(f, theta)
class LikelihoodModelResults:
Modified: trunk/Lib/sandbox/models/tests/test_formula.py
===================================================================
--- trunk/Lib/sandbox/models/tests/test_formula.py 2006-12-04 04:43:50 UTC (rev 2350)
+++ trunk/Lib/sandbox/models/tests/test_formula.py 2006-12-04 04:46:41 UTC (rev 2351)
@@ -17,6 +17,7 @@
self.assertRaises(ValueError, formula.term, "name", termname=0)
+
def test_str(self):
t = formula.term("name")
s = str(t)
@@ -58,6 +59,43 @@
self.formula += self.terms[i]
self.formula.namespace = self.namespace
+ def test_namespace(self):
+ space1 = {'X':N.arange(50), 'Y':N.arange(50)*2}
+ space2 = {'X':N.arange(20), 'Y':N.arange(20)*2}
+ X = formula.term('X')
+ Y = formula.term('Y')
+
+ X.namespace = space1
+ assert_almost_equal(X(), N.arange(50))
+
+ Y.namespace = space2
+ assert_almost_equal(Y(), N.arange(20)*2)
+
+ f = X + Y
+
+ f.namespace = space1
+ self.assertEqual(f().shape, (2,50))
+ assert_almost_equal(Y(), N.arange(50)*2)
+ assert_almost_equal(X(), N.arange(50))
+
+ f.namespace = space2
+ self.assertEqual(f().shape, (2,20))
+ assert_almost_equal(Y(), N.arange(20)*2)
+ assert_almost_equal(X(), N.arange(20))
+
+
+ def test_termcolumns(self):
+ t1 = formula.term("A")
+ t2 = formula.term("B")
+ f = t1 + t2 + t1 * t2
+ def other(val):
+ return N.array([3.2*val,4.342*val**2, 5.234*val**3])
+ q = formula.quantitative(['other%d' % i for i in range(1,4)], termname='other', func=t1, transform=other)
+ f += q
+ q.namespace = f.namespace = self.formula.namespace
+ assert_almost_equal(q(), f()[f.termcolumns(q)])
+
+
def test_str(self):
s = str(self.formula)
@@ -133,7 +171,7 @@
def test_power(self):
t = self.terms[2]
- t2 = formula.quantitative('t', func=t)**2
+ t2 = t**2
t.namespace = t2.namespace = self.formula.namespace
assert_almost_equal(t()**2, t2())
Modified: trunk/Lib/sandbox/models/tests/test_glm.py
===================================================================
--- trunk/Lib/sandbox/models/tests/test_glm.py 2006-12-04 04:43:50 UTC (rev 2350)
+++ trunk/Lib/sandbox/models/tests/test_glm.py 2006-12-04 04:46:41 UTC (rev 2351)
@@ -7,9 +7,8 @@
W = R.standard_normal
+class test_Regression(NumpyTestCase):
-class test_Regression(ScipyTestCase):
-
def check_Logistic(self):
X = W((40,10))
Y = N.greater(W((40,)), 0)
@@ -27,10 +26,6 @@
results = cmodel.fit(Y)
self.assertEquals(results.df_resid, 31)
-
-def suite():
- suite = unittest.makeSuite(RegressionTest)
- return suite
if __name__ == "__main__":
- ScipyTest().run()
+ NumpyTest().run()
More information about the Scipy-svn
mailing list