11 SEXP z, mm,
tau, pivot, retval, retvalnames;
12 int n, nx, np, df, dim[2];
14 np = *(INTEGER(AS_INTEGER(order)));
15 df = *(INTEGER(AS_INTEGER(diff)));
18 dim[0] = nx; dim[1] = np;
20 if (nx < 1)
err(
"must have diff < number of observations");
22 PROTECT(z = duplicate(AS_NUMERIC(ref)));
24 PROTECT(
tau = NEW_NUMERIC(np));
25 PROTECT(pivot = NEW_INTEGER(np));
27 PROTECT(retval = NEW_LIST(3));
28 PROTECT(retvalnames = NEW_CHARACTER(3));
29 SET_STRING_ELT(retvalnames,0,mkChar(
"mm"));
30 SET_STRING_ELT(retvalnames,1,mkChar(
"tau"));
31 SET_STRING_ELT(retvalnames,2,mkChar(
"pivot"));
32 SET_ELEMENT(retval,0,mm);
33 SET_ELEMENT(retval,1,
tau);
34 SET_ELEMENT(retval,2,pivot);
35 SET_NAMES(retval,retvalnames);
44 SEXP
X, mm,
tau, pivot, beta, beta_names;
49 df = *(INTEGER(AS_INTEGER(diff)));
53 PROTECT(mm = VECTOR_ELT(setup,0));
54 PROTECT(
tau = VECTOR_ELT(setup,1));
55 PROTECT(pivot = VECTOR_ELT(setup,2));
57 nx = INTEGER(GET_DIM(mm))[0];
58 np = INTEGER(GET_DIM(mm))[1];
60 if (n-df != nx)
err(
"length of 'ref' must equal length of data");
61 PROTECT(
X = duplicate(AS_NUMERIC(x)));
63 PROTECT(beta = NEW_NUMERIC(np));
64 PROTECT(beta_names = NEW_STRING(np));
65 for (i = 0; i < np; i++) {
66 snprintf(tmp,BUFSIZ,
"marg.%d",i+1);
67 SET_STRING_ELT(beta_names,i,mkChar(tmp));
69 SET_NAMES(beta,beta_names);
117static void order_reg_solve (
double *beta,
double *x,
double *mm,
double *
tau,
int *pivot,
int n,
int np,
int diff) {
122 for (i = 0, nx = n; i < diff; i++) {
124 for (j = 0; j < nx; j++) x[j] = x[j+1] - x[j];
130 for (j = 0, xx = 0.0; j < nx; j++) xx += x[j];
132 for (j = 0; j < nx; j++) x[j] -= xx;
142 for (i = 0; i < np; i++) beta[pivot[i]] = x[i];
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)
static void order_reg_model_matrix(double *z, double *X, double *tau, int *pivot, int n, int np, int diff)
static void order_reg_solve(double *beta, double *x, double *mm, double *tau, int *pivot, int n, int np, int diff)