在R中计算数据函数的导数

4
有没有一种简单的方法来计算由数据给出的非线性函数的导数?
例如:
x = 1 / c(1000:1)

y = x^-1.5
ycs = cumsum(y)

plot (x, ycs, log="xy")

我该如何从由 ´x´ 和 ´ycs´ 给出的函数计算导函数?

在这个例子中,你的确切期望结果是什么? - danas.zuokas
所有的答案都假设您实际上不知道函数的基础类型。如果您知道模型,您可以简单地进行非线性回归。 - Roland
4个回答

15

我原本想提供一个光滑样条拟合的例子,然后进行导数预测。在这种情况下,结果非常类似于@dbaupp所描述的diff计算:

也可以建议使用光滑样条拟合的例子,接着进行导数预测。 在这种情况下,结果与@dbaupp所描述的diff计算非常相似:

spl <- smooth.spline(x, y=ycs)
pred <- predict(spl)

plot (x, ycs, log="xy")
lines(pred, col=2)

ycs.prime <- diff(ycs)/diff(x)
pred.prime <- predict(spl, deriv=1)

plot(ycs.prime)
lines(pred.prime$y, col=2)

这个答案是错误的。尝试:x=-10:10 y=x^2 plot(x, y, type = 'l', col='blue', ylim=c(-10,10)) lines(x = x, y = c(NA, diff(y)/diff(x)), type = 'l', col='red') abline(v=0, h=0) abline(a = 0, b = 2) - Elad663
@Elad663 - 这是由于您的数据分辨率所致。 请尝试:x=seq(-10,10,length.out = 100) - Marc in the box
@Elad663 - 实际上,你甚至没有使用我的建议解决方案——样条。即使是在你有限的数据集中,这个方法也可以正常工作:spl <- smooth.spline(x, y=y); lines(x=x, y=predict(spl, deriv=1)$y) - Marc in the box
样条曲线是一种方法,如果用户理解其不确定性,则可以使用。关于diff(y)/diff(x),如果OP在谈论从给定数据中导出的导数,则不能假设您拥有良好的数据。 - Elad663

9

如果您不非常小心,从原始数据生成导数是很有风险的。这个过程之所以被称为“误差倍增”,并非没有原因。除非您知道数据的噪声内容并采取一些措施(例如样条),在求导之前去除噪声,否则您可能会得到一个令人生畏的曲线。


8

函数的导数是dy/dx,可以近似表示为Δy/Δx,即“y的变化量除以x的变化量”。这可以用R语言表示:

ycs.prime <- diff(ycs)/diff(x)

现在,ycs.prime 包含每个 x 处函数导数的近似值: 但它是一个长度为999的向量,因此在进行任何分析或绘图时,您需要缩短 x(即使用 x[1:999]x[2:1000])。


3

还可以使用 pracma 包中的 gradient 方法。

grad <- pracma::gradient(ycs, h1 = x)
plot(grad, col = 1)

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