平滑时间序列数据而不平滑 R 中的峰值

Foe*_*ian 5 r time-series noise smoothing kalman-filter

我有 3 个月时间序列的每日数据(每 5 分钟记录一次数据)。数据相当嘈杂。
我已经尝试过一些 MA 方法。它们工作正常,产生的曲线相当平滑,但问题是峰值几乎被平滑了。

所以我的问题是:

有什么方法可以消除图中的所有这些噪声但保留峰值?

我也读过一些关于卡尔曼滤波的内容,但我不确定它是如何工作的,以及这是否适合我的问题。

我尝试了以下代码:

smooth <- rollapply(PCM4 [,3], width=10, FUN=mean, align = "center", fill=NA)
Run Code Online (Sandbox Code Playgroud)

我还尝试了一些不同的窗口宽度输入值,这使结果数据更平滑,但也减少了不是我想要的峰值。

数据集:

DateTime            h     v     Q      T
2014-12-18 11:45:00 0.112 0.515 17.141 15.4
2014-12-18 11:50:00 0.113 0.511 17.007 15.5
2014-12-18 11:55:00 0.114 0.518 17.480 15.5
Run Code Online (Sandbox Code Playgroud)

不平滑的情节:

不平滑的情节

平滑图(宽度= 10):

在此处输入图片说明

如您所见,第二个图非常扭曲,第一个峰值(例如)约为 250 L/s,而不是 500 L/s。这样做的原因是,它是根据滚动平均值计算的,因此它变得非常扭曲。

但问题是:有没有更好的解决方案来满足我的需求?

Ben*_*son 3

有没有什么方法可以消除图中的所有这些噪声但保留峰值?

这里的挑战是你还没有真正说出什么是噪声,什么是信号。通常,截然不同的(“峰值”)值将被归类为噪声。当人们说滤波时,他们通常会想到低通滤波(去除高频噪声并保持总体趋势)。根据这个定义,突然的峰值将是噪音。

如果您对系统及其噪声有数学上的了解,卡尔曼滤波器将为您提供一个可用的工具。在 KF 的“预测”步骤中,您将拥有一个数学模型,该模型将产生一个预期值,您可以根据该值来测试您的测量结果。如果您可以预测峰值(它们的值,甚至它们存在的时间),KF 可以帮助您。

一种可能有帮助的方法是http://www.lifl.fr/~casiez/1euro/“1欧元”过滤器。核心思想是,总的运动(突然的峰值)可能基本上是真实的,而低运动的时期是嘈杂的,应该被平均下来。每当有大的运动时,该滤波器就会突然打开其带宽,然后逐渐限制其带宽。它旨在跟踪人体运动,而不反映测量中的噪音。