从样条曲线计算斜率值

时间:2014-07-14 12:49:31

标签: r

我想在斜率最大的点处获得x和y值,在样条曲线上获得最小值。我在this post看到了如何做到这一点,但无法在我的数据集上复制它。他们可以使用diff(),但我的数据集具有特定的x和y向量。我的数据通常如下所示:

x<-c(0, 0.13, 0.22, 0.34, 0.44, 0.53, 0.62, 0.72, 0.83, 0.91) y<-c(120, 121, 122, 122, 122, 122, 122, 121, 119, 103) z <-data.frame(x, y) z plot(z) xspline(z$x,z$y, shape=0.5)

但当然我不能用这个:

w <-xspline(z$x,z$y, shape=0.5) plot(diff(w))

如果可以,我会这样做:

param1 <- which(abs(diff(w))==max(abs(diff(w))) ) param2 <-z[which(abs(diff(w))==max(abs(diff(w))) ) ] param1 <- which(abs(diff(w))==min(abs(diff(w))) ) param2 <-z[which(abs(diff(w))==min(abs(diff(w))) ) ]

对于获得斜坡图的不同方法,或者另外获得这些参数的方法,我将不胜感激。也许我已经走了太多的样条&#39;路。

2 个答案:

答案 0 :(得分:1)

只需使用

w <-data.frame(xspline(z$x,z$y, shape=0.5, draw=F))

这会使w成为一个data.frame,其中xy值用于绘制样条线。然后你可以取y中差异的最大值/最小值来估算最大和最小斜率点

plot(z)
with(w, lines(x,y))
with(w[which.max(diff(w$y)),], points(x,y,col="red"))
with(w[which.min(diff(w$y)),], points(x,y,col="blue"))

enter image description here

答案 1 :(得分:1)

根据@Carl Witthoft提供的线索,我安装了包numDeriv,因此我可以使用grad(),并继续我之前离开的位置:

`plot(splinefun(z, method="monoH.F")) #just to check the shape of the spline
w <-splinefun(z, method="monoH.F")
z$slopes <-grad(w, z$x, method="simple")
z
plot(z$slopes~z$x) #just out of interest
max.slope <- subset(z, slopes==max(z$slopes))
max.slope.y <-max.slope$y[1]
max.slope.x <-max.slope$x[1]`

也许不是那么优雅,但是做了伎俩。我注意到splinefun()xspline()之间样条曲线的形状略有不同,这可能与我的应用相关或不相关。