如何计算时间序列的一阶导数

19

我将使用两个变量timepH来计算时间序列的一阶导数(dpH/dtime)。

在R语言中,有相应的函数可以实现这个功能吗?或者我需要自己编写一个额外的函数来完成这个任务?


我想到了 diff.ts - Matthew Lundberg
1
或者更粗略地说,diff(pH)/diff(time);这也取决于您是否想要进行某种平滑处理。 - Ben Bolker
我使用了函数diff,例如导数<-diff(pH)/diff(time),但与在Excel中手动计算得到的值相比,我得到了其他值。在Excel中,我这样做:(pH2-pH1)/(time2-time1)。为什么? - alexmulo
1
几乎不可能在没有可重现的示例的情况下说出来(http://tinyurl.com/reproducible-000)。假设`pH1`是`pH2`的滞后版本,`time1`/`time2`也是如此,您的计算*应该*给出相同的结果... - Ben Bolker
你是对的,我在 R 中有一个导出问题。在 Excel 中,时间差为 0.16667,但我只导出了一位小数的时间序列。对于这个错误我很抱歉。 - alexmulo
我认为我们要么关闭这个问题,要么您应该发布一个已经解决的示例,展示您所做的工作(即diff(pH)/diff(time)的示例...)。 - Ben Bolker
3个回答

19

假设 pHtime 是普通向量,请尝试以下操作:

library(pspline)
predict(sm.spline(time, pH), time, 1)

12
您可能想从stats :: derivdiff.ts开始,正如Matt L所建议的那样。请记住,我的一位教授曾告诉所有学生:数值微分被称为“误差倍增器”。
编辑: 为了澄清——他所警告的是你数据中的任何噪音都可能使导数估计严重偏离。有人说积分是一个低通滤波器,微分是一个高通滤波器。 因此,在计算导数之前对您的数据进行一些平滑处理非常重要。因此,Gabor的建议是使用predict.spline。但请记住,修改样条参数将使您的数据平滑到不同的水平,因此始终查看结果,以确保您删除了明显的噪音但没有删除所需的特征。

你能否添加一两行来解释一下“数值微分又称误差倍增法”?我非常好奇。 - PascalVKooten

0

1
这是有用的信息,但我认为与OP的问题无关(这个问题是关于如何找到时间序列数据的导数,而不是关于找到/近似定义函数的导数...) - Ben Bolker
@BenBolker - 你说得对。numDeriv不是正确的包。我现在找不到正确的包(也许我记错了来自其他语言的包?),但技术只是标准的泰勒级数方法。我会替换numDeriv链接。 - bill_080

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