summaryrefslogtreecommitdiff log msg author committer range
diff options
 context: 12345678910152025303540 space: includeignore mode: unifiedssdiffstat only
author committer Philippe Jung 2015-06-21 19:08:34 +0200 Philippe Jung 2015-06-21 17:26:26 +0000 e0e285574244e855fd148ab7320b1aeb5914655a (patch) 5dd6b3e775a2dc7d4961df599bed03f4d4088b0e bc265079743b2410d811b8ce72c8f47676970616 (diff)
tdf#92231 Potential regression curve calculation is wrong
Fixes potential regression curve class. For potential regression curve algorithm, we try to get y = C * D^x Switching to neperian logs: ln(y) = ln(C) + x ln(D) So we make a linear regression and get slope = ln(D) => D = exp(slope) intercept = ln(C) => C = exp(intercept) The current code computes the linear regression between log(y) and log(x) It should be between ln(y) and x. Moreover, the slope is ln(D) so exp(slope) should be returned. Finally, in getCurveValue, the return value is y = C x^D which is wrong Change-Id: If8c952001229d3436be48abfef87c8302cf0544f Reviewed-on: https://gerrit.libreoffice.org/16400 Reviewed-by: Philippe Jung <phil.jung@free.fr> Tested-by: Philippe Jung <phil.jung@free.fr>
-rw-r--r--chart2/source/tools/PotentialRegressionCurveCalculator.cxx15
1 files changed, 12 insertions, 3 deletions
 diff --git a/chart2/source/tools/PotentialRegressionCurveCalculator.cxx b/chart2/source/tools/PotentialRegressionCurveCalculator.cxxindex 7495c912b6ea..6f3d438ced6f 100644--- a/chart2/source/tools/PotentialRegressionCurveCalculator.cxx+++ b/chart2/source/tools/PotentialRegressionCurveCalculator.cxx@@ -51,6 +51,14 @@ void SAL_CALL PotentialRegressionCurveCalculator::recalculateRegression( aXValues, aYValues, RegressionCalculationHelper::isValidAndBothPositive())); + // We try to get y =C * D^x+ // switching to neperian logs:+ // ln(y) = ln(C) + x ln(D)+ // So we make a linear regression and get+ // slope = ln(D) => D = exp(slope)+ // intercept = ln(C) => C = exp(intercept)+ // Warning: the linear regression is between+ // ln(y) and x. Not between ln(y) and ln(x) const size_t nMax = aValues.first.size(); if( nMax == 0 ) {@@ -64,7 +72,7 @@ void SAL_CALL PotentialRegressionCurveCalculator::recalculateRegression( size_t i = 0; for( i = 0; i < nMax; ++i ) {- fAverageX += log( aValues.first[i] );+ fAverageX += aValues.first[i] ; fAverageY += log( aValues.second[i] ); } @@ -75,7 +83,7 @@ void SAL_CALL PotentialRegressionCurveCalculator::recalculateRegression( double fQx = 0.0, fQy = 0.0, fQxy = 0.0; for( i = 0; i < nMax; ++i ) {- double fDeltaX = log( aValues.first[i] ) - fAverageX;+ double fDeltaX = aValues.first[i] - fAverageX; double fDeltaY = log( aValues.second[i] ) - fAverageY; fQx += fDeltaX * fDeltaX;@@ -87,6 +95,7 @@ void SAL_CALL PotentialRegressionCurveCalculator::recalculateRegression( m_fIntercept = fAverageY - m_fSlope * fAverageX; m_fCorrelationCoeffitient = fQxy / sqrt( fQx * fQy ); + m_fSlope = exp( m_fSlope ); m_fIntercept = exp( m_fIntercept ); } @@ -100,7 +109,7 @@ double SAL_CALL PotentialRegressionCurveCalculator::getCurveValue( double x ) if( ! ( ::rtl::math::isNan( m_fSlope ) || ::rtl::math::isNan( m_fIntercept ))) {- fResult = m_fIntercept * pow( x, m_fSlope );+ fResult = m_fIntercept * pow( m_fSlope, x ); } return fResult;