How to model time-dependent variables explicitly? (or alternatively, a better approach to modelling)
I measure events over time and there are two sources: a) constant rate baseline and b) a time-dependent burst as seen below
I want to quantify the difference between these two sources of events and fit the likely parameters from the experimental data.
My modelling assumptions are:
Baseline comes from Poisson distribution with fixed mean $lambda_{a}$
Burst comes from Poisson distribution with varying mean $lambda_{b} (t)$
$lambda_{b} (t)$ is described by a skewed normal distribution with parameters, mean $mu$, standard deviation $sigma$, skewness $alpha$, magnitude $mag$
Generating artificial data as a test input.
$lambda_a$ and $lambda_b$ look like this
and leads to artificial datasets like this
What I struggle with is including the explicit time dependence. In pymc3
import numpy as np import scipy.stats import pymc3 as pm #Generate a training set #leads per second lambda_a_true = 10 def skew(x,e=0,w=1,a=0, mag=1): t = (x-e) / w return 2 * mag * scipy.stats.norm.pdf(t) * scipy.stats.norm.cdf(a*t) time = np.linspace(0.0, 300.0, 1000) a_t =10 ; mu_t = 35; sigma_t = 25; mag_t = 35 lambda_b_true = skew(time, mu_t, sigma_t, a_t, mag_t) ts=np.arange(301); count=np.zeros(301, dtype = np.uint16) for ii in ts: bl = np.random.poisson(lam=lambda_a_true) tv = np.random.poisson(lam=skew(ii, mu_t, sigma_t, a_t, mag_t)) count[ii]=bl+tv niter = 2000 with pm.Model() as model: #Baseline lambda - one of our unknown lambda_bl = pm.Uniform('lambda_bl', 0., 20) #Parameters for skewed Gaussians - also unknowns alpha = pm.Uniform('lambda_bl', 0., 20) mu = pm.Uniform('lambda_bl', 0., 300) sigma = pm.Uniform('lambda_bl', 0., 300) mag = pm.Uniform('lambda_bl', 0., 100) #How to include time dependence here? lambda_tv = skew(t, mu=mu, sd=sigma, tau=None, alpha=alpha, mag=mag)
Best Answer
You will probably have more luck with PyMC3 questions on our forums: http://discourse.pymc.io
It sounds like you have a mixture model here where you want to infer which samples come from which distribution. There quite a few examples which you can look at: http://docs.pymc.io/examples.html#mixture-models
While your model should look a bit different afterwards, it's also important to know that using python code in the model creation does not do what you think it does: lambda_tv = skew(t, mu=mu, sd=sigma, tau=None, alpha=alpha, mag=mag). See http://docs.pymc.io/theano.html for more details.