CoefficientsNames: Array;
CoefficientsNames: System.Array;
Свойство CoefficientsNames возвращает наименования коэффициентов.
Для получения значений коэффициентов используйте свойство IMsDiagnosticTestResults.ModelCoefficients.
Для выполнения примера в репозитории предполагается наличие контейнера моделирования с идентификатором «MS», содержащего задачу моделирования с идентификатором «MODEL_RESETTEST_WEB». Задача должна быть создана из веб-приложения и содержать только модель линейной регрессии.
Добавьте ссылки на системные сборки: Metabase, Ms, Stat.
Sub DiagnosticTests;
Var
mb: IMetabase;
MSKey: Integer;
Problem: IMsProblem;
Meta: IMsMetaModel;
ChainEnts: IMsCalculationChainEntries;
ChainEl: IMsCalculationChainEntry;
pModel: IMsModel;
pTransform: IMsFormulaTransform;
pFormula: IMsFormula;
pRegress: IMsLinearRegressionTransform;
pTestList: IMsDiagnosticTestList;
Test: IMsDiagnosticTest;
VarTrans: IMsFormulaTransformVariable;
Settings: IMsDiagnosticTestSettings;
Calc: IMsMethodCalculation;
Coord: IMsFormulaTransformCoord;
Res: IMsDiagnosticTestResults;
Stat: ISpecificationTestStatistic;
i: Integer;
Coef: ICoefficients;
CoefNames: Array Of String;
Begin
mb := MetabaseClass.Active;
// Получаем задачу моделирования
MSKey := mb.GetObjectKeyById("MS");
Problem := mb.ItemByIdNamespace("MODEL_RESETTEST_WEB", MSKey).Bind As IMsProblem;
// Получаем внутреннюю метамодель
Meta := Problem.MetaModel;
// Получаем задачу линейной регрессии
ChainEnts := Meta.CalculationChain;
For i := 0 To ChainEnts.Count - 1 Do
ChainEl := ChainEnts.Item(i);
If ChainEl.Type = MsCalculationChainEntryType.Model Then
pModel := (ChainEl As IMsCalculationChainModel).Model;
End If;
End For;
// Получаем параметры расчёта модели
pTransform := pModel.Transform;
pFormula := pTransform.FormulaItem(0);
pRegress := pFormula.Method As IMsLinearRegressionTransform;
// Получаем набор диагностических тестов
pTestList := pRegress.DiagnosticTests;
// Находим RESET-тест Рамсея
Test := pTestList.FindByType(MsDiagnosticTestType.RamseyResset);
VarTrans := pTransform.Outputs.Item(0);
// Получаем настройки теста
Settings := Test.Settings;
// Задаем уровень значимости
Settings.ConfidenceLevel := 0.75;
// Проверяем, доступен ли расчет теста с помощью пакета R
If Settings.SupportsR
Then
Settings.UseR := True;
Debug.WriteLine("При расчете теста будет использоваться подключение R");
Else
Debug.WriteLine("Тест не поддерживает расчет с помощью R");
End If;
Debug.WriteLine("");
// Задаем периоды тестирования
Coord := pTransform.CreateCoord(VarTrans);
Calc := pModel.CreateCalculation As IMsMethodCalculation;
Calc.Period.IdentificationStartDate := pTransform.Period.IdentificationStartDate;
Calc.Period.IdentificationEndDate := pTransform.Period.IdentificationEndDate;
Calc.Period.ForecastStartDate := pTransform.Period.ForecastStartDate;
Calc.Period.ForecastEndDate := pTransform.Period.ForecastEndDate;
// Выполняем тестирование
Res := Test.Execute(Calc As IMsMethodCalculation, Coord);
// Выводим результаты
If Res.Error <> "" Then
Debug.WriteLine(Res.Error);
Else
Stat := Res.ChiTest;
Debug.WriteLine("-- Статистика Хи-квадрат --");
Debug.WriteLine(" Значение: " + Stat.Statistic.ToString);
Debug.WriteLine(" Вероятность: " + Stat.Probability.ToString);
If Res.FTestResult Then
Debug.WriteLine(" Гипотеза о приемлемости функциональной формы принимается");
Else
Debug.WriteLine(" Гипотеза о приемлемости функциональной формы отвергается");
End If;
Stat := Res.FTest;
Debug.WriteLine("-- Статистика Фишера --");
Debug.WriteLine(" Значение: " + Stat.Statistic.ToString);
Debug.WriteLine(" Вероятность: " + Stat.Probability.ToString);
If Res.ChiTestResult Then
Debug.WriteLine(" Гипотеза о приемлемости функциональной формы принимается");
Else
Debug.WriteLine(" Гипотеза о приемлемости функциональной формы отвергается");
End If;
CoefNames := Res.CoefficientsNames;
Debug.WriteLine("-- Значения коэффициентов модели --");
Coef := Res.ModelCoefficients.Coefficients;
For i := 0 To Coef.Estimate.Length - 1 Do
Debug.WriteLine(" Коэффициент " + CoefNames[i]);
Debug.WriteLine(" Значение: " + Coef.Estimate[i].ToString);
Debug.WriteLine(" Вероятность: " + Coef.Probability[i].ToString);
End For;
CoefNames := Res.CoefficientsARNames;
If CoefNames.Length <> 0 Then
Debug.WriteLine("-- Коэффициенты авторегрессии --");
Coef := Res.CoefficientsAR;
For i := 0 To CoefNames.Length - 1 Do
Debug.WriteLine(" Коэффициент " + CoefNames[i]);
Debug.WriteLine(" Значение: " + Coef.Estimate[i].ToString);
Debug.WriteLine(" Вероятность: " + Coef.Probability[i].ToString);
End For;
End If;
CoefNames := Res.CoefficientsMANames;
If CoefNames.Length <> 0 Then
Debug.WriteLine("-- Коэффициенты скользящего среднего --");
Coef := Res.CoefficientsMA;
For i := 0 To CoefNames.Length - 1 Do
Debug.WriteLine(" Коэффициент " + CoefNames[i]);
Debug.WriteLine(" Значение: " + Coef.Estimate[i].ToString);
Debug.WriteLine(" Вероятность: " + Coef.Probability[i].ToString);
End For;
End If;
End If;
End Sub DiagnosticTests;
Результат выполнения примера: для модели выполнен RESET-тест Рамсея, результаты выведены в окно консоли. Расчет будет выполнен с помощью пакета R.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.Ms;
Imports Prognoz.Platform.Interop.Stat;
…
Public Shared Sub Main(Params: StartParams);
Var
mb: IMetabase;
MSKey: uinteger;
Problem: IMsProblem;
Meta: IMsMetaModel;
ChainEnts: IMsCalculationChainEntries;
ChainEl: IMsCalculationChainEntry;
pModel: IMsModel;
pTransform: IMsFormulaTransform;
pFormula: IMsFormula;
pRegress: IMsLinearRegressionTransform;
pTestList: IMsDiagnosticTestList;
Test: IMsDiagnosticTest;
VarTrans: IMsFormulaTransformVariable;
Settings: IMsDiagnosticTestSettings;
Calc: IMsMethodCalculation;
Coord: IMsFormulaTransformCoord;
Res: IMsDiagnosticTestResults;
Stat: ISpecificationTestStatistic;
i: Integer;
Coef: ICoefficients;
CoefNames: System.Array;
Begin
mb := Params.Metabase;
// Получаем задачу моделирования
MSKey := mb.GetObjectKeyById("MS");
Problem := mb.ItemByIdNamespace["MODEL_RESETTEST_WEB", MSKey].Bind() As IMsProblem;
// Получаем внутреннюю метамодель
Meta := Problem.MetaModel;
// Получаем задачу линейной регрессии
ChainEnts := Meta.CalculationChain;
For i := 0 To ChainEnts.Count - 1 Do
ChainEl := ChainEnts.Item[i];
If ChainEl.Type = MsCalculationChainEntryType.mccetModel Then
pModel := (ChainEl As IMsCalculationChainModel).Model;
End If;
End For;
// Получаем параметры расчёта модели
pTransform := pModel.Transform;
pFormula := pTransform.FormulaItem[0];
pRegress := pFormula.Method As IMsLinearRegressionTransform;
// Получаем набор диагностических тестов
pTestList := pRegress.DiagnosticTests[Null, Null];
// Находим RESET-тест Рамсея
Test := pTestList.FindByType[MsDiagnosticTestType.mdttRamseyResset];
VarTrans := pTransform.Outputs.Item[0];
// Получаем настройки теста
Settings := Test.Settings;
// Задаем уровень значимости
Settings.ConfidenceLevel := 0.75;
// Проверяем, доступен ли расчет теста с помощью пакета R
If Settings.SupportsR
Then
Settings.UseR := True;
System.Diagnostics.Debug.WriteLine("При расчете теста будет использоваться подключение R");
Else
System.Diagnostics.Debug.WriteLine("Тест не поддерживает расчет с помощью R");
End If;
System.Diagnostics.Debug.WriteLine("");
// Задаем периоды тестирования
Coord := pTransform.CreateCoord(VarTrans);
Calc := pModel.CreateCalculation() As IMsMethodCalculation;
Calc.Period.IdentificationStartDate := pTransform.Period.IdentificationStartDate;
Calc.Period.IdentificationEndDate := pTransform.Period.IdentificationEndDate;
Calc.Period.ForecastStartDate := pTransform.Period.ForecastStartDate;
Calc.Period.ForecastEndDate := pTransform.Period.ForecastEndDate;
// Выполняем тестирование
Res := Test.Execute(Calc As IMsMethodCalculation, Coord);
// Выводим результаты
If Res.Error <> "" Then
System.Diagnostics.Debug.WriteLine(Res.Error);
Else
Stat := Res.ChiTest;
System.Diagnostics.Debug.WriteLine("-- Статистика Хи-квадрат --");
System.Diagnostics.Debug.WriteLine(" Значение: " + Stat.Statistic.ToString());
System.Diagnostics.Debug.WriteLine(" Вероятность: " + Stat.Probability.ToString());
If Res.FTestResult Then
System.Diagnostics.Debug.WriteLine(" Гипотеза о приемлемости функциональной формы принимается");
Else
System.Diagnostics.Debug.WriteLine(" Гипотеза о приемлемости функциональной формы отвергается");
End If;
Stat := Res.FTest;
System.Diagnostics.Debug.WriteLine("-- Статистика Фишера --");
System.Diagnostics.Debug.WriteLine(" Значение: " + Stat.Statistic.ToString());
System.Diagnostics.Debug.WriteLine(" Вероятность: " + Stat.Probability.ToString());
If Res.ChiTestResult Then
System.Diagnostics.Debug.WriteLine(" Гипотеза о приемлемости функциональной формы принимается");
Else
System.Diagnostics.Debug.WriteLine(" Гипотеза о приемлемости функциональной формы отвергается");
End If;
CoefNames := Res.CoefficientsNames;
System.Diagnostics.Debug.WriteLine("-- Значения коэффициентов модели --");
Coef := Res.ModelCoefficients.Coefficients;
For i := 0 To Coef.Estimate.Length - 1 Do
System.Diagnostics.Debug.WriteLine(" Коэффициент " + CoefNames[i]);
System.Diagnostics.Debug.WriteLine(" Значение: " + Coef.Estimate.GetValue(i).ToString());
System.Diagnostics.Debug.WriteLine(" Вероятность: " + Coef.Probability.GetValue(i).ToString());
End For;
CoefNames := Res.CoefficientsARNames;
If CoefNames.Length <> 0 Then
System.Diagnostics.Debug.WriteLine("-- Коэффициенты авторегрессии --");
Coef := Res.CoefficientsAR;
For i := 0 To CoefNames.Length - 1 Do
System.Diagnostics.Debug.WriteLine(" Коэффициент " + CoefNames[i]);
System.Diagnostics.Debug.WriteLine(" Значение: " + Coef.Estimate.GetValue(i).ToString());
System.Diagnostics.Debug.WriteLine(" Вероятность: " + Coef.Probability.GetValue(i).ToString());
End For;
End If;
CoefNames := Res.CoefficientsMANames;
If CoefNames.Length <> 0 Then
System.Diagnostics.Debug.WriteLine("-- Коэффициенты скользящего среднего --");
Coef := Res.CoefficientsMA;
For i := 0 To CoefNames.Length - 1 Do
System.Diagnostics.Debug.WriteLine(" Коэффициент " + CoefNames[i]);
System.Diagnostics.Debug.WriteLine(" Значение: " + Coef.Estimate.GetValue(i).ToString());
System.Diagnostics.Debug.WriteLine(" Вероятность: " + Coef.Probability.GetValue(i).ToString());
End For;
End If;
End If;
End Sub;
См. также: