diff --git a/applications/lazstats/source/forms/analysis/nonparametric/exactunit.lfm b/applications/lazstats/source/forms/analysis/nonparametric/exactunit.lfm index 1ba3c3677..e0e375ac2 100644 --- a/applications/lazstats/source/forms/analysis/nonparametric/exactunit.lfm +++ b/applications/lazstats/source/forms/analysis/nonparametric/exactunit.lfm @@ -1,485 +1,465 @@ -object FisherFrm: TFisherFrm +inherited FisherFrm: TFisherFrm Left = 535 - Height = 472 + Height = 524 Top = 234 - Width = 672 + Width = 691 HelpType = htKeyword HelpKeyword = 'html/FishersExactTest.htm' Caption = 'Fisher''s Exact Test for a 2 by 2 Table' - ClientHeight = 472 - ClientWidth = 672 - OnActivate = FormActivate - OnCreate = FormCreate - OnShow = FormShow - LCLVersion = '2.1.0.0' - object InputGrp: TRadioGroup - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = Owner - Left = 8 - Height = 114 - Top = 8 - Width = 425 - AutoFill = True - AutoSize = True - BorderSpacing.Left = 8 - BorderSpacing.Top = 8 - Caption = 'Input Options' - ChildSizing.LeftRightSpacing = 12 - ChildSizing.TopBottomSpacing = 6 - ChildSizing.VerticalSpacing = 2 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 94 - ClientWidth = 421 - Items.Strings = ( - 'Count cases classified by row and column vectors in the data grid.' - 'Use frequencies recorded in the data grid for row and column variables.' - 'Use proportions recorded in the data grid for row and column variables.' - 'Enter frequencies on this form.' - ) - OnClick = InputGrpClick - TabOrder = 0 - end - object ResetBtn: TButton - AnchorSideRight.Control = ComputeBtn - AnchorSideBottom.Control = Owner - AnchorSideBottom.Side = asrBottom - Left = 455 - Height = 25 - Top = 439 - Width = 54 - Anchors = [akRight, akBottom] - AutoSize = True - BorderSpacing.Left = 12 - BorderSpacing.Top = 8 - BorderSpacing.Right = 12 - BorderSpacing.Bottom = 8 - Caption = 'Reset' - OnClick = ResetBtnClick - TabOrder = 3 - end - object ComputeBtn: TButton - AnchorSideRight.Control = CloseBtn - AnchorSideBottom.Control = Owner - AnchorSideBottom.Side = asrBottom - Left = 521 - Height = 25 - Top = 439 - Width = 76 - Anchors = [akRight, akBottom] - AutoSize = True - BorderSpacing.Left = 8 - BorderSpacing.Top = 8 - BorderSpacing.Right = 8 - BorderSpacing.Bottom = 8 - Caption = 'Compute' - OnClick = ComputeBtnClick - TabOrder = 4 - end - object CloseBtn: TButton - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = Owner - AnchorSideBottom.Side = asrBottom - Left = 605 - Height = 25 - Top = 439 - Width = 55 - Anchors = [akRight, akBottom] - AutoSize = True - BorderSpacing.Left = 8 - BorderSpacing.Top = 8 - BorderSpacing.Right = 12 - BorderSpacing.Bottom = 8 - Caption = 'Close' - ModalResult = 11 - TabOrder = 5 - end - object Bevel1: TBevel - AnchorSideLeft.Control = Owner - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = CloseBtn - Left = 0 - Height = 8 - Top = 423 - Width = 672 - Anchors = [akLeft, akRight, akBottom] - Shape = bsBottomLine - end - object Panel2: TPanel - AnchorSideLeft.Control = InputGrp - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = InputGrp - Left = 449 - Height = 77 - Top = 32 - Width = 206 - Alignment = taRightJustify - AutoSize = True - BorderSpacing.Left = 16 - BorderSpacing.Top = 24 - BorderSpacing.Right = 8 - BevelOuter = bvNone - ChildSizing.HorizontalSpacing = 8 - ChildSizing.VerticalSpacing = 8 - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 3 - ClientHeight = 77 - ClientWidth = 206 - TabOrder = 1 - object Label5: TLabel - Left = 0 - Height = 15 - Top = 0 - Width = 30 - Caption = ' ' - ParentColor = False - end - object Label6: TLabel - Left = 38 - Height = 15 - Top = 0 - Width = 80 - Alignment = taCenter - Caption = 'Row 1' - ParentColor = False - end - object Label7: TLabel - Left = 126 - Height = 15 - Top = 0 - Width = 80 - Alignment = taCenter - Caption = 'Row 2' - ParentColor = False - end - object Label8: TLabel - Left = 0 - Height = 23 - Top = 23 - Width = 30 - Caption = 'Col. 1' - Layout = tlCenter - ParentColor = False - end - object RC11Edit: TEdit - Left = 38 - Height = 23 - Top = 23 - Width = 80 - Alignment = taRightJustify - OnKeyPress = RC11EditKeyPress - TabOrder = 0 - Text = 'RC11Edit' - end - object RC12Edit: TEdit - Left = 126 - Height = 23 - Top = 23 - Width = 80 - Alignment = taRightJustify - OnKeyPress = RC12EditKeyPress - TabOrder = 1 - Text = 'RC12Edit' - end - object Label9: TLabel - Left = 0 - Height = 23 - Top = 54 - Width = 30 - Caption = 'Col. 2' - Layout = tlCenter - ParentColor = False - end - object RC21Edit: TEdit - Left = 38 - Height = 23 - Top = 54 - Width = 80 - Alignment = taRightJustify - OnKeyPress = RC21EditKeyPress - TabOrder = 2 - Text = 'RC21Edit' - end - object RC22Edit: TEdit - Left = 126 - Height = 23 - Top = 54 - Width = 80 - Alignment = taRightJustify - OnKeyPress = RC22EditKeyPress - TabOrder = 3 - Text = 'RC22Edit' - end - end - object Panel1: TPanel - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = InputGrp - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = Bevel1 - Left = 8 - Height = 285 - Top = 138 - Width = 656 - Anchors = [akTop, akLeft, akRight, akBottom] - BorderSpacing.Left = 8 - BorderSpacing.Top = 16 - BorderSpacing.Right = 8 - BevelOuter = bvNone - ClientHeight = 285 - ClientWidth = 656 - TabOrder = 2 - object Label1: TLabel - AnchorSideLeft.Control = Panel1 - AnchorSideTop.Control = Panel1 - Left = 0 - Height = 15 - Top = 0 - Width = 97 - Caption = 'Variables Available' - ParentColor = False - end - object RowLabel: TLabel - AnchorSideLeft.Control = RowEdit - AnchorSideBottom.Control = RowEdit - Left = 350 - Height = 15 - Top = 25 - Width = 67 - Anchors = [akLeft, akBottom] - BorderSpacing.Bottom = 2 - Caption = 'Row Variable' - ParentColor = False - end - object ColLabel: TLabel - AnchorSideLeft.Control = ColEdit - AnchorSideBottom.Control = ColEdit - Left = 350 - Height = 15 - Top = 109 - Width = 87 - Anchors = [akLeft, akBottom] - BorderSpacing.Bottom = 2 - Caption = 'Column Variable' - ParentColor = False - end - object DepLabel: TLabel - AnchorSideLeft.Control = DepEdit - AnchorSideBottom.Control = DepEdit - Left = 350 - Height = 15 - Top = 193 - Width = 99 - Anchors = [akLeft, akBottom] - BorderSpacing.Bottom = 2 - Caption = 'Variable to Analyze' - ParentColor = False - end - object NCasesLabel: TLabel - AnchorSideTop.Control = NCasesEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = NCasesEdit - Left = 494 - Height = 15 - Top = 257 - Width = 97 - Anchors = [akTop, akRight] - BorderSpacing.Right = 8 - Caption = 'Total No. of Cases:' - ParentColor = False - end - object VarList: TListBox - AnchorSideLeft.Control = Panel1 - AnchorSideTop.Control = Label1 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = RowIn - AnchorSideBottom.Control = Panel1 - AnchorSideBottom.Side = asrBottom - Left = 0 - Height = 268 - Top = 17 - Width = 306 - Anchors = [akTop, akLeft, akRight, akBottom] - BorderSpacing.Top = 2 - BorderSpacing.Right = 8 - ItemHeight = 0 - TabOrder = 0 - end - object RowIn: TBitBtn - AnchorSideLeft.Control = Panel1 - AnchorSideLeft.Side = asrCenter - AnchorSideTop.Control = VarList - Left = 314 - Height = 28 - Top = 17 - Width = 28 - Images = MainDataModule.ImageList - ImageIndex = 1 - OnClick = RowInClick - Spacing = 0 - TabOrder = 1 - end - object RowEdit: TEdit - AnchorSideLeft.Control = RowIn - AnchorSideLeft.Side = asrBottom - AnchorSideRight.Control = Panel1 - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = RowOut - AnchorSideBottom.Side = asrBottom - Left = 350 - Height = 23 - Top = 42 - Width = 298 - Anchors = [akLeft, akRight, akBottom] - BorderSpacing.Left = 8 - BorderSpacing.Right = 8 - BorderSpacing.Bottom = 12 - ReadOnly = True - TabOrder = 2 - Text = 'RowEdit' - end - object ColEdit: TEdit - AnchorSideLeft.Control = ColIn - AnchorSideLeft.Side = asrBottom - AnchorSideRight.Control = Panel1 - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = ColOut - AnchorSideBottom.Side = asrBottom - Left = 350 - Height = 23 - Top = 126 - Width = 298 - Anchors = [akLeft, akRight, akBottom] - BorderSpacing.Left = 8 - BorderSpacing.Right = 8 - BorderSpacing.Bottom = 12 - ReadOnly = True - TabOrder = 3 - Text = 'ColEdit' - end - object DepEdit: TEdit - AnchorSideLeft.Control = DepIn - AnchorSideLeft.Side = asrBottom - AnchorSideRight.Control = Panel1 - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = DepOut - AnchorSideBottom.Side = asrBottom - Left = 350 - Height = 23 - Top = 210 - Width = 298 - Anchors = [akLeft, akRight, akBottom] - BorderSpacing.Left = 8 - BorderSpacing.Right = 8 - BorderSpacing.Bottom = 12 - ReadOnly = True - TabOrder = 4 - Text = 'DepEdit' - end - object NCasesEdit: TEdit - AnchorSideTop.Control = DepOut - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Panel1 - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = Panel1 - AnchorSideBottom.Side = asrBottom - Left = 599 - Height = 23 - Top = 253 - Width = 49 - Alignment = taRightJustify - Anchors = [akTop, akRight] - BorderSpacing.Top = 8 - BorderSpacing.Right = 8 + ClientHeight = 524 + ClientWidth = 691 + inherited ParamsPanel: TPanel + Height = 508 + Width = 428 + ClientHeight = 508 + ClientWidth = 428 + inherited CloseBtn: TButton + Left = 373 + Top = 483 TabOrder = 5 - Text = 'NCasesEdit' end - object RowOut: TBitBtn - AnchorSideLeft.Control = Panel1 - AnchorSideLeft.Side = asrCenter - AnchorSideTop.Control = RowIn + inherited ComputeBtn: TButton + Left = 289 + Top = 483 + TabOrder = 4 + end + inherited ResetBtn: TButton + Left = 227 + Top = 483 + TabOrder = 3 + end + inherited HelpBtn: TButton + Left = 168 + Top = 483 + TabOrder = 2 + end + inherited ButtonBevel: TBevel + Top = 467 + Width = 428 + end + object InputGrp: TRadioGroup[5] + AnchorSideLeft.Control = ParamsPanel + AnchorSideTop.Control = ParamsPanel + Left = 0 + Height = 114 + Top = 0 + Width = 425 + AutoFill = True + AutoSize = True + Caption = 'Input Options' + ChildSizing.LeftRightSpacing = 12 + ChildSizing.TopBottomSpacing = 6 + ChildSizing.VerticalSpacing = 2 + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsScaleChilds + ChildSizing.ShrinkVertical = crsScaleChilds + ChildSizing.Layout = cclLeftToRightThenTopToBottom + ChildSizing.ControlsPerLine = 1 + ClientHeight = 94 + ClientWidth = 421 + Items.Strings = ( + 'Count cases classified by row and column vectors in the data grid.' + 'Use frequencies recorded in the data grid for row and column variables.' + 'Use proportions recorded in the data grid for row and column variables.' + 'Enter frequencies on this form.' + ) + OnClick = InputGrpClick + TabOrder = 0 + end + object Notebook: TNotebook[6] + AnchorSideLeft.Control = ParamsPanel + AnchorSideTop.Control = InputGrp AnchorSideTop.Side = asrBottom - Left = 314 - Height = 28 - Top = 49 - Width = 28 - BorderSpacing.Top = 4 - Images = MainDataModule.ImageList - ImageIndex = 0 - OnClick = RowOutClick - Spacing = 0 + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = AlphaEdit + Left = 0 + Height = 322 + Top = 114 + Width = 428 + PageIndex = 0 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Bottom = 8 + TabOrder = 1 + object GridDataPage: TPage + object Label1: TLabel + AnchorSideLeft.Control = GridDataPage + AnchorSideTop.Control = GridDataPage + Left = 0 + Height = 15 + Top = 12 + Width = 97 + BorderSpacing.Top = 12 + Caption = 'Available Variables' + ParentColor = False + end + object RowLabel: TLabel + AnchorSideLeft.Control = RowEdit + AnchorSideBottom.Control = RowEdit + Left = 233 + Height = 15 + Top = 33 + Width = 67 + Anchors = [akLeft, akBottom] + BorderSpacing.Bottom = 2 + Caption = 'Row Variable' + ParentColor = False + end + object ColLabel: TLabel + AnchorSideLeft.Control = ColEdit + AnchorSideBottom.Control = ColEdit + Left = 233 + Height = 15 + Top = 113 + Width = 87 + Anchors = [akLeft, akBottom] + BorderSpacing.Bottom = 2 + Caption = 'Column Variable' + ParentColor = False + end + object DepLabel: TLabel + AnchorSideLeft.Control = DepEdit + AnchorSideBottom.Control = DepEdit + Left = 233 + Height = 15 + Top = 193 + Width = 99 + Anchors = [akLeft, akBottom] + BorderSpacing.Bottom = 2 + Caption = 'Variable to Analyze' + ParentColor = False + end + object NCasesLabel: TLabel + AnchorSideTop.Control = NCasesEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = NCasesEdit + Left = 263 + Height = 15 + Top = 257 + Width = 97 + Anchors = [akTop, akRight] + BorderSpacing.Right = 8 + Caption = 'Total No. of Cases:' + ParentColor = False + end + object VarList: TListBox + AnchorSideLeft.Control = GridDataPage + AnchorSideTop.Control = Label1 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = RowIn + AnchorSideBottom.Control = GridDataPage + AnchorSideBottom.Side = asrBottom + Left = 0 + Height = 293 + Top = 29 + Width = 195 + Anchors = [akTop, akLeft, akRight, akBottom] + BorderSpacing.Top = 2 + BorderSpacing.Right = 6 + ItemHeight = 0 + OnDblClick = VarListDblClick + OnSelectionChange = VarListSelectionChange + TabOrder = 0 + end + object RowIn: TBitBtn + AnchorSideLeft.Control = GridDataPage + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = VarList + Left = 201 + Height = 26 + Top = 29 + Width = 26 + Images = MainDataModule.ImageList + ImageIndex = 1 + OnClick = RowInClick + Spacing = 0 + TabOrder = 1 + end + object RowEdit: TEdit + AnchorSideLeft.Control = RowIn + AnchorSideLeft.Side = asrBottom + AnchorSideRight.Control = GridDataPage + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = RowOut + AnchorSideBottom.Side = asrBottom + Left = 233 + Height = 23 + Top = 50 + Width = 195 + Anchors = [akLeft, akRight, akBottom] + BorderSpacing.Left = 6 + BorderSpacing.Bottom = 12 + ReadOnly = True + TabOrder = 2 + Text = 'RowEdit' + end + object ColEdit: TEdit + AnchorSideLeft.Control = ColIn + AnchorSideLeft.Side = asrBottom + AnchorSideRight.Control = GridDataPage + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = ColOut + AnchorSideBottom.Side = asrBottom + Left = 233 + Height = 23 + Top = 130 + Width = 195 + Anchors = [akLeft, akRight, akBottom] + BorderSpacing.Left = 6 + BorderSpacing.Bottom = 12 + ReadOnly = True + TabOrder = 3 + Text = 'ColEdit' + end + object DepEdit: TEdit + AnchorSideLeft.Control = DepIn + AnchorSideLeft.Side = asrBottom + AnchorSideRight.Control = GridDataPage + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = DepOut + AnchorSideBottom.Side = asrBottom + Left = 233 + Height = 23 + Top = 210 + Width = 195 + Anchors = [akLeft, akRight, akBottom] + BorderSpacing.Left = 6 + BorderSpacing.Bottom = 12 + ReadOnly = True + TabOrder = 4 + Text = 'DepEdit' + end + object NCasesEdit: TEdit + AnchorSideTop.Control = DepOut + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = GridDataPage + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Side = asrBottom + Left = 368 + Height = 23 + Top = 253 + Width = 60 + Alignment = taRightJustify + Anchors = [akTop, akRight] + BorderSpacing.Top = 8 + TabOrder = 5 + Text = 'NCasesEdit' + end + object RowOut: TBitBtn + AnchorSideLeft.Control = GridDataPage + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = RowIn + AnchorSideTop.Side = asrBottom + Left = 201 + Height = 26 + Top = 59 + Width = 26 + BorderSpacing.Top = 4 + Images = MainDataModule.ImageList + ImageIndex = 0 + OnClick = RowOutClick + Spacing = 0 + TabOrder = 6 + end + object ColIn: TBitBtn + AnchorSideLeft.Control = GridDataPage + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = RowOut + AnchorSideTop.Side = asrBottom + Left = 201 + Height = 26 + Top = 109 + Width = 26 + BorderSpacing.Top = 24 + Images = MainDataModule.ImageList + ImageIndex = 1 + OnClick = ColInClick + Spacing = 0 + TabOrder = 7 + end + object ColOut: TBitBtn + AnchorSideLeft.Control = GridDataPage + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = ColIn + AnchorSideTop.Side = asrBottom + Left = 201 + Height = 26 + Top = 139 + Width = 26 + BorderSpacing.Top = 4 + Images = MainDataModule.ImageList + ImageIndex = 0 + OnClick = ColOutClick + Spacing = 0 + TabOrder = 8 + end + object DepIn: TBitBtn + AnchorSideLeft.Control = GridDataPage + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = ColOut + AnchorSideTop.Side = asrBottom + Left = 201 + Height = 26 + Top = 189 + Width = 26 + BorderSpacing.Top = 24 + Images = MainDataModule.ImageList + ImageIndex = 1 + OnClick = DepInClick + Spacing = 0 + TabOrder = 9 + end + object DepOut: TBitBtn + AnchorSideLeft.Control = GridDataPage + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = DepIn + AnchorSideTop.Side = asrBottom + Left = 201 + Height = 26 + Top = 219 + Width = 26 + BorderSpacing.Top = 4 + Images = MainDataModule.ImageList + ImageIndex = 0 + OnClick = DepOutClick + Spacing = 0 + TabOrder = 10 + end + end + object TableDataPage: TPage + object Panel2: TPanel + AnchorSideLeft.Control = TableDataPage + AnchorSideTop.Control = TableDataPage + Left = 16 + Height = 77 + Top = 24 + Width = 206 + Alignment = taRightJustify + AutoSize = True + BorderSpacing.Left = 16 + BorderSpacing.Top = 24 + BorderSpacing.Right = 8 + BevelOuter = bvNone + ChildSizing.HorizontalSpacing = 8 + ChildSizing.VerticalSpacing = 8 + ChildSizing.Layout = cclLeftToRightThenTopToBottom + ChildSizing.ControlsPerLine = 3 + ClientHeight = 77 + ClientWidth = 206 + TabOrder = 0 + object Label5: TLabel + Left = 0 + Height = 15 + Top = 0 + Width = 30 + Caption = ' ' + ParentColor = False + end + object Label6: TLabel + Left = 38 + Height = 15 + Top = 0 + Width = 80 + Alignment = taCenter + Caption = 'Row 1' + ParentColor = False + end + object Label7: TLabel + Left = 126 + Height = 15 + Top = 0 + Width = 80 + Alignment = taCenter + Caption = 'Row 2' + ParentColor = False + end + object Label8: TLabel + Left = 0 + Height = 23 + Top = 23 + Width = 30 + Caption = 'Col. 1' + Layout = tlCenter + ParentColor = False + end + object RC11Edit: TEdit + Left = 38 + Height = 23 + Top = 23 + Width = 80 + Alignment = taRightJustify + TabOrder = 0 + Text = 'RC11Edit' + end + object RC12Edit: TEdit + Left = 126 + Height = 23 + Top = 23 + Width = 80 + Alignment = taRightJustify + TabOrder = 1 + Text = 'RC12Edit' + end + object Label9: TLabel + Left = 0 + Height = 23 + Top = 54 + Width = 30 + Caption = 'Col. 2' + Layout = tlCenter + ParentColor = False + end + object RC21Edit: TEdit + Left = 38 + Height = 23 + Top = 54 + Width = 80 + Alignment = taRightJustify + TabOrder = 2 + Text = 'RC21Edit' + end + object RC22Edit: TEdit + Left = 126 + Height = 23 + Top = 54 + Width = 80 + Alignment = taRightJustify + TabOrder = 3 + Text = 'RC22Edit' + end + end + end + end + object AlphaEdit: TEdit[7] + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = ButtonBevel + Left = 368 + Height = 23 + Top = 444 + Width = 60 + Alignment = taRightJustify + Anchors = [akRight, akBottom] TabOrder = 6 + Text = 'AlphaEdit' end - object ColIn: TBitBtn - AnchorSideLeft.Control = Panel1 - AnchorSideLeft.Side = asrCenter - AnchorSideTop.Control = RowOut - AnchorSideTop.Side = asrBottom - Left = 314 - Height = 28 - Top = 101 - Width = 28 - BorderSpacing.Top = 24 - Images = MainDataModule.ImageList - ImageIndex = 1 - OnClick = ColInClick - Spacing = 0 - TabOrder = 7 - end - object ColOut: TBitBtn - AnchorSideLeft.Control = Panel1 - AnchorSideLeft.Side = asrCenter - AnchorSideTop.Control = ColIn - AnchorSideTop.Side = asrBottom - Left = 314 - Height = 28 - Top = 133 - Width = 28 - BorderSpacing.Top = 4 - Images = MainDataModule.ImageList - ImageIndex = 0 - OnClick = ColOutClick - Spacing = 0 - TabOrder = 8 - end - object DepIn: TBitBtn - AnchorSideLeft.Control = Panel1 - AnchorSideLeft.Side = asrCenter - AnchorSideTop.Control = ColOut - AnchorSideTop.Side = asrBottom - Left = 314 - Height = 28 - Top = 185 - Width = 28 - BorderSpacing.Top = 24 - Images = MainDataModule.ImageList - ImageIndex = 1 - OnClick = DepInClick - Spacing = 0 - TabOrder = 9 - end - object DepOut: TBitBtn - AnchorSideLeft.Control = Panel1 - AnchorSideLeft.Side = asrCenter - AnchorSideTop.Control = DepIn - AnchorSideTop.Side = asrBottom - Left = 314 - Height = 28 - Top = 217 - Width = 28 - BorderSpacing.Top = 4 - Images = MainDataModule.ImageList - ImageIndex = 0 - OnClick = DepOutClick - Spacing = 0 - TabOrder = 10 + object Label2: TLabel[8] + AnchorSideTop.Control = AlphaEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = AlphaEdit + Left = 210 + Height = 15 + Top = 448 + Width = 150 + Anchors = [akTop, akRight] + BorderSpacing.Right = 8 + Caption = 'Alpha level (Type I Error rate)' + ParentColor = False end end + inherited ParamsSplitter: TSplitter + Left = 440 + Height = 524 + end end diff --git a/applications/lazstats/source/forms/analysis/nonparametric/exactunit.pas b/applications/lazstats/source/forms/analysis/nonparametric/exactunit.pas index e576b47a1..db9afcdd7 100644 --- a/applications/lazstats/source/forms/analysis/nonparametric/exactunit.pas +++ b/applications/lazstats/source/forms/analysis/nonparametric/exactunit.pas @@ -5,20 +5,21 @@ unit ExactUnit; interface uses - Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, - ExtCtrls, StdCtrls, Buttons, MainUnit, OutPutUnit, FunctionsLib, - Globals, DataProcs, Math; + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, + ExtCtrls, StdCtrls, Buttons, + MainUnit, FunctionsLib, Globals, BasicStatsReportFormUnit; type { TFisherFrm } - TFisherFrm = class(TForm) - Bevel1: TBevel; + TFisherFrm = class(TBasicStatsReportForm) + AlphaEdit: TEdit; + Label2: TLabel; Label5: TLabel; - ResetBtn: TButton; - ComputeBtn: TButton; - CloseBtn: TButton; + Notebook: TNotebook; + GridDataPage: TPage; + TableDataPage: TPage; RC11Edit: TEdit; RC12Edit: TEdit; RC21Edit: TEdit; @@ -45,117 +46,53 @@ type ColLabel: TLabel; DepLabel: TLabel; VarList: TListBox; - Panel1: TPanel; procedure ColInClick(Sender: TObject); procedure ColOutClick(Sender: TObject); - procedure ComputeBtnClick(Sender: TObject); procedure DepInClick(Sender: TObject); procedure DepOutClick(Sender: TObject); - procedure FormActivate(Sender: TObject); - procedure FormCreate(Sender: TObject); - procedure FormShow(Sender: TObject); procedure InputGrpClick(Sender: TObject); - procedure RC11EditKeyPress(Sender: TObject; var Key: char); - procedure RC12EditKeyPress(Sender: TObject; var Key: char); - procedure RC21EditKeyPress(Sender: TObject; var Key: char); - procedure RC22EditKeyPress(Sender: TObject; var Key: char); - procedure ResetBtnClick(Sender: TObject); procedure RowInClick(Sender: TObject); procedure RowOutClick(Sender: TObject); + procedure VarListDblClick(Sender: TObject); + procedure VarListSelectionChange(Sender: TObject; {%H-}User: boolean); + private - { private declarations } - FAutoSized: Boolean; procedure PrintFisherTable(AList: TStrings; A, B, C, D: integer; P, SumP: double); - procedure UpdateBtnStates; + + protected + procedure AdjustConstraints; override; + procedure Compute; override; + procedure UpdateBtnStates; override; + function Validate(out AMsg: String; out AControl: TWinControl): boolean; override; + public - { public declarations } + procedure Reset; override; end; var FisherFrm: TFisherFrm; + implementation +{$R *.lfm} + +uses + Utils, GridProcs; + + { TFisherFrm } -procedure TFisherFrm.ResetBtnClick(Sender: TObject); -var - i: integer; +procedure TFisherFrm.AdjustConstraints; begin - VarList.Clear; - RowEdit.Text := ''; - ColEdit.Text := ''; - DepEdit.Text := ''; - DepEdit.Visible := false; - DepIn.Visible := false; - DepOut.Visible := false; - NCasesLabel.Visible := false; - DepLabel.Visible := false; - NCasesEdit.Text := ''; - NCasesEdit.Visible := false; - for i := 1 to NoVariables do - VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]); - Panel1.Visible := false; - Panel2.Visible := false; - RC11Edit.Text := ''; - RC12Edit.Text := ''; - RC21Edit.Text := ''; - RC22Edit.Text := ''; - UpdateBtnStates; + inherited; + ParamsPanel.Constraints.MinWidth := InputGrp.Width; + ParamsPanel.Constraints.MinHeight := InputGrp.Top + InputGrp.Height + + NCasesEdit.Top + NCasesEdit.Height + + Notebook.BorderSpacing.Bottom + AlphaEdit.Height + + ButtonBevel.Height + CloseBtn.BorderSpacing.Top + CloseBtn.Height; end; -procedure TFisherFrm.RowInClick(Sender: TObject); -var - index: integer; -begin - index := VarList.ItemIndex; - if (index > -1) and (RowEdit.Text = '') then - begin - RowEdit.Text := VarList.Items[index]; - VarList.Items.Delete(index); - end; - UpdateBtnStates; -end; - -procedure TFisherFrm.RowOutClick(Sender: TObject); -begin - if RowEdit.Text <> '' then - begin - VarList.Items.Add(RowEdit.Text); - RowEdit.Text := ''; - end; - UpdateBtnStates; -end; - -procedure TFisherFrm.FormActivate(Sender: TObject); -var - w: Integer; -begin - if FAutoSized then - exit; - - w := MaxValue([ResetBtn.Width, ComputeBtn.Width, CloseBtn.Width]); - ResetBtn.Constraints.MinWidth := w; - ComputeBtn.Constraints.MinWidth := w; - CloseBtn.Constraints.MinWidth := w; - - Constraints.MinWidth := Width; - Constraints.MinHeight := Height; - - FAutoSized := true; -end; - -procedure TFisherFrm.FormCreate(Sender: TObject); -begin - Assert(OS3MainFrm <> nil); - if OutputFrm = nil then - Application.CreateForm(TOutputFrm, OutputFrm); -end; - -procedure TFisherFrm.FormShow(Sender: TObject); -begin - ResetBtnClick(self); -end; procedure TFisherFrm.ColInClick(Sender: TObject); var @@ -170,6 +107,7 @@ begin UpdateBtnStates; end; + procedure TFisherFrm.ColOutClick(Sender: TObject); begin if ColEdit.Text <> '' then @@ -180,34 +118,26 @@ begin UpdateBtnStates; end; -procedure TFisherFrm.ComputeBtnClick(Sender: TObject); + +procedure TFisherFrm.Compute; var - i, j, row, col, caserow, casecol, A, B, C, D, Largest: integer; + i, j, row, col, caseRow, caseCol, A, B, C, D, largest: integer; N, APlusB, APlusC, BPlusD, CPlusD, NoSelected, dep: integer; FirstP, p, SumProb, Tocher, Alpha, X: double; obs: array[1..2, 1..2] of integer; ColNoSelected: IntDyneVec = nil; - done, ok: boolean; - response: string; + done: boolean; lReport: TStrings; begin Randomize; // initialize random number generator - row := 0; - col := 0; - dep := 0; // get column no.s of row and col variables if InputGrp.ItemIndex <> 3 then begin - for i := 1 to NoVariables do - begin - if RowEdit.Text = OS3MainFrm.DataGrid.Cells[i,0] then row := i; - if ColEdit.Text = OS3MainFrm.DataGrid.Cells[i,0] then col := i; - if InputGrp.ItemIndex = 2 then - begin - if DepEdit.Text = OS3MainFrm.DataGrid.Cells[i,0] then dep := i; - end; - end; + row := GetVariableIndex(OS3MainFrm.DataGrid, RowEdit.Text); + col := GetVariableIndex(OS3MainFrm.DataGrid, ColEdit.Text); + if InputGrp.ItemIndex = 2 then + dep := GetVariableIndex(OS3MainFrm.DataGrid, DepEdit.Text); end; SetLength(ColNoSelected, 3); @@ -219,83 +149,67 @@ begin NoSelected := 3; end else NoSelected := 2; + SetLength(ColNoSelected, noSelected); - //initialize observed matrix + // Initialize observed matrix for i := 1 to 2 do - for j := 1 to 2 do obs[i,j] := 0; + for j := 1 to 2 do obs[i, j] := 0; - if InputGrp.ItemIndex = 3 then // get freq. from form - begin - if (RC11Edit.Text = '') or not TryStrToInt(RC11Edit.Text, obs[1, 1]) then - begin - RC11Edit.SetFocus; - MessageDlg('No valid input.', mtError, [mbOK], 0); - exit; - end; - if (RC12Edit.Text = '') or not TryStrToInt(RC12Edit.Text, obs[1, 2]) then - begin - RC12Edit.SetFocus; - MessageDlg('No valid input', mtError, [mbOK], 0); - exit; - end; - if (RC21Edit.Text = '') or not TryStrToInt(RC21Edit.Text, obs[2, 1]) then - begin - RC21Edit.SetFocus; - MessageDlg('No valid input.', mtError, [mbOK], 0); - exit; - end; - if (RC22Edit.Text = '') or not TryStrToInt(RC22Edit.Text, obs[2, 2]) then - begin - RC22Edit.SetFocus; - MessageDlg('No valid input', mtError, [mbOK], 0); - exit; - end; - end; - - if InputGrp.ItemIndex = 0 then // count no. in row/col combinations + // Count no. in row/col combinations + if InputGrp.ItemIndex = 0 then begin for j := 1 to NoCases do begin - if (not GoodRecord(j,NoSelected,ColNoSelected)) then continue; - caserow := round(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[row,j]))); - casecol := round(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[col,j]))); - if (caserow > 2) or (caserow < 1) then + if (not GoodRecord(OS3MainFrm.DataGrid, j, ColNoSelected)) then continue; + caseRow := round(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[row, j]))); + caseCol := round(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[col, j]))); + if (caseRow > 2) or (caseRow < 1) then begin - MessageDlg('Row < 1 or > 2 found. Case ignored.', mtInformation, [mbOK], 0); + ErrorMsg('Row < 1 or > 2 found. Case ignored.'); continue; end; - if (casecol > 2) or (casecol < 1) then + if (caseCol > 2) or (caseCol < 1) then begin - MessageDlg('Column < 1 or > 2 found. Case ignored.', mtInformation, [mbOK], 0); + ErrorMsg('Column < 1 or > 2 found. Case ignored.'); continue; end; - obs[caserow, casecol] := obs[caserow, casecol] + 1; + obs[caseRow, caseCol] := obs[caseRow, caseCol] + 1; end; end; - if (InputGrp.ItemIndex = 1) or (InputGrp.ItemIndex = 2) then // Grid has frequencies for row/col + // Grid has frequencies for row/col + if (InputGrp.ItemIndex = 1) or (InputGrp.ItemIndex = 2) then begin for j := 1 to NoCases do begin - if (not GoodRecord(j,NoSelected,ColNoSelected)) then continue; - caserow := round(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[row,j]))); - casecol := round(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[col,j]))); - if (caserow > 2) or (caserow < 1) then + if (not GoodRecord(OS3MainFrm.DataGrid, j, ColNoSelected)) then continue; + caseRow := round(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[row, j]))); + caseCol := round(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[col, j]))); + if (caseRow > 2) or (caseRow < 1) then begin - MessageDlg('Row < 1 or > 2 found. Case ignored.', mtInformation, [mbOk], 0); + ErrorMsg('Row < 1 or > 2 found. Case ignored.'); continue; end; - if (casecol > 2) or (casecol < 1) then + if (caseCol > 2) or (caseCol < 1) then begin - MessageDlg('Column < 1 or > 2 found. Case ignored.', mtError, [mbOK], 0); + ErrorMsg('Column < 1 or > 2 found. Case ignored.'); continue; end; - obs[caserow, casecol] := round(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[dep,j]))); + obs[caseRow, caseCol] := round(StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[dep, j]))); if InputGrp.ItemIndex = 2 then - obs[caserow,casecol] := obs[caserow,casecol] * StrToInt(NCasesEdit.Text); + obs[caseRow, caseCol] := obs[caseRow, caseCol] * StrToInt(NCasesEdit.Text); end; end; + // Get freq. from form + if InputGrp.ItemIndex = 3 then + begin + obs[1, 1] := StrToInt(RC11Edit.Text); + obs[1, 2] := StrToInt(RC12Edit.Text); + obs[2, 1] := StrToInt(RC21Edit.Text); + obs[2, 2] := StrToInt(RC22Edit.Text); + end; + //Find smallest value A := obs[1, 1]; B := obs[1, 2]; @@ -306,11 +220,11 @@ begin BPlusD := B + D; APlusC := A + C; N := A + B + C + D; - Largest := 1; + largest := 1; if (B > A) then largest := 2; - if ((B > A) and (B > C) and (B > D)) then Largest := 2; - if ((C > A) and (C > B) and (C > D)) then Largest := 3; - if ((D > A) and (D > B) and (D > C)) then Largest := 4; + if ((B > A) and (B > C) and (B > D)) then largest := 2; + if ((C > A) and (C > B) and (C > D)) then largest := 3; + if ((D > A) and (D > B) and (D > C)) then largest := 4; // Ready for output lReport := TStringList.Create; @@ -328,7 +242,7 @@ begin done := false; while (not done) do begin - case Largest of + case largest of 1: begin// top row, first col if (A = APlusB) then done := true @@ -385,33 +299,28 @@ begin end; //Tocher's modification - repeat - response := FormatFloat('0.00', DEFAULT_ALPHA_LEVEL); - ok := InputQuery('Alpha', 'Enter your Alpha level (Type I Error rate): ', response); - if not ok then - exit; - if TryStrToFloat(response, Alpha) then - break - else - MessageDlg('Not a valid number.', mtError, [mbOk], 0); - until false; + alpha := StrToFloat(AlphaEdit.Text); - if ((SumProb - FirstP) > Alpha) then //Extreme values > alpha - accept null hypothesis + // Extreme values > alpha - accept null hypothesis + if ((sumProb - FirstP) > alpha) then lReport.Add('Null hypothesis accepted.') else - begin//Extreme values significant - is total probability significant? - if (SumProb >= Alpha) then //No, so apply Tocher's rule + begin + // Extreme values significant - is total probability significant? + if (sumProb >= Alpha) then //No, so apply Tocher's rule begin - Tocher := ( Alpha - (SumProb - FirstP)) / FirstP; - X := random(1000) / 1000.0; //Select a random value between 0 and num - 1 + Tocher := ( Alpha - (sumProb - FirstP)) / FirstP; + X := random(1000) / 1000.0; //Select a random value between 0 and num - 1 // wp: why not simply X := random() lReport.Add('Tocher ratio computed: %5.3f', [Tocher]); if (X < Tocher) then //Call it significant begin lReport.Add('A random value of %5.3f selected was less than the Tocher value.', [X]); + lReport.Add(''); lReport.Add('Conclusion: Reject the null Hypothesis'); end else begin //Call it non-significant lReport.Add('A random value of %5.3f selected was greater than the Tocher value.', [X]); + lReport.Add(''); lReport.Add('Conclusion: Accept the null Hypothesis'); end; end else @@ -420,14 +329,14 @@ begin end; // end if-else end; // end if-else - OutputFrm.Clear; - OutputFrm.AddLines(lReport); - OutputFrm.ShowModal; + FReportFrame.DisplayReport(lReport); + finally lReport.Free; end; end; + procedure TFisherFrm.DepInClick(Sender: TObject); var index: integer; @@ -441,6 +350,7 @@ begin UpdateBtnStates; end; + procedure TFisherFrm.DepOutClick(Sender: TObject); begin if DepEdit.Text <> '' then @@ -451,17 +361,20 @@ begin UpdateBtnStates; end; + procedure TFisherFrm.InputGrpClick(Sender: TObject); begin if InputGrp.ItemIndex = 3 then begin - Panel2.Visible := true; - Panel1.Visible := false; - RC11Edit.SetFocus; + Notebook.PageIndex := 1; +// Panel2.Visible := true; +// Panel1.Visible := false; + //RC11Edit.SetFocus; // -1) and (RowEdit.Text = '') then + begin + RowEdit.Text := VarList.Items[index]; + VarList.Items.Delete(index); + end; + UpdateBtnStates; +end; + + +procedure TFisherFrm.RowOutClick(Sender: TObject); +begin + if RowEdit.Text <> '' then + begin + VarList.Items.Add(RowEdit.Text); + RowEdit.Text := ''; + end; + UpdateBtnStates; +end; + + +function TFisherFrm.Validate(out AMsg: String; out AControl: TWinControl): boolean; +var + x: Double; + n: Integer; +begin + Result := false; + + if InputGrp.ItemIndex = 3 then + begin + if (RC11Edit.Text = '') or not TryStrToInt(RC11Edit.Text, n) then + begin + AControl := RC11Edit; + AMsg := 'No valid input.'; + exit; + end; + if (RC12Edit.Text = '') or not TryStrToInt(RC12Edit.Text, n) then + begin + AControl := RC12Edit; + AMsg := 'No valid input'; + exit; + end; + if (RC21Edit.Text = '') or not TryStrToInt(RC21Edit.Text, n) then + begin + AControl := RC21Edit; + AMsg := 'No valid input.'; + exit; + end; + if (RC22Edit.Text = '') or not TryStrToInt(RC22Edit.Text, n) then + begin + AControl := RC22Edit; + AMsg := 'No valid input'; + exit; + end; + end; + + if AlphaEdit.Text = '' then + begin + AMsg := 'Input required.'; + AControl := AlphaEdit; + exit; + end; + + if not TryStrToFloat(AlphaEdit.Text, x) or (x < 0) or (x > 1) then + begin + AMsg := 'Numerical value between 0 and 1 required.'; + AControl := AlphaEdit; + exit; + end; + + Result := true; +end; + + +procedure TFisherFrm.VarListDblClick(Sender: TObject); +var + index: Integer; + s: String; +begin + index := VarList.ItemIndex; + if index > -1 then + begin + s := VarList.Items[index]; + if RowEdit.Text = '' then + RowEdit.Text := s + else if ColEdit.Text = '' then + ColEdit.Text := s + else if (DepEdit.Text = '') and (InputGrp.ItemIndex in [1, 2]) then + DepEdit.Text := s; + VarList.Items.Delete(index); + UpdateBtnStates; + end; +end; + + +procedure TFisherFrm.VarListSelectionChange(Sender: TObject; User: boolean); +begin + UpdateBtnStates; +end; + + procedure TFisherFrm.UpdateBtnStates; begin + inherited; + RowIn.Enabled := VarList.ItemIndex > -1; ColIn.Enabled := VarList.ItemIndex > -1; DepIn.Enabled := VarList.ItemIndex > -1; @@ -535,8 +569,6 @@ begin DepOut.Enabled := DepEdit.Text <> ''; end; -initialization - {$I exactunit.lrs} end.