核密度估计的导数

3

我将使用密度{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")

有没有一种方法可以在每个 n=1475 点处获得此密度函数 d 的一阶导数?

2个回答

5

编辑 #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

3
密度估计器的曲线只是所有核函数之和,对于您的情况是高斯核(除以点数)。求和的导数是导数的总和,常数乘以函数的导数是该常数乘以导数。因此,在给定点处密度估计的导数将仅是该给定点处1475个高斯曲线的坡度的平均值。每个高斯曲线将具有与每个数据点相对应的平均值和基于带宽的标准差。因此,如果您可以计算高斯曲线的坡度,那么找到密度估计的坡度就是1475个坡度的平均值。

不错的想法。对于标准正态分布,斜率(根据维基百科)将是 dnorm(x) * x。因此,使用带宽/标准偏差s,应该是 dnorm(x, 0, sd = s) * x 还是 dnorm(x, 0, sd = s) * x/s - Josh O'Brien
@JoshO'Brien 在那里应该至少有一个$-$,还可能涉及到$s$的另一部分,当它不为1时。 - Greg Snow
1
是的,我深入挖掘了一下,看起来有两个s的因素被抵消了。这是正确的公式:s <- d$bw; slope <- sapply(x, function(X) {mean(dnorm((x-X), 0, s) * (x-X))}) - Josh O'Brien

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