Can I call a pymc-function directly?
Robert
rxjwg98 at gmail.com
Sun Dec 20 20:33:01 EST 2015
Hi,
I am new to pymc package. I come across the following tutorial:
The example is from: www.map.ox.ac.uk/media/PDF/Patil_et_al_2010.pdf
.........
import pymc
import numpy as np
n = 5*np.ones(4,dtype=int)
x = np.array([-.86,-.3,-.05,.73])
alpha = pymc.Normal('alpha',mu=0,tau=.01)
beta = pymc.Normal('beta',mu=0,tau=.01)
@pymc.deterministic
def theta(a=alpha, b=beta):
"""theta = logit^{-1}(a+b)"""
return pymc.invlogit(a+b*x)
d = pymc.Binomial('d', n=n, p=theta, value=np.array([0.,1.,3.,5.]),\
observed=True)
.......
import pymc
import pymc.Matplot
import mymodel
S = pymc.MCMC(mymodel, db='pickle')
S.sample(iter=10000, burn=5000, thin=2)
pymc.Matplot.plot(S)
import matplotlib.pyplot as plt
plt.show()
///////
Through the above code runs and plots, I would like to know more detail
about function theta. I have tried the following modified code:
import pymc
import numpy as np
n = 5*np.ones(4,dtype=int)
x = np.array([-.86,-.3,-.05,.73])
alpha = pymc.Normal('alpha',mu=0,tau=.01)
beta = pymc.Normal('beta',mu=0,tau=.01)
@pymc.deterministic
def theta(a=alpha, b=beta):
"""theta = logit^{-1}(a+b)"""
return pymc.invlogit(a+b*x)
p=theta(alpha, beta)
print 'p=', p
//////////////
It has this error:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
C:\Users\rj\pyprj\pymc_mymodel0.py in <module>()
13 return pymc.invlogit(a+b*x)
14
---> 15 p=theta(alpha, beta)
16 print 'p=', p
C:\Users\rj\AppData\Local\Enthought\Canopy\User\lib\site-packages\pymc\CommonDeterministics.pyc in __call__(self, *args, **kwargs)
989 {'self': self, 'args': args, 'kwargs': kwargs},
990 trace=False,
--> 991 plot=False)
992 Variable.__call__ = UnboundMethodType(__call__, None, Variable)
993
C:\Users\rj\AppData\Local\Enthought\Canopy\User\lib\site-packages\pymc\PyMCObjects.pyc in __init__(self, eval, doc, name, parents, dtype, trace, cache_depth, plot, verbose, jacobians, jacobian_formats)
441 trace=trace,
442 plot=plot,
--> 443 verbose=verbose)
444
445 # self._value.force_compute()
C:\Users\rj\AppData\Local\Enthought\Canopy\User\lib\site-packages\pymc\Node.pyc in __init__(self, doc, name, parents, cache_depth, trace, dtype, plot, verbose)
212 self.extended_children = set()
213
--> 214 Node.__init__(self, doc, name, parents, cache_depth, verbose=verbose)
215
216 if self.dtype is None:
C:\Users\rj\AppData\Local\Enthought\Canopy\User\lib\site-packages\pymc\Node.pyc in __init__(self, doc, name, parents, cache_depth, verbose)
127
128 # Initialize
--> 129 self.parents = parents
130
131 def _get_parents(self):
C:\Users\rj\AppData\Local\Enthought\Canopy\User\lib\site-packages\pymc\Node.pyc in _set_parents(self, new_parents)
145
146 # Get new lazy function
--> 147 self.gen_lazy_function()
148
149 parents = property(
C:\Users\rj\AppData\Local\Enthought\Canopy\User\lib\site-packages\pymc\PyMCObjects.pyc in gen_lazy_function(self)
452 cache_depth=self._cache_depth)
453
--> 454 self._value.force_compute()
455
456 self._jacobians = {}
C:\Users\rj\AppData\Local\Enthought\Canopy\User\lib\site-packages\pymc\LazyFunction.pyd in pymc.LazyFunction.LazyFunction.force_compute (pymc\LazyFunction.c:2409)()
C:\Users\rj\AppData\Local\Enthought\Canopy\User\lib\site-packages\pymc\CommonDeterministics.pyc in eval_fun(self, args, kwargs)
981
982 def eval_fun(self, args=args, kwargs=kwargs):
--> 983 return self(*args, **kwargs)
984 return pm.Deterministic(eval_fun,
985 'A Deterministic returning the value of %s(*%s, **%s)' % (
TypeError: 'numpy.ndarray' object is not callable
///////////////
>From function syntactically, it seems OK for this function calling(random
variables alpha and beta as parameters of theta.
p=theta(alpha, beta)
Do you know what is wrong
with my code and idea (call theta by my code, not a random model like:
d = pymc.Binomial('d', n=n, p=theta, value=np.array([0.,1.,3.,5.]),\
observed=True)
Thanks,
More information about the Python-list
mailing list