如何测量R中时间序列的平滑度?

机器算法验证 r 时间序列
2022-01-24 23:07:59

有没有一种好方法可以测量 R 中时间序列的平滑度?例如,

-1, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1.0

比光滑得多

-1, 0.8, -0.6, 0.4, -0.2, 0, 0.2, -0.4, 0.6, -0.8, 1.0

尽管它们具有相同的均值和标准差。如果有一个函数可以在时间序列上给我一个平滑的分数,那就太酷了。

4个回答

差异的标准偏差将为您提供粗略的平滑度估计:

x <- c(-1, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1.0)
y <- c(-1, 0.8, -0.6, 0.4, -0.2, 0, 0.2, -0.4, 0.6, -0.8, 1.0)
sd(diff(x))
sd(diff(y))

更新:正如 Cyan 指出的那样,这为您提供了一个与规模相关的衡量标准。类似的与尺度无关的测量将使用变异系数而不是标准偏差:

sd(diff(x))/abs(mean(diff(x)))
sd(diff(y))/abs(mean(diff(y)))

在这两种情况下,较小的值对应于更平滑的系列。

滞后自相关将作为一个分数,并且也有一个相当简单的统计解释。

cor(x[-length(x)],x[-1])

分数解读:

  • 接近 1 的分数意味着一个平滑变化的系列
  • 接近 0 的分数意味着数据点与下一个数据点之间没有整体线性关系(即 plot(x[-length(x)],x[-1]) 不会给出具有任何明显线性的散点图)
  • 接近 -1 的分数表明该系列以特定方式呈锯齿状:如果一个点高于平均值,则下一个点可能低于平均值大约相同的数量,反之亦然。

要估计阵列的粗糙度,请取归一化差异的平方差,然后除以 4。这使您与尺度无关(因为归一化),并忽略趋势(因为使用第二个差异)。

firstD = diff(x)
normFirstD = (firstD - mean(firstD)) / sd(firstD)
roughness = (diff(normFirstD) ** 2) / 4

零是完美的平滑度,1 是最大的粗糙度。

然后,您可以使用此测量的总和,也可以使用其平均值,具体取决于您是否希望粗糙度测量与长度无关。

我认为这可能与其他地方的先前答案相同:

类似的事情在类似的学术资料中讨论过thisthis,说我们应该整合平方二阶导数。

我不读代数,所以我不确定我的建议是否与其中任何一个完全相同。

您可以只检查与时间步数的相关性。这相当于对时间序列进行简单线性回归的 R²。但请注意,这是两个非常不同的时间序列,所以我不知道作为比较的效果如何。