【问题标题】:Calculate the derivative of a data-function in r计算 r 中数据函数的导数
【发布时间】:2012-06-18 10:33:55
【问题描述】:

有没有一种简单的方法可以计算数据给出的非线性函数的导数?

例如:

x = 1 / c(1000:1)

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

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

如何从 'x' 和 'ycs' 给出的函数计算导数函数?

【问题讨论】:

  • 在这个例子中你想要的结果到底是什么?
  • 所有答案都假设您实际上并不知道函数的底层类型。如果您知道模型,您可以简单地进行非线性回归。

标签: r function derivative


【解决方案1】:

还打算提出一个平滑样条拟合的示例,然后预测导数。在这种情况下,结果与@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 - 这是由于您的数据的分辨率。试试:x=seq(-10,10,length.out = 100).
  • @Elad663 - 实际上,您甚至没有使用我建议的样条曲线解决方案。即使您的数据集有限,这也可以正常工作:spl &lt;- smooth.spline(x, y=y); lines(x=x, y=predict(spl, deriv=1)$y)
  • 如果用户理解它的不确定性,样条曲线是一种可行的方法。关于 diff(y)/diff(x),如果 OP 讨论的是给定数据的导数,你不能假设你有很好的数据。
【解决方案2】:

除非您非常小心,否则从原始数据生成导数是有风险的。这个过程被称为“误差倍增器”并非毫无意义。除非您知道数据的噪声内容并在微分之前采取一些措施(例如样条)来消除噪声,否则您很可能最终会得到一条可怕的曲线。

【讨论】:

    【解决方案3】:

    函数的导数是dy/dx,可以近似为Δy/Δx,即“y的变化超过x的变化”。这可以用 R 写成

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

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

    【讨论】:

      【解决方案4】:

      还有来自 pracma 包的gradient

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-18
        • 2017-10-20
        • 1970-01-01
        • 1970-01-01
        • 2022-12-09
        • 1970-01-01
        • 2022-01-15
        相关资源
        最近更新 更多