对于给定的x,y系列,我需要拟合样条曲线。然后在给定的y值(例如0.65)下,我想绘制一个切线并提取其对应的x值。我使用smooth.spline函数拟合曲线。
spl <- smooth.spline(y ~ x)
我的数据在下面。任何帮助我应该怎么做。
structure(list(x = c(0.55, 0.575, 0.6, 0.625, 0.65, 0.675, 0.7,
0.725, 0.75, 0.775, 0.8, 0.825, 0.85, 0.875, 0.9, 0.925, 0.95,
0.975, 1, 1.025, 1.05, 1.075, 1.1, 1.125, 1.15, 1.175, 1.2, 1.225,
1.25, 1.275, 1.3, 1.325, 1.35), y = c(0, 0.004065041, 0.02173913,
0.067164179, 0.166666667, 0.357142857, 0.642857143, 0.907407407,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1)), .Names = c("x", "y"), class = "data.frame", row.names = c(NA,
-33L))
here也有类似的解决方案!但是在此示例中,新数据是x轴上的点,而在我的情况下,新数据是y轴上的点。
答案 0 :(得分:1)
您可以使用unitroot
查找y
匹配的点:
x <- seq(0,40)
y <- pnorm(seq(0,40), mean=25, sd=5)
spl <- smooth.spline(y ~ x)
newy <- 0.85
newx <- uniroot(function(x) predict(spl, x, deriv = 0)$y - newy,
interval = c(0, 40))$root
plot(x, y)
lines(spl, col=2)
points(newx, newy, col=3, pch=19)
关于算法,我们从?uniroot
中获得:
uniroot()使用Fortran子例程“ zeroin”(来自Netlib)基于 下面参考中给出的算法。他们假设一个连续的 函数(然后知道它至少有一个根 间隔)。
[...]
基于http://www.netlib.org/c/brent.shar中的“ zeroin.c”。
[...]
Brent,R.(1973)不带导数的最小化算法。 新泽西州恩格尔伍德悬崖(Englewood Cliffs):普伦蒂斯·霍尔(Prentice-Hall)。