Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/dataprocessing/LogarithmTransform.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/dataprocessing/LogarithmTransform.java	(revision 39)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/dataprocessing/LogarithmTransform.java	(revision 40)
@@ -35,6 +35,10 @@
 			Instance instance = testdata.instance(i);
 			for( int j=0 ; j<testdata.numAttributes() ; j++ ) {
-				if( testdata.attribute(j)!=classAttribute ) {
-					instance.setValue(j, Math.log(1+instance.value(j)));
+				if( testdata.attribute(j)!=classAttribute && testdata.attribute(j).isNumeric() ) {
+					if( instance.value(j) < 0 ) {
+						instance.setValue(j, (-1*(Math.log(-1*instance.value(j)))));
+					}else {
+						instance.setValue(j, Math.log(1+instance.value(j)));
+					}
 				}
 			}
@@ -46,6 +50,10 @@
 				Instance instance = traindata.instance(i);
 				for( int j=0 ; j<testdata.numAttributes() ; j++ ) {
-					if( testdata.attribute(j)!=classAttribute ) {
-						instance.setValue(j, Math.log(1+instance.value(j)));
+					if( traindata.attribute(j)!=classAttribute && traindata.attribute(j).isNumeric() ) {
+						if( instance.value(j) < 0 ) {
+							instance.setValue(j, (-1*(Math.log(-1*instance.value(j)))));
+						}else {
+							instance.setValue(j, Math.log(1+instance.value(j)));
+						}
 					}
 				}
@@ -65,6 +73,10 @@
 			Instance instance = testdata.instance(i);
 			for( int j=0 ; j<testdata.numAttributes() ; j++ ) {
-				if( testdata.attribute(j)!=classAttribute ) {
-					instance.setValue(j, Math.log(1+instance.value(j)));
+				if( testdata.attribute(j)!=classAttribute && testdata.attribute(j).isNumeric() ) {
+					if( instance.value(j) < 0 ) {
+						instance.setValue(j, (-1*(Math.log(-1*instance.value(j)))));
+					}else {
+						instance.setValue(j, Math.log(1+instance.value(j)));
+					}
 				}
 			}
@@ -75,6 +87,10 @@
 			Instance instance = traindata.instance(i);
 			for( int j=0 ; j<testdata.numAttributes() ; j++ ) {
-				if( testdata.attribute(j)!=classAttribute ) {
-					instance.setValue(j, Math.log(1+instance.value(j)));
+				if( traindata.attribute(j)!=classAttribute && traindata.attribute(j).isNumeric() ) {
+					if( instance.value(j) < 0 ) {
+						instance.setValue(j, (-1*(Math.log(-1*instance.value(j)))));
+					}else {
+						instance.setValue(j, Math.log(1+instance.value(j)));
+					}
 				}
 			}
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/dataprocessing/MedianAsReference.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/dataprocessing/MedianAsReference.java	(revision 39)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/dataprocessing/MedianAsReference.java	(revision 40)
@@ -10,5 +10,5 @@
  * Median as reference transformation after Carmargo Cruz and Ochimizu: Towards Logistic Regression Models for Predicting Fault-prone Code across Software Projects
  * <br><br>
- * For each attribute value x, the new value is x-median of the test data
+ * For each attribute value x, the new value is x + (median of the test data - median of the current project)
  * @author Steffen Herbold
  */
@@ -30,6 +30,9 @@
 	public void apply(Instances testdata, SetUniqueList<Instances> traindataSet) {
 		final Attribute classAttribute = testdata.classAttribute();
+		final double[] median = new double[testdata.numAttributes()];
 		
-		final double[] median = new double[testdata.numAttributes()];
+		// test and train have the same number of attributes
+		Attribute traindataClassAttribute;
+		double[] currentmedian = new double[testdata.numAttributes()];
 		
 		// get medians
@@ -40,21 +43,18 @@
 		}
 		
-		// update testdata
-		for( int i=0 ; i<testdata.numInstances() ; i++ ) {
-			Instance instance = testdata.instance(i);
-			for( int j=0 ; j<testdata.numAttributes() ; j++ ) {
-				if( testdata.attribute(j)!=classAttribute ) {
-					instance.setValue(j, instance.value(j)-median[j]);
+		// preprocess training data
+		for( Instances traindata : traindataSet ) {
+			// get median of current training set 
+			traindataClassAttribute = traindata.classAttribute();
+			for( int j=0 ; j<traindata.numAttributes() ; j++ ) {
+				if( traindata.attribute(j)!=traindataClassAttribute && traindata.attribute(j).isNumeric()) {
+					currentmedian[j] = traindata.kthSmallestValue(j, (traindata.numInstances()+1)>>1); // (>>2 -> /2)
 				}
 			}
-		}
-		
-		// preprocess training data
-		for( Instances traindata : traindataSet ) {
 			for( int i=0 ; i<traindata.numInstances() ; i++ ) {
 				Instance instance = traindata.instance(i);
-				for( int j=0 ; j<testdata.numAttributes() ; j++ ) {
-					if( testdata.attribute(j)!=classAttribute ) {
-						instance.setValue(j, instance.value(j)-median[j]);
+				for( int j=0 ; j<traindata.numAttributes() ; j++ ) {
+					if( traindata.attribute(j)!=classAttribute && traindata.attribute(j).isNumeric() ) {
+						instance.setValue(j, instance.value(j) + (median[j] - currentmedian[j]));
 					}
 				}
@@ -69,6 +69,9 @@
 	public void apply(Instances testdata, Instances traindata) {
 		final Attribute classAttribute = testdata.classAttribute();
-		
+		final Attribute traindataClassAttribute = traindata.classAttribute();
 		final double[] median = new double[testdata.numAttributes()];
+
+		// test and train have the same number of attributes
+		double[] currentmedian = new double[testdata.numAttributes()];
 		
 		// get medians
@@ -78,12 +81,9 @@
 			}
 		}
-		
-		// update testdata
-		for( int i=0 ; i<testdata.numInstances() ; i++ ) {
-			Instance instance = testdata.instance(i);
-			for( int j=0 ; j<testdata.numAttributes() ; j++ ) {
-				if( testdata.attribute(j)!=classAttribute ) {
-					instance.setValue(j, instance.value(j)-median[j]);
-				}
+
+		// get median of current training set 
+		for( int j=0 ; j<traindata.numAttributes() ; j++ ) {
+			if( traindata.attribute(j)!=traindataClassAttribute && traindata.attribute(j).isNumeric() ) {
+				currentmedian[j] = traindata.kthSmallestValue(j, (traindata.numInstances()+1)>>1); // (>>2 -> /2)
 			}
 		}
@@ -92,7 +92,7 @@
 		for( int i=0 ; i<traindata.numInstances() ; i++ ) {
 			Instance instance = traindata.instance(i);
-			for( int j=0 ; j<testdata.numAttributes() ; j++ ) {
-				if( testdata.attribute(j)!=classAttribute ) {
-					instance.setValue(j, instance.value(j)-median[j]);
+			for( int j=0 ; j<traindata.numAttributes() ; j++ ) {
+				if( traindata.attribute(j)!=classAttribute  && traindata.attribute(j).isNumeric() ) {
+					instance.setValue(j, instance.value(j) + (median[j] - currentmedian[j]));
 				}
 			}
