Sending Custom Statistics to Statistica in VB.NET

The following example will open a new instance of Statistica, open the data set Adstudy.sta from your Examples directory, and then run custom VB.NET statistical functions.

Public Class StatsMgr

'a custom exception for any member function to throw if
'it can not calculate results for any reason

Public Class BadResults
Inherits
System.Exception
'note the ability to inherit base classes

Dim ErrMessage As String

End Class

'retrieves the sum of the specified variable of
'the specified spreadsheet

Function Sum(ByVal Spr As Statistica.Spreadsheet, _
ByVal
VarNo As Long) As Double

Dim i As Long
Dim
TotalVal As Double = 0

For i = 1 To Spr.NumberOfCases

'ignore missing data
If
Spr.SelectionCondition.Evaluate(i) And _
Not
(Spr.MissingData(i, VarNo)) Then

TotalVal = TotalVal + Spr.Value(i, VarNo)

End If

Next i

Sum = TotalVal

End Function

'retrieves the number of valid observations
Function
ValidObs(ByVal Spr As Statistica.Spreadsheet, _
ByVal
VarNo As Long) As Double

Dim TotalValid As Long = 0
Dim
i As Long

For i = 1 To Spr.NumberOfCases

'ignore missing data and make sure case selections allow its inclusion
If Not
(Spr.MissingData(i, VarNo)) And Spr.SelectionCondition.Evaluate(i) Then

TotalValid = TotalValid + 1

End If

Next i

ValidObs = TotalValid

End Function

'retrieves the variance of a variable
Function
Variance(ByVal Spr As Statistica.Spreadsheet, _
ByVal
VarNo As Long) As Double

Dim Total As Double
Dim
N As Long
Dim
Mean As Double
Dim
SumOfSquares As Double

SumOfSquares = 0
Total = Sum(Spr, VarNo)
N = ValidObs(Spr, VarNo)

'if there aren't any valid observations then thow an error
If
Total = 0 Or N < 2 Then

Throw New StatsMgr.BadResults()

End If

Mean = Total / N

Dim i As Long

For i = 1 To Spr.NumberOfCases

If Spr.SelectionCondition.Evaluate(i) And _
Not
(Spr.MissingData(i, VarNo)) Then

'calculate squares of differences
'iterate through each case, subtract the means from it, and then
'square it.  Add all of these up and you will have the sum of
squares.
SumOfSquares = SumOfSquares + ((Spr.Value(i, VarNo) - Mean) ^ 2)

End If

Next i

Variance = SumOfSquares / (N - 1)

End Function

End Class

 

Module VBNETCustomStatistics

Sub Main()

'this is the variable that will be analyzed in our dataset
Const
VARIABLE_TO_ANALYZE As Long = 3

'create a new instance of STATISTICA
Dim
StatApp As New Statistica.Application()

StatApp.Visible = True

'open a dataset
Dim
DataSet As Statistica.Spreadsheet

'also note that you can initialize variables when they
'are declared

Try

'note that you do not need to use "Set" in VB.NET
DataSet = StatApp.Spreadsheets.Open(StatApp.Path & _
"\Examples\Datasets\Adstudy.sta", True)

Catch ThisException As System.Runtime.InteropServices.COMException

System.Console.Write(ThisException.ToString())
End

End Try

'create a singleton class to calculate our own custom statistics
Dim
Statistican As New StatsMgr()

'spreadsheet to hold our custom statistics
Dim
Results As Statistica.Spreadsheet = StatApp.Spreadsheets.[New]("Descriptive Stats from VB.NET")

Results.SetSize(VARIABLE_TO_ANALYZE, 1)
Results.CaseNameWidth = 1
Results.VariableName(1) = "Results"
Results.Variable(1).AutoFit()
Results.Header.Value = "Results for " & DataSet.Name & ", Variable " & VARIABLE_TO_ANALYZE.ToString
'the Sum case

Results.CaseName(1) = "SUM"
Results.Case(1).Value = Statistican.Sum(DataSet, VARIABLE_TO_ANALYZE)
'the Valid number of observations case

Results.CaseName(2) = "VALID N"
Results.Case(2).Value = Statistican.ValidObs(DataSet, VARIABLE_TO_ANALYZE)

'the Variance case
Results.CaseName(3) = "VARIANCE"

'our variance function my throw an exception if there are not enough
'valid observations in the given variable

Try

Results.Case(3).Value = Statistican.Variance(DataSet, VARIABLE_TO_ANALYZE)

Catch ThisException As StatsMgr.BadResults

Results.Case(3).Value = "----"

End Try

Results.Visible = True

'clean up
StatApp = Nothing
Statistican = Nothing

End Sub

End Module