编辑#2:
继 Greg Snow 提出的使用高斯导数的解析表达式的极好建议,以及我们在他的帖子之后的对话,这将为您提供每个点的确切斜率:
s <- d$bw;
slope2 <- sapply(x, function(X) {mean(dnorm(x - X, mean = 0, sd = s) * (x - X))})
## And then, to compare to the method below, plot the results against one another
plot(slope2 ~ slope)
编辑:
好的,我刚刚重读了您的问题,并看到您想要输入向量中每个点的斜率x
。这是您可能近似的一种方法:
slope <- (diff(d$y)/diff(d$x))[findInterval(x, d$x)]
一个可能的进一步改进是在其区间内找到该点的位置,然后将其斜率计算为当前区间的斜率与其右侧或左侧的区间的加权平均值。
我会通过平均每个点的右侧和左侧的线段的斜率来解决这个问题。(需要特别注意第一个点和最后一个点,它们的左右分别没有段。)
dy <- diff(d$y)
dx <- diff(d$x)[1] ## Works b/c density() returns points at equal x-intervals
((c(dy, tail(dy, 1)) + c(head(dy, 1), dy))/2)/dx