2012-09-24 38 views
3

我使用密度{統計}構建的變量的向量的內核「高斯」的密度。如果我使用下面的示例數據集:衍生核密度

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的一階導數

回答

3

密度估計的曲線是所有剛剛總和內核,在你的情況下是高斯(除以點數)。和數的導數是導數和常數乘數的和,函數是常數乘以導數。因此,給定點處的密度估計的導數將僅僅是該給定點處的1475個不同高斯曲線的斜率的平均值。每個高斯曲線將具有對應於每個數據點的平均值和基於帶寬的標準偏差。因此,如果您可以計算高斯的斜率,那麼找到密度估計的斜率就是1475個斜坡的平均值。

+0

不錯的主意。對於標準正態分佈,斜率(根據維基百科)將是'dnorm(x)* x'。那麼帶寬/標準偏差's',是否是'dnorm(x,0,sd = s)* x'或'dnorm(x,0,sd = s)* x/s'? –

+0

@ JoshO'Brien在那裏至少應該有一個$ - $以及可能是另一個涉及$ s $的部分,當它不是1時。 –

+1

是的,我挖了一點,看起來有兩個因素的''''取消了。這是正確的公式:'s < - d $ bw;斜率< - sapply(x,function(X){mean(dnorm((x-X),0,s)*(x-X))})' –

5

編輯#2:

上格雷格斯諾的指教以下爲使用分析expressi在爲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) 

編輯:

OK,我只是重讀你的問題,並看到你想要在輸入矢量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