TAChart: Add fit parameter confidence limits to FitSeries.

git-svn-id: trunk@58747 -
This commit is contained in:
wp 2018-08-20 23:01:37 +00:00
parent ff36f03b93
commit 5e3a683299
3 changed files with 44 additions and 2 deletions

View File

@ -25,9 +25,9 @@ object frmMain: TfrmMain
Height = 487 Height = 487
Top = 0 Top = 0
Width = 400 Width = 400
ActivePage = TabSheet2 ActivePage = TabSheet1
Align = alClient Align = alClient
TabIndex = 1 TabIndex = 0
TabOrder = 0 TabOrder = 0
object TabSheet1: TTabSheet object TabSheet1: TTabSheet
Caption = 'Preparation' Caption = 'Preparation'

View File

@ -378,6 +378,7 @@ procedure TfrmMain.FitCompleteHandler(Sender:TObject);
const const
{$IF FPC_FullVersion >= 30004} {$IF FPC_FullVersion >= 30004}
MASK = '%-4s %10s %10s %10s %10s'; MASK = '%-4s %10s %10s %10s %10s';
CONF_MASK = '%-4s %10s %10s %10s';
{$ELSE} {$ELSE}
MASK = '%-4s %10s %10s %10s'; MASK = '%-4s %10s %10s %10s';
{$IFEND} {$IFEND}
@ -389,6 +390,7 @@ var
L: Integer; L: Integer;
decsep: Char; decsep: Char;
paramName: String; paramName: String;
confL, confH: Double;
begin begin
decsep := DefaultFormatSettings.DecimalSeparator; decsep := DefaultFormatSettings.DecimalSeparator;
with lbResults.Items do begin with lbResults.Items do begin
@ -421,6 +423,24 @@ begin
])); ]));
end; end;
Add(''); Add('');
{$IF FPC_FullVersion >= 30004}
Add('CONFIDENCE LIMITS');
Add(Format(CONF_MASK, ['Name', 'Value', 'Lower', 'Upper']));
for i := 0 to FitSeries.ParamCount - 1 do begin
case FitSeries.FitEquation of
fePolynomial: paramname := Format('b[%d]', [i]);
else paramname := PARAM_NAME[i];
end;
FitSeries.GetConfidenceLimits(i, confL, confH);
Add(Format(CONF_MASK, [
paramName,
MyFormatFloat(FitSeries.Param[i], STD_FMT, EXP_FMT),
MyFormatFloat(confL, STD_FMT, EXP_FMT),
MyFormatFloat(confH, STD_FMT, EXP_FMT)
]));
end;
Add('');
{$IFEND}
Add('ANALYSIS OF VARIANCE'); Add('ANALYSIS OF VARIANCE');
lbResults.Canvas.Font.Assign(lbResults.Font); lbResults.Canvas.Font.Assign(lbResults.Font);
FReportDecimals := 5; FReportDecimals := 5;

View File

@ -335,6 +335,9 @@ type
procedure ExecFit; virtual; procedure ExecFit; virtual;
function EquationText: IFitEquationText; function EquationText: IFitEquationText;
function FitParams: TDoubleDynArray; function FitParams: TDoubleDynArray;
{$IF FPC_FullVersion >= 30004}
procedure GetConfidenceLimits(AIndex: Integer; out ALower, AUpper: Double);
{$IFEND}
function GetFitEquationString( function GetFitEquationString(
ANumFormat: String; AXText: String = 'x'; AYText: String = 'y'): String; ANumFormat: String; AXText: String = 'x'; AYText: String = 'y'): String;
deprecated 'Use EquationText'; deprecated 'Use EquationText';
@ -1721,6 +1724,25 @@ begin
Result[i] := Param[i]; Result[i] := Param[i];
end; end;
{$IF FPC_FullVersion >= 30004}
procedure TFitSeries.GetConfidenceLimits(AIndex: Integer; out ALower, AUpper: Double);
var
val, sig, t: Double;
alpha: Double;
begin
val := GetParam_RawValue(AIndex);
sig := GetParam_RawError(AIndex);
alpha := 1.0 - FConfidenceLevel;
t := invtdist(alpha, Statistics.DOF, 2);
ALower := val - sig*t;
AUpper := val + sig*t;
if (FFitEquation in [feExp, fePower]) and (AIndex = 0) then begin
ALower := exp(ALower);
AUpper := exp(AUpper);
end;
end;
{$IFEND}
function TFitSeries.GetFitEquationString(ANumFormat: String; AXText: String; function TFitSeries.GetFitEquationString(ANumFormat: String; AXText: String;
AYText: String): String; AYText: String): String;
begin begin