-
Notifications
You must be signed in to change notification settings - Fork 688
Closed
Labels
Description
Hello. I am trying to implement CORR() using custom function logic provided here:
https://github.com/alasql/alasql/wiki/User-Defined-Functions
This is my code.
alasql.aggr.CORR = function(valueX, valueY, accumulator, stage) {
if (stage === 1) {
// Initialize the accumulator object
accumulator = {
sumX: 0,
sumY: 0,
sumXY: 0,
sumX2: 0,
sumY2: 0,
count: 0
};
console.log('Stage 1: Initialized accumulator');
}
if (stage === 1 || stage === 2) {
// Check if valueX and valueY are valid numbers
if (typeof valueX === 'number' && typeof valueY === 'number') {
accumulator.sumX += valueX;
accumulator.sumY += valueY;
accumulator.sumXY += valueX * valueY;
accumulator.sumX2 += valueX * valueX;
accumulator.sumY2 += valueY * valueY;
accumulator.count++;
console.log('Stage 1/2: Updated accumulator with values:', valueX, valueY);
} else {
console.log('Stage 1/2: Skipped non-numeric values:', valueX, valueY);
}
}
if (stage === 3) {
console.log('Stage 3: Final accumulator state:', accumulator);
// Calculate the Pearson correlation coefficient
const count = accumulator.count;
const sumX = accumulator.sumX;
const sumY = accumulator.sumY;
const sumXY = accumulator.sumXY;
const sumX2 = accumulator.sumX2;
const sumY2 = accumulator.sumY2;
const numerator = (count * sumXY) - (sumX * sumY);
const denominatorX = Math.sqrt((count * sumX2) - (sumX * sumX));
const denominatorY = Math.sqrt((count * sumY2) - (sumY * sumY));
const denominator = denominatorX * denominatorY;
console.log('Stage 3: Calculated values:');
// Check if the denominator is zero or if there are no valid data points
if (denominator === 0 || count === 0) {
console.log('Stage 3: Undefined correlation');
return null; // Return null to indicate undefined correlation
}
const result = numerator / denominator;
console.log('Stage 3: Correlation coefficient:', result);
return result;
}
return accumulator;
};
But, somehow this returned {0 : {corr: 3}} , which signifies the calculation is not being done properly, considering pearson correlation always lies between -1 and 1...
Any guess or help to figure out what to do?
Thank you in advance.
Copilot