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

时间:2015-05-27 14:00:37

标签: r time-series noise smoothing kalman-filter

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

所以我的问题是:

  

是否有任何方法可以消除图中的所有噪声但保留峰值?

我还读过有关卡尔曼滤波的内容,但我不确定这是如何工作的,如果这适合我的问题。

我尝试了以下代码:

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

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

数据集:

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

未平滑的情节:

unsmoothed plot

平滑的图(宽度= 10):

enter image description here

如你所见,第二个图是非常扭曲的,并且第一个例如大约250 L / s而不是500 L / s。 这样做的原因是,它是根据滚动平均值计算出来的,所以它变得非常扭曲。

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

1 个答案:

答案 0 :(得分:2)

  

是否有任何方法可以消除图中的所有噪声但保留峰值?

这里面临的挑战是你还没有真正说出什么是噪音,什么是信号。通常,一个完全不同的(“峰值”)值将被归类为噪声。当人们说过滤时,他们通常会考虑低通滤波(消除高频噪声并保持一般趋势)。根据这个定义,突然的峰值将是噪音。

如果您对系统及其噪声有数学理解,卡尔曼滤波器将为您提供工具。在KF的“预测”步骤中,您将获得一个数学模型,该模型将产生一个预期值,您可以根据该模型测试您的测量值。如果您可以预测峰值(无论是它们的值,还是它们存在的峰值),KF都可以帮助您。

可能有用的方法是http://www.lifl.fr/~casiez/1euro/“1欧元”过滤器。核心思想是总体运动(你的突然峰值)可能基本上是正确的,而低运动时期是嘈杂的并且应该平均下降。只要有大的移动,该过滤器就会突然打开带宽,然后逐渐将其压下。它专为跟踪人体运动而设计而不反映测量结果产生的噪音。