核密度的导数

时间:2012-09-24 16:01:00

标签: r derivative

我使用密度{stats}构建变量向量的内核“高斯”密度。如果我使用以下示例数据集:

    x <- rlogis(1475, location=0, scale=1)  # x is a vector of values - taken from a rlogis just for the purpose of explanation
    d<- density(x=x, kernel="gaussian")

是否有某种方法可以在每个d点获得此密度n=1475的一阶导数

2 个答案:

答案 0 :(得分:5)

编辑#2:

跟进Greg Snow关于使用derivative of a Gaussian的分析表达式的优秀建议,以及我的帖子之后的对话,这将获得每个点的确切斜率:

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

答案 1 :(得分:3)

密度估计器的曲线只是所有内核的总和,在您的情况下是高斯(除以点数)。和的导数是导数和常数的导数的和,乘以一个常数乘以导数。因此,给定点处的密度估计的导数将仅是该给定点处的1475条不同高斯曲线的斜率的平均值。每条高斯曲线将具有对应于每个数据点的平均值和基于带宽的标准偏差。因此,如果您可以计算高斯的斜率,那么找到密度估计的斜率只是1475个斜率的平均值。