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

6
我有三个月的每日数据时间序列(数据每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

未平滑的图表:

未平滑的图表

平滑后的图表(宽度为10):

输入图像描述

正如你所看到的,第二个图表相当扭曲,例如第一个峰值在大约250 L/s而不是500 L/s。造成这种情况的原因是它是由滚动均值计算出来的,因此它变得相当扭曲。

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


不好意思 :) 给你! - Foerbian
现在看起来好多了。虽然我不精通R语言。我只能建议你等待,并在此期间熟悉一下Stack Overflow。http://stackoverflow.com/tour - Nick Volynkin
做了一点小修改。如果您附上图表的图片(在过滤之前和之后),答案将变得更易读。 - Nick Volynkin
非常感谢。我对R和这个论坛还很陌生,所以感谢你的帮助:)但是我担心,在获得10个声望之前,我无法发布任何图片!否则我早就做了! - Foerbian
现在你有11。 - Nick Volynkin
你能提供ASCII列表的数据吗?我想尝试FFT。你所提到的噪音一定是日常结构。因此,在频率空间中,您可能能够抑制/删除1/24小时范围。我没有看到任何其他可能被视为“噪音”的东西。而且每天的变化严格来说不是噪音(随机的)。它是一个重复的系统模式,可能与温度有关等等。因此,一个高级解决方案可以是搜索相关性(温度、压力等),并积极修复它! - Ralf Ulrich
1个回答

3
有没有方法可以去除图表中的所有噪音,但保留峰值?这里的挑战在于你并没有说明什么是噪音和什么是信号。通常来说,一个极端不同的(“峰值”)数值会被归类为噪音。当人们谈论过滤时,通常想到的是低通滤波(去除高频噪声并保留一般趋势)。根据这个定义,突然的峰值会被视为噪音。
如果你对系统及其噪声有数学上的了解,卡尔曼滤波器将给你提供一个工具。在卡尔曼滤波器的“预测”步骤中,你将拥有一个数学模型,该模型将产生一个预期值,与此你将测试你的测量值。如果你能预测出峰值(无论是它们的值还是只是它们存在的时刻),卡尔曼滤波器可以帮助你。
一种可能有帮助的方法是http://www.lifl.fr/~casiez/1euro/“1欧元”滤波器。其核心思想是,粗略的运动(即突然的峰值)很可能是真实的,而低运动时期则会产生噪音,应该平均下降。该滤波器在有大运动时突然打开其带宽,然后逐渐压缩。它是为了跟踪人类运动而设计的,而不反映测量中的噪声。

嗨Ben,感谢你的努力。听起来这正是我在寻找的。我已经意识到这个问题,根据定义,这些“峰值”被认为是噪声,尽管它们是真实存在的。通常,一些简单的移动平均对我的需求已经足够了,但是在这种情况下确实有点复杂。但是一个问题仍然存在:似乎没有R中“1€-filter”的实施? - Foerbian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接