2013-10-02 83 views
2

我計算了以下數據的密度函數:給定一個經驗概率密度函數,如何找到密度達到峯值的位置(R)?

> dput(mydat) 
c(-20, -13, 30, 4, -4, 34, 27, 19, 13.5, 15, 13, 18, 10, 12, 
21, -0.769999999999996, 2.5, -7, 0, -30.6, 6.39999999999999, 
-18.6, -0.199999999999989, -20.4, -19.9, 4.60000000000001, -19.4, 
4.5, -9, -15, 9, -1, -14, 8, 6, -17, 5, 7) 

> myden = density(mydat) # default kernel and bandwidth 

,給了我這樣的結果:

enter image description here

我想找到兩個密度峯值的位置。我最初考慮在myden$y上使用diff(),然後檢查有符號變化的所有位置,以此作爲選擇X軸值的條件。我在一些測試向量上嘗試了它,但是我沒有得到預期的結果,我懷疑它不是那麼簡單。

有沒有簡單的方法來實現這一目標?我想要一個可重複的解決方案,因爲我將這樣做作爲隨機模擬研究的一部分,並且可能會出現在整個模擬過程中峯值數量不同的情況。

+0

你爲什麼認爲diff()方法不能按預期工作?我剛剛看到差異輸出以及符號從+ ve變爲-ve的位置似乎在峯值附近。差異應近似通常適用於獲得局部最大值的差異類型的邏輯。 – TheComeOnMan

+0

@Thomas謝謝!是的,它是重複的。它將不得不被標記爲這樣,我不知道我是否有權這樣做。 – avg

+0

@Codoremifa在查看鏈接托馬斯張貼後,我記得從微積分類,人們必須測試這與第二個微分.. – avg

回答

2

我經常使用pastecs::turnpoints找到當地的最大值和最小值。

+0

例如,http://stats.stackexchange.com/q/30750/11849 – Roland

+0

@羅蘭在哪裏,「我發佈了」免責聲明? :-) //洗牌以鏈接到他自己的「轉折點」帖子* _O –

+0

「轉折點」就像一個魅力。不過,我可以想象,對於嘈雜的數據(類似於這篇文章http://stackoverflow.com/questions/14319826/finding-local-maxima-minima-in-r/14320172#14320172),我可能會尋找解決方法..但這是一個不同的問題,現在,這應該工作。 – avg

2

使用which.max

myden$x[which.max(myden$y)] 
# [1] 5.91428 

您可以直觀地測試:

plot(myden, col='red') 
abline(v=myden$x[which.max(myden$y)]) 

enter image description here

+0

我想找到兩個(或多個,如果有更多)峯的價值,而不僅僅是全球最高.. – avg

+0

@AdvaitGodbole啊,然後看到我剛剛發佈在您的原始問題上的問題和答案。 – Thomas