我想生成一组数据点的平滑版本,但保留任何局部峰值或谷值(即前一个和下一个值都大于或小于当前值的位置)。 R中的标准smooth
函数执行运行中值,这对中间值非常有用,但可以截断数据的峰值和谷值。这是一个希望有助于解释这个问题的例子:
peakValleys <- runif(20);
landform <- approx(x=seq_along(peakValleys), y=peakValleys, n=200)$y;
landform <- landform + runif(200, max=0.1);
plot(landform);
points(smooth(landform), type="l", col="red");
我希望红线包含任何局部峰值/谷值,但仍然看起来很平滑(即不仅仅是在峰值/谷值点跳跃)。这在28左右最明显,其中谷数据点已被完全排除。
如果我有一个更大的平滑窗口和运行中位数,问题会更严重。理想情况下,这种“包含峰值的平滑”应适用于任何窗口大小:
plot(landform.jitter);
points(runmed(landform.jitter, 7), type="l", col="red");