使用线性回归排除 MDX 预测的成员

Exclude a member for MDX forecasting using linear regression

我想使用完整 前几个月的数据预测下个月的度量值。

例如现在 9 月 11 日,我必须根据 1 月至 8 月的值预测 9 月的值(因为 9 月尚未结束)。

我正在使用 MDX 函数 LinRegPoint,其层次结构详述如下

  • DimTime
    • Hierarchy Time
      • Year
      • Quarter
      • Month

这是我一直在尝试但没有成功的查询:

WITH 
  MEMBER [Measures].[Trend] AS 
    LinRegPoint
    (
      Rank
      (
        [Time].[Hierarchy Time].CurrentMember
       ,[Time].[Hierarchy Time].CurrentMember.Level.MEMBERS
      )
     ,Descendants
      (
        [Time].[Hierarchy Time].[2015]
       ,[Time].[Hierarchy Time].CurrentMember.Level
      )
     ,[Measures].[Quality]
     ,Rank
      (
        [Time].[Hierarchy Time]
       ,[Time].[Hierarchy Time].Level.MEMBERS
      )
    ) 
SELECT 
  {
    [Measures].[Quality]
   ,[Measures].[Trend]
  } ON COLUMNS
 ,Descendants
  (
    [Time].[Hierarchy Time].[2015]
   ,[Time].[Hierarchy Time].[Month]
  ) ON ROWS
FROM [Cube];

上面的查询 return 到今天为止的所有月份预测值,包括 9 月,但是它预测 9 月的值采用当前日期 1 月到 9 月的实际值。我需要 LinRegPoint 函数只需要前一个完整的月份,在本例中为 1 月到 8 月。

请注意查询 return 是 9 个月(9 月)的预测值,但它使用实际值来计算它。如下图所示,这会导致被误解的行。

此图显示绘制的线采用了前一个完整月份 (1-8):

注意正斜率线。

此图显示了绘制的所有月份 (1-9)

注意负斜率线。

问题: 如何从实际值中排除不完整的当前月份,但允许计算预测值。

编辑: 该集应该更改为在实际值中排除最后一个月的成员,但计算它的预测值。

感谢您考虑我的问题。

解决方案:

WITH MEMBER [Measures].[Trend] AS 
  LinRegPoint
  (
    Rank(
        [Time].[Hierarchy Time].CurrentMember
       ,[Time].[Hierarchy Time].CurrentMember.Level.MEMBERS
        )
    ,Descendants
    (
        [Time].[Hierarchy Time].[2015]
       ,[Time].[Hierarchy Time].CurrentMember.Level
    )
    ,[Measures].[QltyNoCurrentVal]
    ,Rank(
        [Time].[Hierarchy Time]
       ,[Time].[Hierarchy Time].Level.MEMBERS)
    ),FORMAT_STRING='Standard' //Formating
MEMBER [Measures].[QltyNoCurrentVal] AS 
    IIF(
        [Time].[Hierarchy Time].CurrentMember is [Time].[Hierarchy Time].[2015].[3].[9]
       , NULL
       , [Measures].[Quality]
    ),FORMAT_STRING='Standard' //Formating
select {
    [Measures].[QltyNoCurrentVal]
   ,[Measures].[Trend]} ON COLUMNS
   ,Descendants(
        [Time].[Hierarchy Time].[2015]
       ,[Time].[Hierarchy Time].[Month]
   ) ON ROWS
FROM [Cube]

有点困惑您的表达式中的哪些集需要更改。

我创建了一个集合 [MthsExclSept],您应该可以在脚本的其余部分的任何地方使用它 - 我只是在两个地方使用了它:

WITH 
  SET [MthsExclSept] AS 
    SubSet
    (
      Descendants
      (
        [Time].[Hierarchy Time].[2015]
       ,[Time].[Hierarchy Time].[Month]  //<<better to specify the month level
      )
     ,0
     ,
        Descendants
        (
          [Time].[Hierarchy Time].[2015]
         ,[Time].[Hierarchy Time].[Month]  //<<better to specify the month level
        ).Count
      - 1
    ) 
  MEMBER [Measures].[Trend] AS 
    LinRegPoint
    (
      Rank
      (
        [Time].[Hierarchy Time].CurrentMember
       ,[MthsExclSept] //<<also added here?
      )
     ,[MthsExclSept]
     ,[Measures].[Quality]
     ,Rank
      (
        [Time].[Hierarchy Time]
       ,[MthsExclSept] //<<also added here?
      )
    ) 
  MEMBER [Measures].[QualityNEW] AS 
    IIF(
        [Time].[Hierarchy Time].CurrentMember is [Time].[Hierarchy Time].[September]
       , NULL
       , [Measures].[Quality]
    )
SELECT 
  {
    [Measures].[QualityNEW]
   ,[Measures].[Trend]
  } ON COLUMNS
 ,[MthsExclSept] ON ROWS
FROM [Cube];

集合 [MthsExclSept] 刚刚削减了上个月。这是来自 AdvWrks 的证明,它从一年中删除了 12 月:

WITH 
  SET [MthsExclSept] AS 
    SubSet
    (
      Descendants
      (
        [Date].[Calendar].[Calendar Year].&[2009]
       ,[Date].[Calendar].[Month]
      )
     ,0
     ,
        Descendants
        (
          [Date].[Calendar].[Calendar Year].&[2009]
         ,[Date].[Calendar].[Month]
        ).Count
      - 1
    ) 
SELECT 
  {} ON 0
 ,[MthsExclSept] ON 1
FROM [Adventure Works];

它returns以下内容: