当导出线性函数的斜率(y = a + bx)时,它表示x和y之间的变化率。但是,如果我想知道函数相对于x的变化的变化率(基本上是二阶导数)的速度,那么究竟该怎么做呢?
x = rbind(-0.13612333, -0.02364000, 0.08234000, 0.09092667, 0.02164000,
-0.07784667, -0.10057333, -0.11222000, -0.07394333, -0.05615667)
y = rbind(0.013591, -0.045430, -0.013332, 0.010612, -0.013214,
-0.05521, -0.022531, -0.013262, 0.087841, -0.0201230)
beta = cov(x, y) / var(x)
beta = -0.0218445
答案 0 :(得分:1)
函数y= a + bx
的二阶导数仅为0.如果您怀疑存在非零二阶导数,您将需要以不同的公式(例如,y = a + b*x^2
开头 - 为此二阶导数为y'' = 2b
)
如果您想了解y值相对于x的变化情况,以及这些变化相对于x的变化情况,请查看:
> diff(y)
[,1]
[1,] -0.059021
[2,] 0.032098
[3,] 0.023944
[4,] -0.023826
[5,] -0.041996
[6,] 0.032679
[7,] 0.009269
[8,] 0.101103
[9,] -0.107964
> diff(diff(y))
[,1]
[1,] 0.091119
[2,] -0.008154
[3,] -0.047770
[4,] -0.018170
[5,] 0.074675
[6,] -0.023410
[7,] 0.091834
[8,] -0.209067
答案 1 :(得分:1)
假设y的值等间隔,则用
获得二阶导数的经典近似c(NA, y[seq_along(y) - 1]) - 2 * y + y[seq_along(y) + 1]
#[1] NA 0.091119 -0.008154 -0.047770 -0.018170 0.074675 -0.023410 0.091834 -0.209067 NA
结果以任意单位给出,因为我们没有关于单位和后续值之间距离的信息。
可以找到计算一阶和二阶导数的有限差分近似的通用公式here。
编辑/附录
这是另一种可能有用的可能性。可以将整个数据集拟合为二次函数并确定拟合的二阶导数,而不是尝试计算二阶导数的局部值。
正如评论中的OP所阐明的那样,数据是按时间顺序排列的t
,其中x
和y
的每个值都是以一个月的等距时间步长记录的。我假设x
和y
的值是指同月。基于此假设,我们可以先消除时间序列t
和x(t)
的参数y(t)
并考虑函数依赖y(x)
y1 <- y[order(x)] # reorder the data in ascending values of x
x1 <- x[order(x)] # do the same for x
fit <- lm(y1 ~ poly(x1, 2, raw=TRUE)) # fit a second-order polynomial
这会产生:
> fit$coefficients
# (Intercept) poly(x1, 2, raw = TRUE)1 poly(x1, 2, raw = TRUE)2
# -0.01834248 0.03744701 1.76134780
最后一个系数是拟合函数的二阶导数。拟合的结果可以用
绘制plot(y1 ~ x1)
lines(fitted(fit) ~ x1, col=4)