[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