40 {
41
42
43
44
45
46
47 int maxlag, nx, ny, ok, ct;
48 int i, j, k;
49 double xx, *yp;
50 double obs1;
51
52
53 for (maxlag = 0, i = 0; i < nterms; i++)
54 maxlag = (lag[i] > maxlag) ? lag[i] : maxlag;
55 ny = n - maxlag;
56
57
58 for (j = 0, ct = 0, xx = 0.0; j < n; j++)
59 if (R_FINITE(y[j])) {
60 xx += y[j];
61 ct++;
62 }
63 xx /= ct;
64
65
66
67 ok = 0;
68 obs1 = R_NaReal;
69 for (j = 0; j < n; j++) {
70 if (R_FINITE(y[j])) {
71 if (!ok && (j < ny)) {
72 if (!R_FINITE(obs1)) obs1 = y[j];
73 else if (y[j] != obs1) ok = 1;
74 }
75 y[j] -= xx;
76 }
77 }
78
79 if (!ok) {
80
81 for (i = 0; i < nterms; i++) beta[i] = 0.0;
82
83 } else {
84
85 double *Xp;
86 int finite[ny];
87
88
89 for (nx = 0, yp = y+maxlag, j = 0; j < ny; j++) {
90 finite[j] = (R_FINITE(yp[j])) ? 1 : 0;
91 for (i = 0; i < nterms; i++)
92 finite[j] = (R_FINITE(yp[j-lag[i]])) ? finite[j] : 0;
93 if (finite[j]) nx++;
94 }
95
96
97
98 for (Xp =
X, i = 0; i < nterms; i++) {
99 for (j = 0; j < ny; j++) {
100 if (finite[j]) {
101 xx = yp[j-lag[i]];
102 *Xp = xx;
103 for (k = 1; k < power[i]; k++) *Xp *= xx;
104 Xp++;
105 }
106 }
107 }
108
109
110
111 for (i = 0, j = 0; j < ny; j++)
112 if (finite[j]) yp[i++] = yp[j];
113
114
115 {
117 int pivot[nterms];
118
119
121
124
125
126 for (i = 0; i < nterms; i++) beta[pivot[i]] = yp[i];
127
128 }
129
130 }
131
132}
static R_INLINE void pomp_qr(double *a, int m, int n, int *pivot, double *tau)
static R_INLINE void pomp_qrqy(double *c, double *a, int lda, double *tau, int m, int n, int k, char *side, char *transpose)
static R_INLINE void pomp_backsolve(double *a, int lda, int n, double *x, int incx, char *uplo, char *transpose, char *unit)