pomp
Inference for partially observed Markov processes
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
gompertz.c
Go to the documentation of this file.
1// dear emacs, please treat this as -*- C++ -*-
2
3#include <Rmath.h>
4
5#include "pomp.h" // in R, do 'system.file("include/pomp.h",package="pomp")' to find this header file
6
7// define some macros to make the code easier to read
8#define R (p[parindex[0]]) // growth rate
9#define K (p[parindex[1]]) // carrying capacity
10#define SIGMA (p[parindex[2]]) // process noise level
11#define TAU (p[parindex[3]]) // measurement noise level
12
13#define Y (y[obsindex[0]]) // observed population size
14#define X (x[stateindex[0]]) // actual population size
15#define XPRIME (f[stateindex[0]]) // new population size
16#define EY (f[obsindex[0]]) // expectation
17#define VY (f[vmatindex[0]]) // variance
18
19// normal measurement model density
21(
22 double *lik, double *y, double *x, double *p, int give_log,
23 int *obsindex, int *stateindex, int *parindex, int *covindex,
24 double *covars, double t
25 ) {
26 *lik = dlnorm(Y,log(X),TAU,give_log);
27}
28
29// normal measurement model simulator
31(
32 double *y, double *x, double *p,
33 int *obsindex, int *stateindex, int *parindex, int *covindex,
34 double *covars, double t
35 ) {
36 Y = rlnorm(log(X),TAU);
37}
38
39// measurement model expectation
41(
42 double *f, double *x, double *p,
43 int *obsindex, int *stateindex, int *parindex, int *covindex,
44 double *covars, double t
45 ) {
46 EY = X*exp(TAU*TAU/2);
47}
48
49// measurement model variance
50void _gompertz_normal_vmeasure (double *f, double *x, double *p,
51 int *vmatindex, int *stateindex, int *parindex, int *covindex,
52 double *covars, double t) {
53 double et = exp(TAU*TAU);
54 VY = X*X*et*(et-1);
55}
56
57// stochastic Gompertz model with log-normal process noise
59(
60 double *x, const double *p,
61 const int *stateindex, const int *parindex, const int *covindex,
62 const double *covar, double t, double deltat
63 ) {
64 double S = exp(-R*deltat);
65 double eps = (SIGMA > 0.0) ? exp(rnorm(0,SIGMA)) : 1.0;
66 X = R_pow(K,1-S)*R_pow(X,S)*eps; // note X is over-written by this line
67}
68
69// the deterministic skeleton
71(
72 double *f, double *x, const double *p,
73 const int *stateindex, const int *parindex, const int *covindex,
74 const double *covar, double t
75 ) {
76 double deltat = 1.0;
77 double S = exp(-R*deltat);
78 XPRIME = R_pow(K,1-S)*R_pow(X,S); // X is not over-written in the skeleton function
79}
80
81#undef R
82#undef K
83#undef SIGMA
84#undef TAU
85#undef Y
86#undef X
87#undef XPRIME
88#undef EY
89#undef VY
90
91#define r (__p[__parindex[0]])
92#define K (__p[__parindex[1]])
93#define sigma (__p[__parindex[2]])
94#define tau (__p[__parindex[3]])
95#define X_0 (__p[__parindex[4]])
96#define T_r (__pt[__parindex[0]])
97#define T_K (__pt[__parindex[1]])
98#define T_sigma (__pt[__parindex[2]])
99#define T_tau (__pt[__parindex[3]])
100#define T_X_0 (__pt[__parindex[4]])
101
103(
104 double *__pt, const double *__p, const int *__parindex
105 ) {
106 T_r = log(r);
107 T_K = log(K);
108 T_sigma = log(sigma);
109 T_tau = log(tau);
110 T_X_0 = log(X_0);
111}
112
114(
115 double *__p, const double *__pt, const int *__parindex
116 ) {
117 r = exp(T_r);
118 K = exp(T_K);
119 sigma = exp(T_sigma);
120 tau = exp(T_tau);
121 X_0 = exp(T_X_0);
122}
123
124#undef r
125#undef K
126#undef sigma
127#undef tau
128#undef X_0
129#undef T_r
130#undef T_K
131#undef T_sigma
132#undef T_tau
133#undef T_X_0
void _gompertz_from_trans(double *__p, const double *__pt, const int *__parindex)
Definition gompertz.c:114
#define X
Definition gompertz.c:14
#define X_0
Definition gompertz.c:95
void _gompertz_normal_vmeasure(double *f, double *x, double *p, int *vmatindex, int *stateindex, int *parindex, int *covindex, double *covars, double t)
Definition gompertz.c:50
void _gompertz_step(double *x, const double *p, const int *stateindex, const int *parindex, const int *covindex, const double *covar, double t, double deltat)
Definition gompertz.c:59
#define TAU
Definition gompertz.c:11
void _gompertz_normal_dmeasure(double *lik, double *y, double *x, double *p, int give_log, int *obsindex, int *stateindex, int *parindex, int *covindex, double *covars, double t)
Definition gompertz.c:21
#define XPRIME
Definition gompertz.c:15
#define EY
Definition gompertz.c:16
void _gompertz_normal_rmeasure(double *y, double *x, double *p, int *obsindex, int *stateindex, int *parindex, int *covindex, double *covars, double t)
Definition gompertz.c:31
#define R
Definition gompertz.c:8
#define r
Definition gompertz.c:91
#define sigma
Definition gompertz.c:93
#define T_sigma
Definition gompertz.c:98
void _gompertz_normal_emeasure(double *f, double *x, double *p, int *obsindex, int *stateindex, int *parindex, int *covindex, double *covars, double t)
Definition gompertz.c:41
#define Y
Definition gompertz.c:13
#define T_tau
Definition gompertz.c:99
#define K
Definition gompertz.c:9
#define VY
Definition gompertz.c:17
#define tau
Definition gompertz.c:94
void _gompertz_skeleton(double *f, double *x, const double *p, const int *stateindex, const int *parindex, const int *covindex, const double *covar, double t)
Definition gompertz.c:71
#define T_K
Definition gompertz.c:97
#define SIGMA
Definition gompertz.c:10
void _gompertz_to_trans(double *__pt, const double *__p, const int *__parindex)
Definition gompertz.c:103
#define T_r
Definition gompertz.c:96
#define T_X_0
Definition gompertz.c:100