Macro (SVB) Programs Example - Writing a Custom Statistica Application with User-Defined Dialog Boxes
This example illustrates how a custom Statistical procedure can be developed by combining the power and flexibility of Statistica's Statistical analysis routines with custom-defined dialog boxes and dialog box procedures.
' This program will use the Basic Statistics Breakdown options to ' find the dependent variables in a list of dependent variables ' that are significantly related to a set of categorical predictors; ' the program also computes the overall R-Square values for those ' variables. ' The following statement makes all arrays by default 1-referenced; ' thus, the declaration "Dim x(1 to 10) as Double" is the same ' by default as "Dim x(10) as Double" Option Base 1 Public Msg As String ' Total number of variables Public Nvars As Long ' Number of dependent variables Public NSignificantDVs As Integer ' Number of related DV's Dim RSquares () As Double ' Dv, Rsquare, and p-value Dim Vars () As Integer Dim VarNames () As String Public AlphaValue As Double ' p-value (significance) criterion Public ndep As Integer ' Number of independent variables Public nindep As Long ' Number of significantly related DV's Public DependentVariableList() As Long Public IndependentVariableList () As Long Dim ResWB As Workbook Dim folder As WorkbookItem Sub Main ' Error handling: Detect when there is no input Spreadsheet On Error GoTo NoInputSpreadsheet ' Number of variables in active (input) Spreadsheet Nvars = ActiveDataSet.NumberOfVariables ' Install default erorr handling On Error GoTo Finish ' Dimension variable lists, to be used for variable ' selection dialog ReDim DependentVariableList(1 To Nvars) ReDim IndependentVariableList (1 To Nvars) As Long Dim i As Integer ' Display dialog for variable selection, etc. If Not InputDialog Then GoTo Finish ' Set up RSquares array, as a 2-dimensional array ReDim RSquares (1 To ndep, 1 To 2) ReDim Vars (1 To ndep) As Integer ReDim VarNames (1 To ndep) As String ' Find significantly predicted DV's If Not FindSignificantlyPredictedDVs Then MsgBox "None of the DV's are related to predictors." GoTo Finish End If ' Make new workbook, for display of results Set ResWB = Workbooks.New ResWB.Visible = True ' Display main results If Not MakeSummarySpreadsheet Then GoTo Finish If MsgBox ( _ "Do you want to perform detailed analyses for these DV's?", vbOkCancel, _ "Detailed Analyses?") = vbCancel Then GoTo Finish 'Compute detailed results, if requested If Not ComputeDetailedStatistics Then GoTo Finish Finish: Exit Sub NoInputSpreadsheet: MsgBox "Open a data file (Spreadsheet) for this analysis", _ vbCritical Exit Sub End Sub ' This function displays and services the specifications dialog Function InputDialog As Boolean On Error GoTo Finish InputDialog=False Begin Dialog UserDialog 390,147, _ "Search for significant DV's", .UI ' %GRID:10,7,1,1 PushButton 20,14,120,21,"Variables", .VariableSelection Text 40,42,70,14,"Grouping:", .Text1 Text 110,42,180,14,"none", .Text2 Text 30,56,80,14,"Dependent:", .Text3 Text 110,56,180,14,"none", .Text4 Text 30,84,50,14,"Alpha:", .Text6 TextBox 80,77,90,21, .AlphaValue Text 20,112,360,28, _ "Find all DV's related to the predictors with p<alpha.", .Text5 OKButton 310,14,70,21,.OkButton CancelButton 310,42,70,21,.CancelButton End Dialog Dim dlg As UserDialog ' Initialize the AlphaValue field dlg.AlphaValue=".05" TryAgain: On Error GoTo Finish Dialog dlg On Error GoTo BadAlphaValue AlphaValue = CDbl(dlg.AlphaValue) InputDialog=True Finish: Exit Function BadAlphaValue: MsgBox "Bad alpha value; please specify a valid alpha value." GoTo TryAgain End Function ' Dialog function; services the dialog Private Function UI(DlgItem$, Action%, SuppValue&) As Boolean Dim ok As Boolean Select Case Action% Case 1 ' Dialog box initialization Case 2 ' Value changing or button pressed UI = True Select Case DlgItem Case "CancelButton" UI=False Case "OkButton" ok=False If ndep<2 Or nindep<1 Then ok=True GoTo DoVariables End If UI=False ' Variable selection dialog Case "VariableSelection" ok=False DoVariables: ret = SelectVariables2 (ActiveDataSet, _ "Variables for Analysis", _ 2, Nvars, DependentVariableList, ndep, _ "Dependent variables:", _ 1, 6, IndependentVariableList, nindep, _ "Independent (grouping) variables: ") If ndep>0 Then DlgText "Text4", "Selected" Else DlgText "Text4", "none" End If If nindep>0 Then DlgText "Text2", "Selected" Else DlgText "Text2", "none" End If End Select End Select End Function ' This function sets up the Spreadsheet with a user-defined ' number of rows and columns Function SetSpreadsheetNumberOfRowsAndColumns( _ ii As Integer, _ jj As Integer, _ Final As Spreadsheet) As Boolean On Error GoTo Finish Dim nr As Integer Dim nc As Integer SetSpreadsheetNumberOfRowsAndColumns=True If (Final.NumberOfCases<ii) Then Final.AddCases(Final.NumberOfCases, _ ii-Final.NumberOfCases) Else Final.DeleteCases(ii+1, Final.NumberOfCases) End If If (Final.NumberOfVariables<jj) Then Final.AddVariables("Var",Final.NumberOfVariables, _ jj-Final.NumberOfVariables) Else Final.DeleteVariables(jj+1, Final.NumberOfVariables) End If Finish: End Function ' This function finds the dependent variables that ' are significantly related to the set of categorical ' predictor variables Function FindSignificantlyPredictedDVs As Boolean On Error GoTo Finish Dim i As Integer Dim j As Integer Dim k As Integer Dim ncolumns As Integer Dim x8,SSTotal,SSresidual As Double NSignificantDVs=0 FindSignificantlyPredictedDVs=False For i=1 To ndep Vars (i)=DependentVariableList(i) For j=1 To 2 RSquares(i,j)=0 Next j Next i ReDim IDVars(1 To nindep) As Integer For i=1 To nindep IDVars(i) = IndependentVariableList(i) Next i Set newanalysis = Analysis (scBasicStatistics) With newanalysis.Dialog .Statistics = scBasBreakdowns End With newanalysis.Run 'Format the variable list into a string Dim VarString As String 'get the DVs For i = 1 To UBound(Vars) VarString = VarString + Str(Vars(i)) Next i 'get the IVs VarString = VarString + "|" For i = 1 To UBound(IDVars) VarString = VarString + Str(IDVars(i)) Next i With newanalysis.Dialog .Variables = VarString .Codes = "" End With newanalysis.Run Set AnovaSpreadsheet=newanalysis.Dialog.AnalysisOfVariance ncolumns=AnovaSpreadsheet.Item(1).NumberOfVariables k=0 For i=1 To ndep x8=AnovaSpreadsheet.Item(1).value(i,ncolumns) If x8<=AlphaValue Then k=k+1 VarNames(k)=ActiveDataSet.VariableName(Vars(i)) Vars(k)=DependentVariableList(i) RSquares(k,2)=x8 ' Compute R-Square SSTotal=AnovaSpreadsheet.Item(1).value(i,1)+ _ AnovaSpreadsheet.Item(1).value(i,4) SSresidual=AnovaSpreadsheet.Item(1).value(i,4) If (SSTotal>0) Then RSquares(k,1)=1-SSresidual/SSTotal End If End If Next i NSignificantDVs=k FindSignificantlyPredictedDVs =(NSignificantDVs>0) Finish: End Function ' This function generates the summary results Spreadsheet Function MakeSummarySpreadsheet As Boolean Dim Final As Spreadsheet MakeSummarySpreadsheet=False Set Final = Application.Spreadsheets.New Final.InputSpreadsheet=False If (Not SetSpreadsheetNumberOfRowsAndColumns( _ NSignificantDVs,2,Final)) _ Then GoTo Finish Final.VariableName(1) = "R-square" Final.VariableFormatString(1)="#.#####" Final.VariableName(2) = "p-value" Final.VariableFormatString(2)="#.#####" Final.CaseNameLength=20 Final.CaseNameWidth=1.5 For i=1 To NSignificantDVs Final.value(i,1)=RSquares(i,1) Final.value(i,2)=RSquares(i,2) Final.CaseName(i)=VarNames(i) Next i Set folder = ResWB.InsertFolder(ResWB.Root,) folder.Name = "Summary R-square" Dim si As WorkbookItem Set si = ResWB.InsertObject(Final, folder, scWorkbookLastChild) MakeSummarySpreadsheet = True Finish: End Function ' This function computes detailed statistics for a selected ' set of variables; it is based on a macro recording from ' Basic Statistics Function ComputeDetailedStatistics As Boolean Dim Indeps() As Integer Dim Deps() As Integer Dim Tempo As String Dim i As Integer Dim j As Integer On Error GoTo Finish ComputeDetailedStatistics=False Set newanalysis = Analysis (scBasicStatistics) With newanalysis.Dialog .Statistics = scBasBreakdowns End With newanalysis.Run ReDim Indeps (1 To nindep) As Integer For i=1 To nindep j=IndependentVariableList(i) Indeps(i)=j Next i ReDim Deps (1 To ndep) As Integer Tempo="" For i=1 To ndep j=DependentVariableList(i) Tempo=Tempo+Str(j)+" " Deps(i)=j Next i 'Format the variable list into a string Dim VarString As String 'get the DVs For i = 1 To UBound(Deps) VarString = VarString + Str(Deps(i)) Next i 'get the IVs VarString = VarString + "|" For i = 1 To UBound(Indeps) VarString = VarString + Str(Indeps(i)) Next i With newanalysis.Dialog .Variables = VarString .Codes = "" End With newanalysis.Run newanalysis.Dialog.ResultsVariables = Tempo If (nindep>=2) Then newanalysis.Dialog.ResultsSelection = "1 | 2 " End If Set sg=newanalysis.Dialog.CategorizedMeansInteractionPlots Set folder = ResWB.InsertFolder(ResWB.Root,) folder.Name = "Plot of interactions" Dim si As WorkbookItem For i=1 To sg.Count Set si = ResWB.InsertObject(sg.Item(i), _ folder, scWorkbookLastChild) Next i With newanalysis.Dialog .DependentVariablesForPostHocTests = Deps End With Set s=newanalysis.Dialog.ScheffeTest Set folder = ResWB.InsertFolder(ResWB.Root,) folder.Name = "Scheffe post-hoc tests" For i=1 To ndep Set si = ResWB.InsertObject(s.Item(i), folder, _ scWorkbookLastChild) Next i ComputeDetailedStatistics=True Finish: End Function
If you run this program using the example data file Exp.sta and request detailed analyses, then various plots and summary spreadsheets will be computed and displayed in a workbook.
Note: further customization of programs, in fact of the entire Statistica system, can be achieved by controlling events related to the results spreadsheets and graphs (see
Controlling Statistica Events with SVB Programs). For example, you could further "beautify" the program by launching additional analyses when the user clicks on particular cells in the initial results spreadsheet, etc.
Copyright © 2021. Cloud Software Group, Inc. All Rights Reserved.