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")

d有没有办法在每个n=1475点上得到这个密度的一阶导数

4

2 回答 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
于 2012-09-24T16:15:02.597 回答
3

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

于 2012-09-24T17:42:27.647 回答