Содержание
Рассмотрим пример создания модели с переменными на атрибутах, использующей для расчета метод линейной регрессии (оценка МНК).
Для выполнения примера в репозитории предполагается наличие контейнера моделирования с идентификатором «MS» и базы данных временных рядов с идентификатором «TSDB». Данная база данных временных рядов должна содержать обязательные пользовательские атрибуты рядов, являющиеся ссылкой на справочник.
Добавьте ссылки на системные сборки: Cubes, Dimensions, Metabase, Ms, Stat.
Sub ModelAttr;
Var
Mb: IMetabase;
CrInf: IMetabaseObjectCreateInfo;
Model: IMsModel;
Transform: IMsFormulaTransform;
TransformVarables: IMsFormulaTransformVariables;
RubrDescr: IMetabaseObjectDescriptor;
Stub: IVariableStub;
TransVar: IMsFormulaTransformVariable;
Tree: IMsFormulaTransformSlicesTree;
Slice: IMsFormulaTransformSlice;
Selector: IMsFormulaTransformSelector;
Formula: IMsFormula;
Linear: IMsLinearRegressionTransform;
Ar: Array[0..1] Of Integer;
TermInfo: IMsFormulaTermInfo;
Period: IMsModelPeriod;
Begin
Mb := MetabaseClass.Active;
// Задаем базовые параметры модели как объекта репозитория
CrInf := Mb.CreateCreateInfo;
CrInf.ClassId := MetabaseObjectClass.KE_CLASS_MSMODEL;
// Задаем идентификатор модели
CrInf.Id := Mb.GenerateId("MODEL_LINEAR_REGRESSION", Mb.ItemById("MS").Key);
// Задаем наименование модели
CrInf.Name := "Модель линейной регрессии";
// Задаем контейнер моделирования, в котором будет создаваться модель
CrInf.Parent := Mb.ItemById("MS");
// Создаем модель
Model := Mb.CreateObject(CrInf).Edit As IMsModel;
// Получаем объект для настройки параметров модели
Transform := Model.Transform;
// Получаем объект для работы с моделируемой переменной
TransformVarables := Transform.Outputs;
// Получаем базу данных временных рядов (БДВР)
RubrDescr := Mb.ItemById("TSDB");
// Приводим полученную БДВР к абстрактному источнику данных
Stub := RubrDescr.Bind As IVariableStub;
// Используем БДВР в качестве источника данных моделируемой переменной
TransVar := TransformVarables.Add(Stub);
// Задаем срез моделируемой переменной
Tree := TransVar.SlicesTree(TransVar);
Slice := Tree.CreateSlice(1);
// Получаем настройки модели для среза моделируемой переменной
Selector := Transform.CreateSelector;
Selector.Slice := Slice;
Formula := Transform.Transform(Selector);
// Указываем метод расчета - Линейная регрессия (оценка МНК)
Formula.Kind := MsFormulaKind.LinearRegression;
// Задаем календарную динамику расчета
Formula.Level := DimCalendarLevel.Year;
// Получаем объект для настройки линейной регрессии
Linear := Formula.Method As IMsLinearRegressionTransform;
// Задаем порядок авторегрессии
Ar[0] := 2;
Ar[1] := 4;
Linear.ARMA.OrderAR := Ar;
// Используем автоматическую оценку константы
Linear.ConstantMode := InterceptMode.AutoEstimate;
// Добавляем в модель фактор, источником данных которого является БДВР
TransVar := Transform.Inputs.Add(Stub);
Tree := TransVar.SlicesTree(TransVar);
Slice := Tree.CreateSlice(2);
// Получаем фактор в виде элемента выражения
TermInfo := Transform.CreateTermInfo;
TermInfo.Slice := Slice;
// Задаем формулу расчета линейной регрессии
Linear.Explanatories.Add.Expression.AsString := TermInfo.TermInnerText;
// Задаем периоды расчета модели
Period := Transform.Period;
Period.IdentificationStartDate := DateTime.ComposeDay(2000, 1, 1);
Period.IdentificationEndDate := DateTime.ComposeDay(2014, 12, 31);
Period.ForecastStartDate := DateTime.ComposeDay(2015, 1, 1);
Period.ForecastEndDate := DateTime.ComposeDay(2020, 12, 31);
// Сохраняем модель в репозитории
(Model As IMetabaseObject).Save;
End Sub ModelAttr;
Imports Prognoz.Platform.Interop.Cubes;
Imports Prognoz.Platform.Interop.Dimensions;
Imports Prognoz.Platform.Interop.Ms;
Imports Prognoz.Platform.Interop.Stat;
…
Public Shared Sub Main(Params: StartParams);
Var
Mb: IMetabase;
CrInf: IMetabaseObjectCreateInfo;
Model: IMsModel;
Transform: IMsFormulaTransform;
TransformVarables: IMsFormulaTransformVariables;
RubrDescr: IMetabaseObjectDescriptor;
Stub: IVariableStub;
TransVar: IMsFormulaTransformVariable;
Tree: IMsFormulaTransformSlicesTree;
Slice: IMsFormulaTransformSlice;
Selector: IMsFormulaTransformSelector;
Formula: IMsFormula;
Linear: IMsLinearRegressionTransform;
Ar: Array[0..1] Of Integer;
TermInfo: IMsFormulaTermInfo;
Period: IMsModelPeriod;
Begin
Mb := Params.Metabase;
// Задаем базовые параметры модели как объекта репозитория
CrInf := Mb.CreateCreateInfo();
CrInf.ClassId := MetabaseObjectClass.KE_CLASS_MSMODEL As integer;
// Задаем идентификатор модели
CrInf.Id := Mb.GenerateId("MODEL_LINEAR_REGRESSION", Mb.ItemById["MS"].Key);
// Задаем наименование модели
CrInf.Name := "Модель линейной регрессии";
// Задаем контейнер моделирования, в котором будет создаваться модель
CrInf.Parent := Mb.ItemById["MS"];
// Создаем модель
Model := Mb.CreateObject(CrInf).Edit() As IMsModel;
// Получаем объект для настройки параметров модели
Transform := Model.Transform;
// Получаем объект для работы с моделируемой переменной
TransformVarables := Transform.Outputs;
// Получаем базу данных временных рядов (БДВР)
RubrDescr := Mb.ItemById["TSDB"];
// Приводим полученную БДВР к абстрактному источнику данных
Stub := RubrDescr.Bind() As IVariableStub;
// Используем БДВР в качестве источника данных моделируемой переменной
TransVar := TransformVarables.Add(Stub);
// Задаем срез моделируемой переменной
Tree := TransVar.SlicesTree[TransVar];
Slice := Tree.CreateSlice(1);
// Получаем настройки модели для среза моделируемой переменной
Selector := Transform.CreateSelector();
Selector.Slice := Slice;
Formula := Transform.Transform[Selector];
// Указываем метод расчета - Линейная регрессия (оценка МНК)
Formula.Kind := MsFormulaKind.mfkLinearRegression;
// Задаем календарную динамику расчета
Formula.Level := DimCalendarLevel.dclYear;
// Получаем объект для настройки линейной регрессии
Linear := Formula.Method As IMsLinearRegressionTransform;
// Задаем порядок авторегрессии
Ar[0] := 2;
Ar[1] := 4;
Linear.ARMA.OrderAR := Ar;
// Используем автоматическую оценку константы
Linear.ConstantMode := InterceptMode.imAutoEstimate;
// Добавляем в модель фактор, источником данных которого является БДВР
TransVar := Transform.Inputs.Add(Stub);
Tree := TransVar.SlicesTree[TransVar];
Slice := Tree.CreateSlice(2);
// Получаем фактор в виде элемента выражения
TermInfo := Transform.CreateTermInfo();
TermInfo.Slice := Slice;
// Задаем формулу расчета линейной регрессии
Linear.Explanatories.Add().Expression.AsString := TermInfo.TermInnerText;
// Задаем периоды расчета модели
Period := Transform.Period;
Period.IdentificationStartDate := DateTime.Parse("2000, 1, 1");
Period.IdentificationEndDate := DateTime.Parse("2014, 12, 31");
Period.ForecastStartDate := DateTime.Parse("2015, 1, 1");
Period.ForecastEndDate := DateTime.Parse("2020, 12, 31");
// Сохраняем модель в репозитории
(Model As IMetabaseObject).Save();
End Sub;
После выполнения примера в контейнере моделирования «MS» будет создана модель, использующая переменные на атрибутах. Для расчета модели используется метод линейной регрессии (оценка МНК) со следующими настройками:
в модели присутствует один фактор;
значение константы оценивается автоматически;
значения порядков авторегрессии: «2, 4»;
используется годовая динамика расчета;
период идентификации: начало - «2000», окончание - «2014»;
период прогнозирования: начало - «2015», окончание - «2020».
См. также: