12 double *p, *p0, *p1, *p2;
17 for (j = 0, p = x; j <
nvars; j++, p++) {
18 for (k = 0, p0 = p, xx = 0, ct = 0; k < n; p0 +=
nvars, k++) {
24 if (ct < 1)
err(
"series %d has no data",j+1);
26 for (k = 0, p0 = p; k < n; p0 +=
nvars, k++)
27 if (R_FINITE(*p0)) *p0 -= xx;
31 for (j = 0, p0 = x, p = acf; j <
nvars; j++, p0++) {
32 for (i = 0; i < nlag; i++, p++) {
34 for (k = 0, ct = 0, xx = 0, p1 = p0, p2 = p0+lag*
nvars; k < n-lag; k++, p1 +=
nvars, p2 +=
nvars)
35 if (R_FINITE(*p1) && R_FINITE(*p2)) {
39 *p = (ct > 0) ? xx/ct : R_NaReal;
47static void pomp_ccf_compute (
double *ccf,
double *x,
double *y,
int n,
int *lags,
int nlag) {
53 for (k = 0, xx = 0, ct = 0, p = x; k < n; k++, p++) {
59 if (ct < 1)
err(
"series 1 has no data");
61 for (k = 0, p = x; k < n; k++, p++) {
62 if (R_FINITE(*p)) *p -= xx;
66 for (k = 0, xx = 0, ct = 0, p = y; k < n; k++, p++) {
72 if (ct < 1)
err(
"series 2 has no data");
74 for (k = 0, p = y; k < n; k++, p++) {
75 if (R_FINITE(*p)) *p -= xx;
79 for (j = 0, p = ccf; j < nlag; j++, p++) {
82 for (k = 0, xx = 0, ct = 0, p1 = x-lag, p2 = y; k < n+lag; k++, p1++, p2++)
83 if (R_FINITE(*p1) && R_FINITE(*p1)) {
87 *p = (ct > 0) ? xx/ct : R_NaReal;
89 for (k = 0, xx = 0, ct = 0, p1 = x, p2 = y+lag; k < n-lag; k++, p1++, p2++)
90 if (R_FINITE(*p1) && R_FINITE(*p1)) {
94 *p = (ct > 0) ? xx/ct : R_NaReal;
103 int nlag, correlation,
nvars, n;
105 double *p, *p1, *
cov;
110 PROTECT(lags = AS_INTEGER(lags));
112 correlation = *(INTEGER(AS_INTEGER(corr)));
114 nvars = INTEGER(GET_DIM(x))[0];
115 n = INTEGER(GET_DIM(x))[1];
117 PROTECT(
X = duplicate(AS_NUMERIC(x)));
119 PROTECT(ans = NEW_NUMERIC(nlag*
nvars));
125 cov = (
double *) R_alloc(
nvars,
sizeof(
double));
127 for (j = 0, p = REAL(ans), p1 =
cov; j <
nvars; j++, p1++)
128 for (k = 0; k < nlag; k++, p++)
132 PROTECT(ans_names = NEW_STRING(nlag*
nvars));
133 for (j = 0, l = 0; j <
nvars; j++) {
134 for (k = 0; k < nlag; k++, l++) {
135 snprintf(tmp,BUFSIZ,
"acf[%d]",lag[k]);
136 SET_STRING_ELT(ans_names,l,mkChar(tmp));
139 SET_NAMES(ans,ans_names);
148 double cov[2], xx, *p;
149 int nlag, n, correlation;
154 PROTECT(lags = AS_INTEGER(lags));
155 correlation = *(INTEGER(AS_INTEGER(corr)));
158 if (n != LENGTH(y))
err(
"'x' and 'y' must have equal lengths");
160 PROTECT(
X = duplicate(AS_NUMERIC(x)));
161 PROTECT(
Y = duplicate(AS_NUMERIC(y)));
163 PROTECT(ans = NEW_NUMERIC(nlag));
172 for (k = 0, p = REAL(ans); k < nlag; k++, p++) *p /= xx;
175 PROTECT(ans_names = NEW_STRING(nlag));
176 for (k = 0; k < nlag; k++) {
177 snprintf(tmp,BUFSIZ,
"ccf[%d]",INTEGER(lags)[k]);
178 SET_STRING_ELT(ans_names,k,mkChar(tmp));
180 SET_NAMES(ans,ans_names);