Probabilities: Array;
Probabilities: System.Array;
The Probabilities property returns a series of forecast probabilities of logistic regression.
To determine threshold value of probability for classification, use the ISmLogisticRegression.Threshold property.
To execute the example, add a link to the Stat system assembly.
Sub UserLogisticR;
Var
binary: SmLogisticRegression;
e, s: Array[62] Of Double;
Coef: IModelCoefficients;
stat: ISummaryStatistics;
i, j, res: Integer;
ROCcurve: IROCcurve;
FilledDependent, ar, Probabilities, ProbFitted: Array Of Double;
OneMinusSpecificity, Sensitivity, CutOffPoints: Array Of Double;
str: String;
Begin
// Set data for analysis
// Values corresponding to social status
s[0] := Double.Nan; s[11] := 0; s[22] := 0; s[33] := Double.Nan; s[44] := 1; s[55] := Double.Nan;
s[1] := 1; s[12] := 1; s[23] := 1; s[34] := 0; s[45] := 1; s[56] := 1;
s[2] := Double.Nan; s[13] := 1; s[24] := 0; s[35] := 0; s[46] := 1; s[57] := 1;
s[3] := 0; s[14] := 0; s[25] := 0; s[36] := 1; s[47] := 0; s[58] := 1;
s[4] := 0; s[15] := 0; s[26] := 0; s[37] := 0; s[48] := 1; s[59] := 1;
s[5] := 1; s[16] := 0; s[27] := 0; s[38] := 0; s[49] := 0; s[60] := 0;
s[6] := 0; s[17] := 0; s[28] := 0; s[39] := 0; s[50] := 0; s[61] := 0;
s[7] := 1; s[18] := Double.Nan; s[29] := Double.Nan; s[40] := 0; s[51] := Double.Nan;
s[8] := 1; s[19] := 0; s[30] := 0; s[41] := 0; s[52] := 0;
s[9] := 1; s[20] := 1; s[31] := 0; s[42] := Double.Nan; s[53] := 0;
s[10] := 1; s[21] := 0; s[32] := 0; s[43] := 1; s[54] := 0;
// Values corresponding to age group
e[0] := 1; e[11] := 0; e[22] := 1; e[33] := 2; e[44] := 2; e[55] := 2;
e[1] := 1; e[12] := 1; e[23] := 2; e[34] := 1; e[45] := 0; e[56] := 0;
e[2] := 1; e[13] := 1; e[24] := 1; e[35] := 3; e[46] := 1; e[57] := 1;
e[3] := 0; e[14] := 1; e[25] := 0; e[36] := 1; e[47] := 1; e[58] := 0;
e[4] := 0; e[15] := 2; e[26] := 1; e[37] := 1; e[48] := 1; e[59] := 0;
e[5] := 1; e[16] := 1; e[27] := 0; e[38] := 2; e[49] := 0; e[60] := 2;
e[6] := 2; e[17] := 0; e[28] := 1; e[39] := 3; e[50] := 1; e[61] := 2;
e[7] := 0; e[18] := 1; e[29] := 3; e[40] := 1; e[51] := 0;
e[8] := 3; e[19] := 3; e[30] := 1; e[41] := 0; e[52] := 0;
e[9] := 1; e[20] := 4; e[31] := 1; e[42] := 4; e[53] := 2;
e[10] := 2; e[21] := 0; e[32] := 2; e[43] := 1; e[54] := 0;
// Create a method
binary := New SmLogisticRegression.Create;
// Set explained series
binary.Dependent.Value := s;
// Set classification attribute
binary.Explanatories.Add.Value := e;
// Set accuracy of solution
binary.Tolerance := 0.005;
// Set maximum number of iterations
binary.MaxIteration := 10000;
// Set ROC curve parameters
ROCcurve := binary.ROCcurve;
ROCcurve.ConfidenceLevel := 0.85;
// Execute calculation and display calculation results
res := binary.Execute;
If res <> 0 Then
Debug.WriteLine(binary.Errors);
Else
Debug.WriteLine("Number of iterations required for solution: ");
Debug.Indent;
Debug.WriteLine(binary.NumOfIter);
Debug.Unindent;
Debug.WriteLine("Before filling; after filling");
Debug.Indent;
FilledDependent := binary.FilledDependent.Value;
For i := 0 To s.Length - 1 Do
If s[i] = 0 Then
Debug.Write("Single ");
Elseif s[i] = 1 Then
Debug.Write("Married ");
Else
Debug.Write(" - ");
End If;
If FilledDependent[i] = 0 Then
Debug.WriteLine("Single");
Else
Debug.WriteLine("Married");
End If;
End For;
Debug.Unindent;
Debug.WriteLine("Estimated coefficient values:");
Debug.Indent;
Coef := binary.ModelCoefficients;
ar := Coef.Coefficients.Estimate;
For i := 0 To ar.Length - 1 Do
Debug.WriteLine(ar[i]);
End For;
Debug.Unindent;
Debug.WriteLine("Mean of log-likelihood function: ");
Debug.Indent;
Stat := binary.SummaryStatistics;
Debug.WriteLine(Stat.AvgLogL);
Debug.Unindent;
Debug.WriteLine("Probability series");
Debug.Indent;
Probabilities := binary.Probabilities;
For i := 0 To Probabilities.Length - 1 Do
Debug.WriteLine((i + 1).ToString + ". " + Probabilities[i].ToString);
End For;
Debug.Unindent;
Debug.WriteLine("Probability series for training objects");
Debug.Indent;
ProbFitted := binary.ProbFitted;
For i := 0 To ProbFitted.Length - 1 Do
Debug.WriteLine((i + 1).ToString + ". " + ProbFitted[i].ToString);
End For;
Debug.Unindent;
// Display ROC curve data
Debug.WriteLine("ROC curve data:");
Debug.Indent;
Debug.WriteLine("Specificity:");
Debug.Indent;
OneMinusSpecificity := ROCcurve.OneMinusSpecificity;
For i := 0 To OneMinusSpecificity.Length - 1 Do
Debug.WriteLine(OneMinusSpecificity[i]);
End For;
Debug.Unindent;
Debug.WriteLine("Sensitivity:");
Debug.Indent;
Sensitivity := ROCcurve.Sensitivity;
For i := 0 To Sensitivity.Length - 1 Do
Debug.WriteLine(Sensitivity[i]);
End For;
Debug.Unindent;
Debug.WriteLine("Area under curve: " + ROCcurve.Area.ToString);
Debug.WriteLine("Standard error: " + ROCcurve.StdError.ToString);
Debug.WriteLine("Asymptotic confidence interval:");
Debug.Indent;
Debug.WriteLine("Lower limit: " + ROCcurve.ConfidenceIntervalLower.ToString);
Debug.WriteLine("Upper limit: " + ROCcurve.ConfidenceIntervalUpper.ToString);
Debug.Unindent;
Debug.WriteLine("Cutoff threshold:");
Debug.Indent;
CutOffPoints := ROCcurve.CutOffPoints;
For i := 0 To CutOffPoints.Length - 1 Do
Debug.WriteLine(CutOffPoints[i]);
End For;
Debug.Unindent;
Debug.Unindent;
// Output summary results of classification
Debug.WriteLine("Summary results of classification:");
Debug.Indent;
str := "";
For i := 0 To binary.ClassificationSummary.GetUpperBound(1) Do
For j := 0 To binary.ClassificationSummary.GetUpperBound(2) Do
str := str + binary.ClassificationSummary[i, j].ToString + " ";
End For;
Debug.WriteLine(str);
str := "";
End For;
Debug.Unindent;
Debug.Unindent;
End If;
End Sub UserLogisticR;
After executing the example, logistic regression is set up and calculated, the console window displays calculation results.
The requirements and result of the Fore.NET example execution match with those in the Fore example.
Imports Prognoz.Platform.Interop.Stat;
…
Public Shared Sub Main(Params: StartParams);
Var
binary: SmLogisticRegression;
e, s: Array[62] Of Double;
Coef: IModelCoefficients;
stat: ISummaryStatistics;
i, j, res: Integer;
ROCcurve: IROCcurve;
FilledDependent, ar, Probabilities, ProbFitted: System.Array;
OneMinusSpecificity, Sensitivity, CutOffPoints: System.Array;
str: string;
Begin
// Set data for analysis
// Values corresponding to social status
s[0] := Double.Nan; s[11] := 0; s[22] := 0; s[33] := Double.Nan; s[44] := 1; s[55] := Double.Nan;
s[1] := 1; s[12] := 1; s[23] := 1; s[34] := 0; s[45] := 1; s[56] := 1;
s[2] := Double.Nan; s[13] := 1; s[24] := 0; s[35] := 0; s[46] := 1; s[57] := 1;
s[3] := 0; s[14] := 0; s[25] := 0; s[36] := 1; s[47] := 0; s[58] := 1;
s[4] := 0; s[15] := 0; s[26] := 0; s[37] := 0; s[48] := 1; s[59] := 1;
s[5] := 1; s[16] := 0; s[27] := 0; s[38] := 0; s[49] := 0; s[60] := 0;
s[6] := 0; s[17] := 0; s[28] := 0; s[39] := 0; s[50] := 0; s[61] := 0;
s[7] := 1; s[18] := Double.Nan; s[29] := Double.Nan; s[40] := 0; s[51] := Double.Nan;
s[8] := 1; s[19] := 0; s[30] := 0; s[41] := 0; s[52] := 0;
s[9] := 1; s[20] := 1; s[31] := 0; s[42] := Double.Nan; s[53] := 0;
s[10] := 1; s[21] := 0; s[32] := 0; s[43] := 1; s[54] := 0;
// Values corresponding to age group
e[0] := 1; e[11] := 0; e[22] := 1; e[33] := 2; e[44] := 2; e[55] := 2;
e[1] := 1; e[12] := 1; e[23] := 2; e[34] := 1; e[45] := 0; e[56] := 0;
e[2] := 1; e[13] := 1; e[24] := 1; e[35] := 3; e[46] := 1; e[57] := 1;
e[3] := 0; e[14] := 1; e[25] := 0; e[36] := 1; e[47] := 1; e[58] := 0;
e[4] := 0; e[15] := 2; e[26] := 1; e[37] := 1; e[48] := 1; e[59] := 0;
e[5] := 1; e[16] := 1; e[27] := 0; e[38] := 2; e[49] := 0; e[60] := 2;
e[6] := 2; e[17] := 0; e[28] := 1; e[39] := 3; e[50] := 1; e[61] := 2;
e[7] := 0; e[18] := 1; e[29] := 3; e[40] := 1; e[51] := 0;
e[8] := 3; e[19] := 3; e[30] := 1; e[41] := 0; e[52] := 0;
e[9] := 1; e[20] := 4; e[31] := 1; e[42] := 4; e[53] := 2;
e[10] := 2; e[21] := 0; e[32] := 2; e[43] := 1; e[54] := 0;
// Create a method
binary := New SmLogisticRegression.Create();
// Set explained series
binary.Dependent.Value := s;
// Set classification attribute
binary.Explanatories.Add().Value := e;
// Set accuracy of solution
binary.Tolerance := 0.005;
// Set maximum number of iterations
binary.MaxIteration := 10000;
// Set ROC curve parameters
ROCcurve := binary.ROCcurve;
ROCcurve.ConfidenceLevel := 0.85;
// Execute calculation and display calculation results
res := binary.Execute();
If res <> 0 Then
System.Diagnostics.Debug.WriteLine(binary.Errors);
Else
System.Diagnostics.Debug.WriteLine("Number of iterations required for solution: ");
System.Diagnostics.Debug.Indent();
System.Diagnostics.Debug.WriteLine(binary.NumOfIter);
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Before filling; after filling");
System.Diagnostics.Debug.Indent();
FilledDependent := binary.FilledDependent.Value;
For i := 0 To s.Length - 1 Do
If s[i] = 0 Then
System.Diagnostics.Debug.Write("Single ");
Elseif s[i] = 1 Then
System.Diagnostics.Debug.Write("Married ");
Else
System.Diagnostics.Debug.Write(" - ");
End If;
If FilledDependent[i] As double = 0 Then
System.Diagnostics.Debug.WriteLine("Single");
Else
System.Diagnostics.Debug.WriteLine("Married");
End If;
End For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Estimated coefficient values:");
System.Diagnostics.Debug.Indent();
Coef := binary.ModelCoefficients;
ar := Coef.Coefficients.Estimate;
For i := 0 To ar.Length - 1 Do
System.Diagnostics.Debug.WriteLine(ar[i]);
End For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Mean of log-likelihood function: ");
System.Diagnostics.Debug.Indent();
Stat := binary.SummaryStatistics;
System.Diagnostics.Debug.WriteLine(Stat.AvgLogL);
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Probability series");
System.Diagnostics.Debug.Indent();
Probabilities := binary.Probabilities;
For i := 0 To Probabilities.Length - 1 Do
System.Diagnostics.Debug.WriteLine((i + 1).ToString() + ". " + Probabilities[i].ToString());
End For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Probability series for training objects");
System.Diagnostics.Debug.Indent();
ProbFitted := binary.ProbFitted;
For i := 0 To ProbFitted.Length - 1 Do
System.Diagnostics.Debug.WriteLine((i + 1).ToString() + ". " + ProbFitted[i].ToString());
End For;
System.Diagnostics.Debug.Unindent();
// Display ROC curve data
System.Diagnostics.Debug.WriteLine("ROC curve data:");
System.Diagnostics.Debug.Indent();
System.Diagnostics.Debug.WriteLine("Specificity:");
System.Diagnostics.Debug.Indent();
OneMinusSpecificity := ROCcurve.OneMinusSpecificity;
For i := 0 To OneMinusSpecificity.Length - 1 Do
System.Diagnostics.Debug.WriteLine(OneMinusSpecificity[i]);
End For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Sensitivity:");
System.Diagnostics.Debug.Indent();
Sensitivity := ROCcurve.Sensitivity;
For i := 0 To Sensitivity.Length - 1 Do
System.Diagnostics.Debug.WriteLine(Sensitivity[i]);
End For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Area under curve: " + ROCcurve.Area.ToString());
System.Diagnostics.Debug.WriteLine("Standard error: " + ROCcurve.StdError.ToString());
System.Diagnostics.Debug.WriteLine("Asymptotic confidence interval:");
System.Diagnostics.Debug.Indent();
System.Diagnostics.Debug.WriteLine("Lower limit: " + ROCcurve.ConfidenceIntervalLower.ToString());
System.Diagnostics.Debug.WriteLine("Upper limit: " + ROCcurve.ConfidenceIntervalUpper.ToString();
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Cutoff threshold:");
System.Diagnostics.Debug.Indent();
CutOffPoints := ROCcurve.CutOffPoints;
For i := 0 To CutOffPoints.Length - 1 Do
System.Diagnostics.Debug.WriteLine(CutOffPoints[i]);
End For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.Unindent();
// Output summary results of classification
System.Diagnostics.Debug.WriteLine("Summary results of classification:");
System.Diagnostics.Debug.Indent();
str := "";
For i := 0 To binary.ClassificationSummary.GetUpperBound(0) Do
For j := 0 To binary.ClassificationSummary.GetUpperBound(1) Do
str := str + binary.ClassificationSummary.GetValue(i, j).ToString() + " ";
End For;
System.Diagnostics.Debug.WriteLine(str);
str := "";
End For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.Unindent();
End If;
End Sub;
See also: