35 return corcov(x, y, na_method, kendall,
TRUE);
39 return corcov(x, y, na_method, kendall,
FALSE);
44 #define COV_SUM_UPDATE \
51 #define ANS(I,J) ans[I + J * ncx]
60 #define COV_PAIRWISE_BODY \
61 LDOUBLE sum, xmean = 0., ymean = 0., xsd, ysd, xm, ym; \
62 int k, nobs, n1 = -1; \
67 for (k = 0 ; k < n ; k++) { \
68 if(!(ISNAN(xx[k]) || ISNAN(yy[k]))) { \
75 for (k = 0 ; k < n ; k++) \
76 if(!(ISNAN(xx[k]) || ISNAN(yy[k]))) \
80 xsd = ysd = sum = 0.; \
86 for(k=0; k < n; k++) { \
87 if(!(ISNAN(xx[k]) || ISNAN(yy[k]))) { \
95 for(n1=0 ; n1 < k ; n1++) \
96 if(!(ISNAN(xx[n1]) || ISNAN(yy[n1]))) { \
97 xm = sign(xx[k] - xx[n1]); \
98 ym = sign(yy[k] - yy[n1]); \
106 if(xsd == 0. || ysd == 0.) { \
116 sum /= (sqrtl(xsd) * sqrtl(ysd)); \
117 if(sum > 1.) sum = 1.; \
123 ANS(i,j) = (double) sum; \
129 static void cov_pairwise1(
int n,
int ncx,
double *x,
133 for (
int i = 0 ;
i < ncx ;
i++) {
134 double *xx = &x[
i *
n];
135 for (
int j = 0 ;
j <=
i ;
j++) {
136 double *yy = &x[
j *
n];
145 static void cov_pairwise2(
int n,
int ncx,
int ncy,
double *x,
double *y,
149 for (
int i = 0 ;
i < ncx ;
i++) {
150 double *xx = &x[
i *
n];
151 for (
int j = 0 ;
j < ncy ;
j++) {
152 double *yy = &y[
j *
n];
158 #undef COV_PAIRWISE_BODY
165 LDOUBLE sum, tmp, xxm, yym; \
169 #define COV_n_le_1(_n_,_k_) \
171 for (i = 0 ; i < ncx ; i++) \
172 for (j = 0 ; j < _k_ ; j++) \
173 ANS(i,j) = NA_REAL; \
177 #define COV_init(_ny_) \
178 COV_ini_0; int nobs; \
182 for(k = 0 ; k < n ; k++) { \
183 if (ind[k] != 0) nobs++; \
185 COV_n_le_1(nobs, _ny_)
187 #define COV_ini_na(_ny_) \
195 for (i = 0 ; i < nc##_X_ ; i++) { \
198 for (k = 0 ; k < n ; k++) \
202 if(R_FINITE((double)tmp)) { \
204 for (k = 0 ; k < n ; k++) \
206 sum += (xx[k] - tmp); \
207 tmp = tmp + sum / nobs; \
209 _X_##m [i] = (double)tmp; \
213 #define MEAN_(_X_,_HAS_NA_) \
215 for (i = 0 ; i < nc##_X_ ; i++) { \
221 for (k = 0 ; k < n ; k++) \
224 if(R_FINITE((double)tmp)) { \
226 for (k = 0 ; k < n ; k++) \
227 sum += (xx[k] - tmp); \
228 tmp = tmp + sum / n; \
231 _X_##m [i] = (double)tmp; \
236 cov_complete1(
int n,
int ncx,
double *x,
double *xm,
246 for (
i = 0 ;
i < ncx ;
i++) {
251 for (
j = 0 ;
j <=
i ;
j++) {
255 for (
k = 0 ;
k <
n ;
k++)
257 sum += (xx[
k] - xxm) * (yy[
k] - yym);
262 for (
j = 0 ;
j <=
i ;
j++) {
265 for (
k = 0 ;
k <
n ;
k++)
267 for (n1 = 0 ; n1 <
n ; n1++)
269 sum +=
sign(xx[
k] - xx[n1])
270 *
sign(yy[
k] - yy[n1]);
277 for (
i = 0 ;
i < ncx ;
i++)
279 for (
i = 0 ;
i < ncx ;
i++) {
280 for (
j = 0 ;
j <
i ;
j++) {
281 if (xm[i] == 0 || xm[
j] == 0) {
286 sum =
ANS(i,
j) / (xm[i] * xm[
j]);
287 if(sum > 1.) sum = 1.;
297 cov_na_1(
int n,
int ncx,
double *x,
double *xm,
308 for (i = 0 ;
i < ncx ;
i++) {
310 for (
j = 0 ;
j <= i ;
j++)
318 for (
j = 0 ;
j <= i ;
j++)
325 for (
k = 0 ;
k <
n ;
k++)
326 sum += (xx[
k] - xxm) * (yy[
k] - yym);
327 ANS(j,i) =
ANS(i,j) = (double)(sum / n1);
331 for (j = 0 ; j <= i ; j++)
337 for (
k = 0 ;
k <
n ;
k++)
338 for (n1 = 0 ; n1 <
n ; n1++)
339 sum +=
sign(xx[
k] - xx[n1]) *
sign(yy[
k] - yy[n1]);
340 ANS(j,i) =
ANS(i,j) = (double)sum;
347 for (i = 0 ; i < ncx ; i++)
348 if(!has_na[i]) xm[i] = sqrt(
ANS(i,i));
349 for (i = 0 ; i < ncx ; i++) {
350 if(!has_na[i])
for (j = 0 ; j < i ; j++) {
351 if (xm[i] == 0 || xm[j] == 0) {
356 sum =
ANS(i,j) / (xm[i] * xm[
j]);
357 if(sum > 1.) sum = 1.;
358 ANS(j,i) =
ANS(i,j) = (double)sum;
367 cov_complete2(
int n,
int ncx,
int ncy,
double *x,
double *y,
368 double *xm,
double *ym,
int *ind,
378 for (i = 0 ; i < ncx ; i++) {
382 for (j = 0 ; j < ncy ; j++) {
386 for (
k = 0 ;
k <
n ;
k++)
388 sum += (xx[
k] - xxm) * (yy[
k] - yym);
389 ANS(i,j) = (double)(sum / n1);
393 for (j = 0 ; j < ncy ; j++) {
396 for (
k = 0 ;
k <
n ;
k++)
398 for (n1 = 0 ; n1 <
n ; n1++)
400 sum +=
sign(xx[
k] - xx[n1])
401 *
sign(yy[
k] - yy[n1]);
402 ANS(i,j) = (double)sum;
409 #define COV_SDEV(_X_) \
410 for (i = 0 ; i < nc##_X_ ; i++) { \
415 for (k = 0 ; k < n ; k++) \
417 sum += (xx[k] - xxm) * (xx[k] - xxm); \
421 for (k = 0 ; k < n ; k++) \
423 for (n1 = 0 ; n1 < n ; n1++) \
424 if (ind[n1] != 0 && xx[k] != xx[n1]) \
427 _X_##m [i] = (double)sqrtl(sum); \
433 for (i = 0 ; i < ncx ; i++)
434 for (j = 0 ; j < ncy ; j++)
435 if (xm[i] == 0. || ym[j] == 0.) {
440 ANS(i,j) /= (xm[i] * ym[
j]);
441 if(
ANS(i,j) > 1.)
ANS(i,j) = 1.;
449 cov_na_2(
int n,
int ncx,
int ncy,
double *x,
double *y,
450 double *xm,
double *ym,
int *has_na_x,
int *has_na_y,
460 for (i = 0 ; i < ncx ; i++) {
462 for (j = 0 ; j < ncy; j++)
469 for (j = 0 ; j < ncy ; j++)
476 for (
k = 0 ;
k <
n ;
k++)
477 sum += (xx[
k] - xxm) * (yy[
k] - yym);
478 ANS(i,j) = (double)(sum / n1);
482 for (j = 0 ; j < ncy ; j++)
488 for (
k = 0 ;
k <
n ;
k++)
489 for (n1 = 0 ; n1 <
n ; n1++)
490 sum +=
sign(xx[
k] - xx[n1]) *
sign(yy[
k] - yy[n1]);
491 ANS(i,j) = (double)sum;
499 #define COV_SDEV(_X_) \
500 for (i = 0 ; i < nc##_X_ ; i++) \
501 if(!has_na_##_X_[i]) { \
506 for (k = 0 ; k < n ; k++) \
507 sum += (xx[k] - xxm) * (xx[k] - xxm); \
511 for (k = 0 ; k < n ; k++) \
512 for (n1 = 0 ; n1 < n ; n1++) \
513 if (xx[k] != xx[n1]) \
516 _X_##m [i] = (double) sqrtl(sum); \
522 for (i = 0 ; i < ncx ; i++)
524 for (j = 0 ; j < ncy ; j++)
526 if (xm[i] == 0. || ym[j] == 0.) {
531 ANS(i,j) /= (xm[i] * ym[
j]);
532 if(
ANS(i,j) > 1.)
ANS(i,j) = 1.;
551 for (i = 0 ; i < n ; i++) \
553 if (na_fail) error(_("missing observations in cov/cor"));\
560 for (i = 0 ; i < n ; i++) \
562 for (j = 0 ; j < ncx ; j++) { \
567 static void complete1(
int n,
int ncx,
double *x,
int *ind,
Rboolean na_fail)
573 complete2(
int n,
int ncx,
int ncy,
double *x,
double *y,
int *ind,
Rboolean na_fail)
577 for(j = 0 ; j < ncy ; j++) {
583 #define NA_CHECK(_HAS_NA_) \
584 for (i = 0 ; i < n ; i++) \
586 _HAS_NA_[j] = 1; break; \
589 #define HAS_NA_1(_X_,_HAS_NA_) \
590 for (j = 0 ; j < nc##_X_ ; j++) { \
597 static void find_na_1(
int n,
int ncx,
double *x,
int *has_na)
605 find_na_2(
int n,
int ncx,
int ncy,
double *x,
double *y,
int *has_na_x,
int *has_na_y)
625 SEXP ans, xm, ym, ind;
626 Rboolean ansmat, kendall, pair, na_fail, everything, sd_0, empty_err;
627 int i, method,
n, ncx, ncy, nprotect = 2;
650 error(
_(
"incompatible dimensions"));
656 error(
_(
"incompatible dimensions"));
688 error(
_(
"invalid 'use' (computational method)"));
690 if (empty_err && !
LENGTH(x))
709 cov_complete1(n, ncx,
REAL(x),
REAL(xm),
713 for(i = 0; i <
n; i++) {
716 if(!indany)
error(
_(
"no complete element pairs"));
721 cov_pairwise1(n, ncx,
REAL(x),
REAL(ans), &sd_0, cor, kendall);
746 for(i = 0; i <
n; i++) {
749 if(!indany)
error(
_(
"no complete element pairs"));
755 &sd_0, cor, kendall);
785 warning(
_(
"the standard deviation is zero"));