View Raw SPL
/*****************************************************************************
* *
* MOVVARIANCE.SPL Copyright (C) 2022 DSP Development Corporation *
* All Rights Reserved *
* *
* Author: Randy Race *
* *
* Synopsis: Calculates the moving variance *
* *
* Revisions: 9 Nov 2022 RRR Creation *
* *
*****************************************************************************/
#if @HELP_MOVVARIANCE
MOVVARIANCE
Purpose: Calculates the "moving" variance of a series.
Syntax: MOVVARIANCE(series, n, rampflag, dof)
series - A series, the input.
n - An integer, the block size.
rampflag - An integer, endpoint handling.
0: do not ramp up/down endpoints
1: ramp up/down endpoints (default)
dof - Optional. An integer, degrees of freedom
normalization.
0: Normalize by 1 / (N - 1) (default)
1: Normalize by 1 / N
Returns: A series or table.
Example:
W1: {1, 2, 4, 7}
W2: movvariance(w1, 3)
returns the series {0, 0.5, 2.333, 6.333, 4.5, 0}
Example:
W1: {1, 2, 4, 7}
W3: movvariance(w1, length(w1))
W3[length(w1)] == var(w1) == 7.0
Remarks:
For speed, this routines uses the builtin function MOVSTDEV.
See Also:
Movavg
Movstd
Std
Var
#endif
/* moving variance */
ITERATE movvariance(s, n, rampflag = 1, dof = 0, flag1 = "", flag2 = "", flag3 = "")
{
local mvar;
/* hurdles */
if (argc < 2)
{
error(sprintf("%s - series and block size required", __FUNC__));
}
if (isstring(rampflag))
{
flag3 = flag2;
flag2 = flag1;
flag1 = rampflag;
rampflag = 1;
}
if (isstring(dof))
{
flag3 = flag2;
flag2 = flag1;
flag1 = dof;
dof = 0;
}
/* use faster, more accurate built-in */
mvar = movstdev(s, n, rampflag, dof, flag1, flag2, flag3, "variance");
return(mvar);
}