[Analogue-commits] r239 - pkg/src
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Sun Sep 11 20:07:33 CEST 2011
Author: gsimpson
Date: 2011-09-11 20:07:33 +0200 (Sun, 11 Sep 2011)
New Revision: 239
Modified:
pkg/src/distx.c
pkg/src/distxy.c
Log:
fix warning on CRAN on one system, start new code for expanded gower's method
Modified: pkg/src/distx.c
===================================================================
--- pkg/src/distx.c 2011-08-26 16:45:10 UTC (rev 238)
+++ pkg/src/distx.c 2011-09-11 18:07:33 UTC (rev 239)
@@ -407,9 +407,6 @@
double *maxi)
{
int i, j, ij;
- double dist;
-
- dist = 0.0;
ij = 0;
for(j=0; j <= *nr; j++) {
@@ -530,6 +527,21 @@
return 1 - (dist / wsum);
}
+double xx_calcTI(double *x, double *y, int nr1, int nr2, int nc, int i1, int i2)
+{
+ int k;
+ double ti;
+
+ ti = 0.0;
+
+ for (k=0; k<nc; k++) {
+ ti += (x[i1] == y[i2]) ? 1.0 : 0.0;
+ i1 += nr1;
+ i2 += nr2;
+ }
+ return ti;
+}
+
void xx_mixed(double *x, int *nr, int *nc, double *d,
int *vtype, double *weights, double *R)
{
Modified: pkg/src/distxy.c
===================================================================
--- pkg/src/distxy.c 2011-08-26 16:45:10 UTC (rev 238)
+++ pkg/src/distxy.c 2011-09-11 18:07:33 UTC (rev 239)
@@ -483,37 +483,77 @@
*/
double xy_MIXED(double *x, double *y, int nr1, int nr2,
int nc, int i1, int i2, int *vtype,
- double *weights, double *R, double wsum)
+ double *weights, double *R, int tmin, int tmax, int ord)
{
- double dist, dev;
+ double dist, dev, wsum; //, *curweights;
int count, j;
count = 0;
dist = 0.0;
+ wsum = 0.0;
+ //curweights = weights; /* current weights */
+
for (j=0; j<nc; j++) {
if (R_FINITE(x[i1]) && R_FINITE(y[i2])) {
- if(vtype[j] == 1) {
+ if(vtype[j] == 1) { // Symmetric binary
dev = (x[i1] == y[i2]) ? 1 : 0;
dist += dev * weights[j];
}
- if(vtype[j] == 2) {
- dev = (x[i1] == y[i2]) ? 1 : 0;
- dist += dev * weights[j];
+ if(vtype[j] == 2) { // Asymmetric binary
+ if((x[i1] != 0) || (y[i2] != 0)) {
+ // both x and y not zero for this variables
+ dev = (x[i1] == y[i2]) ? 1 : 0;
+ dist += dev * weights[j];
+ } else {
+ /* set jth current weight to zero and do not
+ increment dist as ignoring double zero
+ We actually subtract the weight as it gets added
+ later on.
+ */
+ wsum -= weights[j];
+ }
}
- if(vtype[j] == 3) {
+ if(vtype[j] == 3) { // Nominal
dev = (x[i1] == y[i2]) ? 1 : 0;
dist += dev * weights[j];
}
- if(vtype[j] == 4) {
+ if(vtype[j] == 4) { // Ordinal
/* ordinal data current not handled
* so don't call this yet
*/
+ switch(ord) {
+ case 1: { // classic gower as per nominal
+ dev = (x[i1] == y[i2]) ? 1 : 0;
+ dist += dev * weights[j];
+ break;
+ }
+ case 2: { // podanis rank version
+ if(x[i1] == y[i2]) {
+ dev = 1;
+ } else {
+ dev = (fabs(x[i1] - y[i2])) /
+ (R[j] - (tmax - 1)/2 - (tmin - 1)/2);
+ }
+ break;
+ }
+ case 3: { // podanis metric version treat as Quantitative??
+ dev = 1 - (fabs(x[i1] - y[i2]) / R[j]);
+ dist += dev * weights[j];
+ break;
+ }
+ default: {
+ dist += 0;
+ break;
+ }
+ }
}
- if(vtype[j] == 5) {
+ if(vtype[j] == 5) { // Quantitative
dev = 1 - (fabs(x[i1] - y[i2]) / R[j]);
dist += dev * weights[j];
}
count++;
+ // only summing weights for non-NA comparisons
+ wsum += weights[j];
}
i1 += nr1;
i2 += nr2;
@@ -522,25 +562,44 @@
return 1 - (dist / wsum);
}
+double xy_calcTI(double *x, double *y, int nr1, int nr2, int nc, int i1, int i2)
+{
+ int k;
+ double ti;
+
+ ti = 0.0;
+
+ for (k=0; k<nc; k++) {
+ ti += (x[i1] == y[i2]) ? 1.0 : 0.0;
+ i1 += nr1;
+ i2 += nr2;
+ }
+ return ti;
+}
+
void xy_mixed(double *x, double *y, int *nr1, int *nr2,
int *nc, double *d, int *vtype, double *weights,
- double *R)
+ double *R, int tmin, int tmax, int *podani,
+ double *tmatx, double *tmaty)
{
- int i, j, k, ij;
- double wsum;
+ int i, j, ij, ord = *podani;
+ //double tmat = *d;
- wsum = 0.0;
-
ij = 0;
- for(k=0; k <*nc; k++) {
- wsum += weights[k];
+ for(j=0; j < *nr1; j++) {
+ for(i=0; i < *nr2; i++) {
+ tmatx[ij] = xy_calcTI(x, y, *nr1, *nr2, *nc, j, i);
+ //tmaty[ij++] = xy_calcTI(
+ }
}
+ ij = 0;
+
for(j=0; j < *nr1; j++) {
for(i=0; i < *nr2; i++) {
d[ij++] = xy_MIXED(x, y, *nr1, *nr2, *nc, j, i,
- vtype, weights, R, wsum);
+ vtype, weights, R, tmin, tmax, ord);
}
}
}
More information about the Analogue-commits
mailing list