[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