-- Kept for reference only, not the recommended version - see -- "two baseline variants" above for why. Change Z-Score = VAR _CurrentChange = [Period Change] VAR _ChangesForContext = FILTER ( ADDCOLUMNS ( ALL ( <>[<>] ), "@Change", [Period Change] ), NOT ISBLANK ( [@Change] ) ) VAR _MeanChange = AVERAGEX ( _ChangesForContext, [@Change] ) VAR _StdDevChange = STDEVX.S ( _ChangesForContext, [@Change] ) RETURN ZScore ( _CurrentChange, _MeanChange, _StdDevChange ) Change Z-Score (LOO) = ZScore ( [Period Change], [Mean Period Change Excl Current], [StdDev Period Change Excl Current] ) Change Is Z-Score Outlier = VAR _Z = [Change Z-Score (LOO)] RETURN IF ( ISBLANK ( _Z ), BLANK (), ABS ( _Z ) > 3 ) Change Is IQR Outlier = VAR _CurrentChange = [Period Change] VAR _ChangesForContext = FILTER ( ADDCOLUMNS ( ALL ( <>[<>] ), "@Change", [Period Change] ), NOT ISBLANK ( [@Change] ) ) VAR _Q1 = PERCENTILEX.INC ( _ChangesForContext, [@Change], 0.25 ) VAR _Q3 = PERCENTILEX.INC ( _ChangesForContext, [@Change], 0.75 ) RETURN IsIQROutlier ( _CurrentChange, _Q1, _Q3 ) Change Modified Z-Score = VAR _CurrentChange = [Period Change] VAR _ChangesForContext = FILTER ( ADDCOLUMNS ( ALL ( <>[<>] ), "@Change", [Period Change] ), NOT ISBLANK ( [@Change] ) ) VAR _Median = MEDIANX ( _ChangesForContext, [@Change] ) VAR _AbsDevTable = ADDCOLUMNS ( _ChangesForContext, "@AbsDev", ABS ( [@Change] - _Median ) ) VAR _MAD = MEDIANX ( _AbsDevTable, [@AbsDev] ) RETURN ModifiedZScore ( _CurrentChange, _Median, _MAD ) Change Is Modified Z-Score Outlier = VAR _M = [Change Modified Z-Score] RETURN IF ( ISBLANK ( _M ), BLANK (), ABS ( _M ) > 3.5 ) -- Recomputes mean/stddev/N inline for this test, rather than -- referencing the standalone Mean/StdDev Period Change measures. Change Is Grubbs Outlier = VAR _CurrentChange = [Period Change] VAR _ChangesForContext = FILTER ( ADDCOLUMNS ( ALL ( <>[<>] ), "@Change", [Period Change] ), NOT ISBLANK ( [@Change] ) ) VAR _MeanChange = AVERAGEX ( _ChangesForContext, [@Change] ) VAR _StdDevChange = STDEVX.S ( _ChangesForContext, [@Change] ) VAR _N = COUNTROWS ( _ChangesForContext ) RETURN IsGrubbsOutlier ( _CurrentChange, _MeanChange, _StdDevChange, _N ) -- Same pattern: recomputes inline rather than referencing the -- standalone Mean/StdDev Period Change measures. Change Is Gaussian Outlier = VAR _CurrentChange = [Period Change] VAR _ChangesForContext = FILTER ( ADDCOLUMNS ( ALL ( <>[<>] ), "@Change", [Period Change] ), NOT ISBLANK ( [@Change] ) ) VAR _MeanChange = AVERAGEX ( _ChangesForContext, [@Change] ) VAR _StdDevChange = STDEVX.S ( _ChangesForContext, [@Change] ) RETURN IsGaussianOutlier ( _CurrentChange, _MeanChange, _StdDevChange )