Zwar keine Unit oder eine Komponente, aber eine Funktion Sollte es einen besseren Ort fuer diesen Thread geben, bitte verschieben.
Ich wollte nur kurz eine soeben fertiggestellte Funktion zur Berechnung einer linearen Regressionsgerade vorstellen ... Weiterverwendung und Verbesserungsvorschlaege sind ausdruecklich erwuenscht!
Code: Alles auswählen
// Performs a linear regression analysis on DataX/DataY
// Return value is the slope of the regression line, secondary parameters (intercept and
// regression coefficient) are returned as out parameters
// Based on:
// http://www.easycalculation.com/statisti ... ession.php
// http://www.educalc.net/2104083.page
// http://de.wikibooks.org/wiki/Mathematik ... onsanalyse
function LinearRegression(DataX, DataY: array of double;
out Intercept, Coefficient: double): double;
var
i: integer;
SumX: double = 0.0;
SumXX: double = 0.0;
SumY: double = 0.0;
SumXY: double = 0.0;
AverageX, AverageY: double;
DeltaX, DeltaY: double;
SumDeltaXDeltaX: double = 0.0;
SumDeltaXDeltaY: double = 0.0;
SumDeltaYDeltaY: double = 0.0;
begin
// Check data arrays
Assert(Length(DataX) = Length(DataY),
'Data sets X and Y for regression analysis do not match in length.');
Assert(Length(DataX) >= 2, 'Data sets for regression are too short.');
for i := Low(DataX) to High(DataX) do
begin
SumX := SumX + DataX[i];
SumXX := SumXX + (DataX[i] * DataX[i]);
SumY := SumY + DataY[i];
SumXY := SumXY + (DataX[i] * DataY[i]);
end;
AverageX := SumX / Length(DataX);
AverageY := SumY / Length(DataY);
for i := Low(DataX) to High(DataX) do
begin
DeltaX := (DataX[i] - AverageX);
DeltaY := (DataY[i] - AverageY);
SumDeltaXDeltaX := SumDeltaXDeltaX + (DeltaX * DeltaX);
SumDeltaXDeltaY := SumDeltaXDeltaY + (DeltaX * DeltaY);
SumDeltaYDeltaY := SumDeltaYDeltaY + (DeltaY * DeltaY);
end;
// Calculate linear regression slope, intercept and correlation coefficient
Result := (Length(DataX) * SumXY - SumX * SumY) /
(Length(DataX) * SumXX - SumX * SumX);
Intercept := (SumY - Result * SumX) / Length(DataX);
Coefficient := SumDeltaXDeltaY / sqrt(SumDeltaXDeltaX * SumDeltaYDeltaY);
end;
Schoenen Abend ...