I tried to sample RVs from a customized likelihood whose parameters are known. In other word, I want to do something like
p0 = 0.3 #true bernoulli parameter
obs = stats.bernoulli.rvs(p0, size=1000) #obs comes from bernoulli distribution
but I need to modify two things: (1) use a customized likelihood to replace bernoulli distribution, and (2) my RV has two dimension, with the first dimension to be continuous and the second to be discrete.
I tried the following, but got something strange.
import pandas as pd #To work with dataset
import numpy as np #Math library
import seaborn as sns
import matplotlib.pyplot as plt #to plot some parameters
import pymc3 as pm
import theano.tensor as tt
def my_density_1(theta,W):
def logp_1(X,Y):
def log_expo(lam,x):
return( tt.sum(tt.log(lam) - lam * x) )
def log_bernoulli(p,x):
return( tt.sum(1.* ( tt.switch( x, tt.log(p), tt.log(1 - p) ))) )
LL = np.array([
log_expo(tetha[0],X), #first dimension, exponential RV
log_bernoulli(tetha[1],Y), #first dimension, Bernoulli RV
])
return( np.dot(W,LL) ) # My customized likelihood: weighted sum of two components
return(logp_1)
The above is my definition of cuctomized likelihood. The first component is a exponential distribution and the second component is a bernoulli distribution.
The RV is a two dimensional vector [X,Y]. My target is to get samples from this vector.
theta and W are parameters for the likelihood and they are known. Pleaase note I do NOT want to get posterior samples of these parameters. What I need is samples of random vector [X,Y].
Next I set pymc3 model using the following codes:
with pm.Model() as m:
theta = np.array([
3.384, #parametr for X
0.397, #parametr for Y
])
W = [0.5,0.5] #weights of two components
##set likelihood
simulate = pm.DensityDist('simulate',my_density_1(theta,W))
When I run the above codes, I got the following error:
TypeError: logp_1() missing 1 required positional argument: 'Y'
What is wrong here?