R 核密度导数

R 核密度导数,r,derivative,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") x编辑#2: 接下来是Greg Snow关于使用分析表达式进行分

我使用密度{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")
x编辑#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)
一种可能的进一步改进方法是找到该点在其区间内的位置,然后计算其斜率,作为当前区间斜率及其右侧或左侧区间斜率的加权平均值


我将通过平均每个点左右两侧的线段斜率来实现这一点(需要特别注意第一个点和最后一个点,它们的左右两侧分别没有线段)


dy密度估计器的曲线就是所有核的总和,在你的例子中是高斯(除以点数)。和的导数是导数的和,常数乘以函数的导数是常数乘以导数。因此,给定点处密度估计的导数将只是该给定点处1475条不同高斯曲线斜率的平均值。每条高斯曲线将具有平均相关系数每个数据点都有一个积水和基于带宽的标准偏差。因此,如果你能计算高斯分布的斜率,那么密度估计的斜率就是1475个斜率的平均值。

好主意。对于标准正态分布,斜率(根据维基百科)将是
dnorm(x)*x
。因此,如果带宽/标准偏差
s
,这是
dnorm(x,0,sd=s)*x
还是
dnorm(x,0,sd=s)*x/s
?@JoshO'Brien应该至少有一个$-$在那里的某个地方,当它不是1时,可能还有另一个部分涉及到$s$。是的,我进一步挖掘了一下,看起来有两个因素可以抵消。
s
。下面是正确的公式:
s
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