pomp
Inference for partially observed Markov processes
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ou2.c
Go to the documentation of this file.
1// -*- C++ -*-
2
3#include <R.h>
4#include <Rmath.h>
5#include <Rdefines.h>
6#include "internal.h"
7
8// simple 2D Ornstein-Uhlenbeck process simulation
9static void sim_ou2
10(
11 double *x1, double *x2,
12 double alpha1, double alpha2, double alpha3, double alpha4,
13 double sigma1, double sigma2, double sigma3
14 ) {
15 double eps[2], xnew[2];
16
17 eps[0] = rnorm(0,1);
18 eps[1] = rnorm(0,1);
19
20 xnew[0] = alpha1*(*x1)+alpha3*(*x2)+sigma1*eps[0];
21 xnew[1] = alpha2*(*x1)+alpha4*(*x2)+sigma2*eps[0]+sigma3*eps[1];
22
23 *x1 = xnew[0];
24 *x2 = xnew[1];
25}
26
27// simple 2D Ornstein-Uhlenbeck process transition density
28// transition (x1,x2) -> (z1,z2) in 1 unit of time
29static double dens_ou2
30(
31 double x1, double x2, double z1, double z2,
32 double alpha1, double alpha2, double alpha3, double alpha4,
33 double sigma1, double sigma2, double sigma3, int give_log
34 ) {
35 double eps[2], val;
36
37 // compute residuals
38 eps[0] = z1-alpha1*x1-alpha3*x2;
39 eps[1] = z2-alpha2*x1-alpha4*x2;
40
41 // backsolve
42 eps[0] /= sigma1;
43 eps[1] -= sigma2*eps[0];
44 eps[1] /= sigma3;
45
46 val = dnorm(eps[0],0.0,1.0,1)+dnorm(eps[1],0.0,1.0,1)-log(sigma1)-log(sigma3);
47 return ((give_log) ? val : exp(val));
48}
49
50#define ALPHA1 (p[parindex[0]])
51#define ALPHA2 (p[parindex[1]])
52#define ALPHA3 (p[parindex[2]])
53#define ALPHA4 (p[parindex[3]])
54#define SIGMA1 (p[parindex[4]])
55#define SIGMA2 (p[parindex[5]])
56#define SIGMA3 (p[parindex[6]])
57#define TAU (p[parindex[7]])
58
59#define X1 (stateindex[0])
60#define X2 (stateindex[1])
61
62#define Y1 (y[obsindex[0]])
63#define Y2 (y[obsindex[1]])
64
65#define V11 (f[vmatindex[0]])
66#define V21 (f[vmatindex[1]])
67#define V12 (f[vmatindex[2]])
68#define V22 (f[vmatindex[3]])
69
70// onestep simulator for use in 'discrete.time.sim' plug-in
72(
73 double *x, const double *p,
74 const int *stateindex, const int *parindex, const int *covindex,
75 const double *covars, double t, double deltat
76 ) {
78}
79
80// onestep transition probability density for use in 'onestep.dens' plug-in
81// transition from x to z as time goes from t1 to t2
83(
84 double *f,
85 double *x, double *z, double t1, double t2, const double *p,
86 const int *stateindex, const int *parindex, const int *covindex,
87 const double *covars
88 ) {
89 if (t2-t1 != 1)
90 err("ou2_pdf error: transitions must be consecutive");
91 f[0] = dens_ou2(x[X1],x[X2],z[X1],z[X2],ALPHA1,ALPHA2,ALPHA3,ALPHA4,
93}
94
96(
97 double *f, double *x, double *p,
98 int *stateindex, int *parindex, int *covindex,
99 double *covars, double t
100 ) {
101 f[X1] = ALPHA1*x[X1]+ALPHA3*x[X2];
102 f[X2] = ALPHA2*x[X1]+ALPHA4*x[X2];
103}
104
105// bivariate normal measurement error density
107(
108 double *lik, double *y, double *x, double *p, int give_log,
109 int *obsindex, int *stateindex, int *parindex, int *covindex,
110 double *covar, double t
111 ) {
112 double sd = fabs(TAU);
113 double f = 0.0;
114 f += (ISNA(Y1)) ? 0.0 : dnorm(Y1,x[X1],sd,1);
115 f += (ISNA(Y2)) ? 0.0 : dnorm(Y2,x[X2],sd,1);
116 *lik = (give_log) ? f : exp(f);
117}
118
119// bivariate normal measurement error simulator
121(
122 double *y, double *x, double *p,
123 int *obsindex, int *stateindex, int *parindex, int *covindex,
124 double *covar, double t
125 ) {
126 double sd = fabs(TAU);
127 Y1 = rnorm(x[X1],sd);
128 Y2 = rnorm(x[X2],sd);
129}
130
131// bivariate normal measurement error expectation
133(
134 double *y, double *x, double *p,
135 int *obsindex, int *stateindex, int *parindex, int *covindex,
136 double *covar, double t
137 ) {
138 Y1 = x[X1];
139 Y2 = x[X2];
140}
141
142// bivariate normal measurement variance
144(
145 double *f, double *x, double *p,
146 int *vmatindex, int *stateindex, int *parindex, int *covindex,
147 double *covar, double t
148 ) {
149 double sd = fabs(TAU);
150 V11 = V22 = sd*sd;
151 V12 = V21 = 0;
152}
153
154#undef ALPHA1
155#undef ALPHA2
156#undef ALPHA3
157#undef ALPHA4
158#undef SIGMA1
159#undef SIGMA2
160#undef SIGMA3
161#undef TAU
162
163#undef X1
164#undef X2
165#undef Y1
166#undef Y2
167
168#undef V11
169#undef V21
170#undef V12
171#undef V22
void _ou2_step(double *x, const double *p, const int *stateindex, const int *parindex, const int *covindex, const double *covars, double t, double deltat)
Definition ou2.c:72
#define X1
Definition ou2.c:59
static void sim_ou2(double *x1, double *x2, double alpha1, double alpha2, double alpha3, double alpha4, double sigma1, double sigma2, double sigma3)
Definition ou2.c:10
#define Y1
Definition ou2.c:62
#define V12
Definition ou2.c:67
#define Y2
Definition ou2.c:63
void _ou2_vmeasure(double *f, double *x, double *p, int *vmatindex, int *stateindex, int *parindex, int *covindex, double *covar, double t)
Definition ou2.c:144
#define TAU
Definition ou2.c:57
#define SIGMA3
Definition ou2.c:56
void _ou2_emeasure(double *y, double *x, double *p, int *obsindex, int *stateindex, int *parindex, int *covindex, double *covar, double t)
Definition ou2.c:133
void _ou2_dmeasure(double *lik, double *y, double *x, double *p, int give_log, int *obsindex, int *stateindex, int *parindex, int *covindex, double *covar, double t)
Definition ou2.c:107
#define V21
Definition ou2.c:66
#define ALPHA2
Definition ou2.c:51
#define V22
Definition ou2.c:68
void _ou2_rmeasure(double *y, double *x, double *p, int *obsindex, int *stateindex, int *parindex, int *covindex, double *covar, double t)
Definition ou2.c:121
#define X2
Definition ou2.c:60
#define V11
Definition ou2.c:65
static double dens_ou2(double x1, double x2, double z1, double z2, double alpha1, double alpha2, double alpha3, double alpha4, double sigma1, double sigma2, double sigma3, int give_log)
Definition ou2.c:30
void _ou2_skel(double *f, double *x, double *p, int *stateindex, int *parindex, int *covindex, double *covars, double t)
Definition ou2.c:96
#define SIGMA1
Definition ou2.c:54
void _ou2_pdf(double *f, double *x, double *z, double t1, double t2, const double *p, const int *stateindex, const int *parindex, const int *covindex, const double *covars)
Definition ou2.c:83
#define SIGMA2
Definition ou2.c:55
#define ALPHA3
Definition ou2.c:52
#define ALPHA4
Definition ou2.c:53
#define ALPHA1
Definition ou2.c:50
#define err(...)
Definition pomp.h:21