Files
lazarus-ccr/applications/lazstats/source/forms/variables/transfrmunit.pas

361 lines
9.6 KiB
ObjectPascal
Raw Normal View History

unit TransfrmUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, Buttons, ExtCtrls, Math,
Globals, FunctionsLib, DataProcs, DictionaryUnit, ContextHelpUnit;
type
{ TTransFrm }
TTransFrm = class(TForm)
Bevel1: TBevel;
HelpBtn: TButton;
Label7: TLabel;
Label8: TLabel;
Panel1: TPanel;
Panel2: TPanel;
Panel4: TPanel;
Panel5: TPanel;
ResetBtn: TButton;
CancelBtn: TButton;
ComputeBtn: TButton;
ReturnBtn: TButton;
ConstantEdit: TEdit;
Splitter1: TSplitter;
TransEdit: TEdit;
Label6: TLabel;
SaveEdit: TEdit;
Label5: TLabel;
TransList: TListBox;
V2Edit: TEdit;
Label3: TLabel;
Label4: TLabel;
V1Edit: TEdit;
Label2: TLabel;
V1InBtn: TBitBtn;
V1OutBtn: TBitBtn;
V2InBtn: TBitBtn;
V2OutBtn: TBitBtn;
Label1: TLabel;
VarList: TListBox;
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure HelpBtnClick(Sender: TObject);
procedure ResetBtnClick(Sender: TObject);
procedure CancelBtnClick(Sender: TObject);
procedure ReturnBtnClick(Sender: TObject);
procedure ComputeBtnClick(Sender: TObject);
procedure TransListClick(Sender: TObject);
procedure V1InBtnClick(Sender: TObject);
procedure V1OutBtnClick(Sender: TObject);
procedure V2InBtnClick(Sender: TObject);
procedure V2OutBtnClick(Sender: TObject);
private
{ private declarations }
FAutoSized: boolean;
public
{ public declarations }
end;
var
TransFrm: TTransFrm;
implementation
uses
MainUnit, OutputUnit, Utils;
procedure TTransFrm.ResetBtnClick(Sender: TObject);
var i : integer;
begin
VarList.Clear;
V1Edit.Text := '';
V2Edit.Text := '';
ConstantEdit.Text := '';
SaveEdit.Text := '';
TransEdit.Text := '';
V1InBtn.Enabled := true;
V2InBtn.Enabled := true;
V1OutBtn.Enabled := false;
V2OutBtn.Enabled := false;
for i := 1 to NoVariables do
VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
end;
procedure TTransFrm.HelpBtnClick(Sender: TObject);
begin
if ContextHelpForm = nil then
Application.CreateForm(TContextHelpForm, ContextHelpForm);
ContextHelpForm.HelpMessage((Sender as TButton).tag);
end;
//-------------------------------------------------------------------
procedure TTransFrm.CancelBtnClick(Sender: TObject);
begin
TransFrm.Close;
end;
//-------------------------------------------------------------------
procedure TTransFrm.ReturnBtnClick(Sender: TObject);
begin
TransFrm.Close;
end;
//-------------------------------------------------------------------
procedure TTransFrm.ComputeBtnClick(Sender: TObject);
var
i, TIndex, v1col, v2col, gridcol : integer;
index: DblDyneVec = nil;
pcntile: DblDyneVec = nil;
cellstring : string;
TwoArgs : boolean;
constant, mean, stddev, N, X, Y, Z : double;
lReport: TStrings;
begin
constant := 0.0;
TwoArgs := false;
v1col := 1;
v2col := 2;
Y := 0.0;
Z := 0.0;
mean := 0.0;
stddev := 0.0;
lReport := TStringList.Create;
try
if (TransEdit.Text = '') then
begin
ErrorMsg('First click on the desired transformation.');
exit;
end;
if (V1Edit.Text = '') then
begin
ErrorMsg('First click on a variable to transform.');
exit;
end;
if (SaveEdit.Text = '') then
begin
ErrorMsg('Enter a label for the new variable.');
exit;
end;
// Check to see if the transformation requires two variables
TIndex := TransList.ItemIndex;
if ((TIndex > 4) and (TIndex < 10)) then
begin
TwoArgs := true;
if (V2Edit.Text = '') then
begin
ErrorMsg('Select a variable for the V2 arguement.');
exit;
end;
end;
// Find column of variable one and two (if selected)
for i := 1 to NoVariables do
begin
cellstring := OS3MainFrm.DataGrid.Cells[i,0];
if V1Edit.Text = cellstring then v1col := i;
if (TwoArgs) then
begin
if cellstring = v2Edit.Text then v2col := i;
end;
end;
// Check for a constant
if (ConstantEdit.Text <> '') then
constant := StrToFloat(ConstantEdit.Text);
// Add new column to grid
gridcol := NoVariables + 1;
DictionaryFrm.NewVar(gridcol);
DictionaryFrm.DictGrid.Cells[1,gridcol] := SaveEdit.Text;
OS3MainFrm.DataGrid.Cells[gridcol,0] := SaveEdit.Text;
cellstring := SaveEdit.Text;
OS3MainFrm.NoVarsEdit.Text := IntToStr(NoVariables);
// OS3MainFrm.DataGrid.ColCount := OS3MainFrm.DataGrid.ColCount + 1;
SetLength(index,NoCases);
SetLength(pcntile, NoCases);
// Do the appropriate transformation
if (TIndex = 21) then Rank(v1col, index); // get ranks
// get percentile ranks
if (TIndex = 22) or (TIndex = 24) then
PRank(v1col, pcntile, lReport);
if (TIndex = 20) or (TIndex = 23) then // z transformation - need mean and stddev
begin
mean := 0.0;
stddev := 0.0;
for i := 1 to NoCases do
begin
if IsFiltered(i) then continue;
X := StrToFloat(OS3MainFrm.DataGrid.Cells[v1col,i]);
mean := mean + X;
stddev := stddev + (X * X);
end;
N := NoCases;
stddev := stddev - (mean * mean) / N;
stddev := stddev / (N - 1.0);
stddev := sqrt(stddev);
mean := mean / N;
end;
for i := 1 to NoCases do // cases
begin
if IsFiltered(i) then continue;
cellstring := Trim((OS3MainFrm.DataGrid.Cells[v1col,i]));
if cellstring = '' then continue;
X := StrToFloat(cellstring);
if TwoArgs then Y := StrToFloat(OS3MainFrm.DataGrid.Cells[v2col,i]);
case TIndex of
0 : Z := X + constant;// V1 + C
1 : Z := X - constant;// V1 - C
2 : Z := X * constant;// V1 * C
3 : Z := X / constant;// V1 / C
4 : Z := power(X,constant);// v1 ** C
5 : Z := X + Y;// V1 + V2
6 : Z := X - Y;// V1 - V2
7 : Z := X * Y;// V1 * V2
8 : Z := X / Y;// V1 / V2
9 : Z := power(X,Y);// V1 ** V2
10: Z := ln(X);// ln(V1)
11: Z := log10(X);// log(V1)
12: Z := exp(X);// exp(V1)
13: Z := power(10.0,X);// exp(V1) base 10
14: Z := sin(X);// sin(V1)
15: Z := cos(X);// cos(V1)
16: Z := tan(X);// tan(V1)
17: Z := arcsin(X);// arcsin(V1)
18: Z := arccos(X);// arccos(V1)
19: Z := arctan(X);// arctan(V1)
20: Z := (X - mean) / stddev;// z(V1)
21: Z := index[i-1];// Rank(V1)
22: Z := pcntile[i-1] * 100.0;// %ilerank(V1)
23: // probz(V1)
begin
Y := (X - mean) / stddev;
Z := probz(Y);
end;
24: // inversez(V1) - convert to %ile ranks first
begin
Y := pcntile[i-1]; // y is %ile rank of X
Z := inversez(Y);
end;
25: Z := abs(X);// absolute value of V1: (abs(V1)
26: // New := C
begin
Z := constant;
end;
27: Z := constant - X;// New := C - V1
28: Z := constant / X;// New := C / V1
end;
OS3MainFrm.DataGrid.Cells[gridcol,i] := FloatToStr(Z);
end;
OS3MainFrm.DataGrid.Cells[gridcol,0] := SaveEdit.Text;
DisplayReport(lReport);
finally
lReport.Free;
index := nil;
pcntile := nil;
end;
end;
procedure TTransFrm.FormActivate(Sender: TObject);
begin
if FAutoSized then
exit;
Panel4.Constraints.MinWidth := 2 * Panel5.Width;
Constraints.MinWidth := Width;
Constraints.MinHeight := Height;
FAutoSized := true;
end;
procedure TTransFrm.FormCreate(Sender: TObject);
begin
Assert(OS3MainFrm <> nil);
if DictionaryFrm = nil then
Application.CreateForm(TDictionaryFrm, DictionaryFrm);
end;
//-------------------------------------------------------------------
procedure TTransFrm.FormShow(Sender: TObject);
begin
ResetBtnClick(self);
end;
//--------------------------------------------------------------------
procedure TTransFrm.TransListClick(Sender: TObject);
var
index : integer;
begin
index := TransList.ItemIndex;
TransEdit.Text := TransList.Items.Strings[index];
end;
//--------------------------------------------------------------------
procedure TTransFrm.V1InBtnClick(Sender: TObject);
var
index : integer;
begin
index := VarList.ItemIndex;
V1Edit.Text := VarList.Items.Strings[index];
VarList.Items.Delete(index);
V1OutBtn.Enabled := true;
V1InBtn.Enabled := false;
end;
//--------------------------------------------------------------------
procedure TTransFrm.V1OutBtnClick(Sender: TObject);
begin
VarList.Items.Add(V1Edit.Text);
V1Edit.Text := '';
V1InBtn.Enabled := true;
V1OutBtn.Enabled := false;
end;
//--------------------------------------------------------------------
procedure TTransFrm.V2InBtnClick(Sender: TObject);
var
index : integer;
begin
index := VarList.ItemIndex;
V2Edit.Text := VarList.Items.Strings[index];
VarList.Items.Delete(index);
V2OutBtn.Enabled := true;
V2InBtn.Enabled := false;
end;
//--------------------------------------------------------------------
procedure TTransFrm.V2OutBtnClick(Sender: TObject);
begin
VarList.Items.Add(V2Edit.Text);
V2Edit.Text := '';
V2InBtn.Enabled := true;
V2OutBtn.Enabled := false;
end;
//--------------------------------------------------------------------
initialization
{$I transfrmunit.lrs}
end.