避免样条倾斜

机器算法验证 样条
2022-04-14 20:23:26

首先,我在数学技术方面不是很有经验,所以我对建议持开放态度。

我正在使用 R 中的一组数据。我有一条曲线(起初大部分是线性的,突然达到峰值,然后下降。)我想平滑它,所以我使用了样条曲线并达到了我想要的效果(尤其是峰值从顶点“偏离中心”的曲线)。但是我想避免在峰值下方有一个下降,因为它在那里基本上是线性的。 在此处输入图像描述

我有点理解(以非数学方式)为什么必须有这种下降,以便让曲线有足够的时间向上倾斜。但它并不代表该数据。

有什么办法可以避免这种下降吗?我曾考虑将其绘制为两条单独的线(一条直线和一条曲线),但这并不吸引人。除了样条线还有什么?或者我可以用来解决这个问题的代码?

Time          Feave
0.04    138.8181818
   7    1258.636364
  14    1320.545455
  21     2110.37037
  28    13730.37037
  35    1550.909091

我所使用的只是 R 中的 splinefun(如此立方)

plot(P0mM$Time,P0mM$Feave, ylab="Fe2+ uM", xlab="Time", main="0mM P", ylim=c(0,15000))
arrows(P0mM$Time, P0mM$Feave-P0mM$Festerr, P0mM$Time, P0mM$Feave+P0mM$Festerr, length=0.05, angle=90, code=3)
lines(spline(P0mM$Time,P0mM$Feave,n=200))
1个回答

有很多方法可以避免这种影响(例如,通常可以调整平滑样条以避免下降,或者可能需要在峰值左侧使用某种形式的单调样条),但我认为在这种特殊情况下一种简单的方法可能是转换(可能取对数或平方根),在该比例上拟合样条并转换回来。

存在单峰样条曲线,可能更适合您。

我没有使用它(编辑:嗯,我现在有!见下文),但我相信uniReg(在 CRAN 上)包会做单峰样条。

...

在此处输入图像描述

一些代码。在这里,我以前但想象不到将您的数据读入一个名为的数据框中a

library(uniReg)
z=seq(min(a$Time),max(a$Time),length=201)
uf=with(a,unireg(Time,Fe2.,g=5,sigma=1))
plot(Fe2.~Time,a,ylim=c(0,14500))
lines(z,uf$unimod.func(z))

作者还有一篇关于单峰样条曲线的论文——因为它是由外观发表的,但如果你想要的话,我会让你去追这篇论文——但似乎在包文档中没有提到它。