prophet_logistic_growth.stan 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. data {
  2. int T; // Sample size
  3. int<lower=1> K; // Number of seasonal vectors
  4. real t[T]; // Day
  5. real cap[T]; // Capacities
  6. real y[T]; // Time-series
  7. int S; // Number of changepoints
  8. real A[T, S]; // Split indicators
  9. real t_change[S]; // Index of changepoints
  10. real X[T,K]; // season vectors
  11. vector[K] sigmas; // scale on seasonality prior
  12. real<lower=0> tau; // scale on changepoints prior
  13. }
  14. parameters {
  15. real k; // Base growth rate
  16. real m; // offset
  17. real delta[S]; // Rate adjustments
  18. real<lower=0> sigma_obs; // Observation noise (incl. seasonal variation)
  19. real beta[K]; // seasonal vector
  20. }
  21. transformed parameters {
  22. real gamma[S]; // adjusted offsets, for piecewise continuity
  23. real k_s[S + 1]; // actual rate in each segment
  24. real m_pr;
  25. // Compute the rate in each segment
  26. k_s[1] = k;
  27. for (i in 1:S) {
  28. k_s[i + 1] = k_s[i] + delta[i];
  29. }
  30. // Piecewise offsets
  31. m_pr = m; // The offset in the previous segment
  32. for (i in 1:S) {
  33. gamma[i] = (t_change[i] - m_pr) * (1 - k_s[i] / k_s[i + 1]);
  34. m_pr = m_pr + gamma[i]; // update for the next segment
  35. }
  36. }
  37. model {
  38. real Y[T];
  39. //priors
  40. k ~ normal(0, 5);
  41. m ~ normal(0, 5);
  42. delta ~ double_exponential(0, tau);
  43. sigma_obs ~ normal(0, 0.1);
  44. beta ~ normal(0, sigmas);
  45. // Likelihood
  46. for (i in 1:T) {
  47. Y[i] = cap[i] / (1 + exp(-(k + dot_product(A[i], delta)) * (t[i] - (m + dot_product(A[i], gamma))))) + dot_product(X[i], beta);
  48. }
  49. y ~ normal(Y, sigma_obs);
  50. }