R中线性函数中斜率的导数

时间:2015-08-11 18:15:38

标签: r function linear-regression beta derivative

当导出线性函数的斜率(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

2 个答案:

答案 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,其中xy的每个值都是以一个月的等距时间步长记录的。我假设xy的值是指同月。基于此假设,我们可以先消除时间序列tx(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)

enter image description here