亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 stat_density (R; ggplot2) 和 gaussian_kde 不同?

為什么 stat_density (R; ggplot2) 和 gaussian_kde 不同?

Cats萌萌 2021-12-17 10:22:33
我試圖在一系列可能不是正態分布的分布上生成基于 KDE 的 PDF 估計。我喜歡 R 中 ggplot 的 stat_density 似乎可以識別頻率中每個增量顛簸的方式,但無法通過 Python 的 scipy-stats-gaussian_kde 方法復制這一點,這似乎過于平滑。我已經按如下方式設置了我的 R 代碼:ggplot(test, aes(x=Val, color = as.factor(Class), group=as.factor(Class))) +             stat_density(geom='line',kernel='gaussian',bw='nrd0'                                                             #nrd0='Silverman'                                                            ,size=1,position='identity')我的python代碼是:kde = stats.gaussian_kde(data.ravel())kde.set_bandwidth(bw_method='silverman')統計文檔在這里顯示 nrd0 是用于 bw 調整的silverman 方法。基于上面的代碼,我使用相同的內核(高斯)和帶寬方法(西爾弗曼)。誰能解釋為什么結果如此不同?
查看完整描述

1 回答

?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

關于什么是西爾弗曼規則似乎存在分歧。TL; DR - scipy 使用更糟糕的規則版本,該規則僅適用于正態分布的單峰數據。R 使用更好的版本,它是“兩全其美”并且“適用于廣泛的密度”。


該SciPy的文檔說,西爾弗曼的規則是為實現:


def silverman_factor(self):

    return power(self.neff*(self.d+2.0)/4.0, -1./(self.d+4))

哪里d是維度數(在您的情況下neff為1),是有效樣本大小(點數,假設沒有權重)。所以 scipy 帶寬是(n * 3 / 4) ^ (-1 / 5)(乘以標準偏差,以不同的方法計算)。


相比之下,R的stats封裝文檔描述西爾弗曼的方法為“最小0.9倍的標準偏差的和四分位范圍由1.34倍樣品量劃分到負五分之一功率”,這也可作為R代碼驗證,打字bw.nrd0在控制臺給出:


function (x) 

{

    if (length(x) < 2L) 

        stop("need at least 2 data points")

    hi <- sd(x)

    if (!(lo <- min(hi, IQR(x)/1.34))) 

        (lo <- hi) || (lo <- abs(x[1L])) || (lo <- 1)

    0.9 * lo * length(x)^(-0.2)

}

另一方面,維基百科將“西爾弗曼的經驗法則”作為估計器的眾多可能名稱之一:


1.06 * sigma * n ^ (-1 / 5)

維基百科版本相當于 scipy 版本。


所有三個來源(scipy 文檔、維基百科和 R 文檔)都引用了相同的原始參考資料:Silverman, BW (1986)。統計和數據分析的密度估計。倫敦:查普曼和霍爾/CRC。p. 48. ISBN 978-0-412-24620-3。維基百科和 R 專門引用了第 48 頁,而 scipy 的文檔沒有提到頁碼。(我已向 Wikipedia 提交了編輯以將其頁面引用更新為第 45 頁,見下文。)


讀西爾弗曼紙,45頁,方程3.28上是什么是維基百科的文章中使用:(4 / 3) ^ (1 / 5) * sigma * n ^ (-1 / 5) ~= 1.06 * sigma * n ^ (-1 / 5)。Scipy 使用相同的方法,重寫(4 / 3) ^ (1 / 5)為等效的(3 / 4) ^ (-1 / 5). Silverman 描述了這種方法:


雖然(3.28)在群體確實是正態分布的情況下會很好地工作,但如果群體是多峰的,它可能會有些過度平滑……隨著混合物變得越來越強雙峰,相對于最佳選擇,公式(3.28)將越來越過平滑平滑參數。


scipy 文檔引用了這個弱點,指出:


它包括自動帶寬確定。該估計最適用于單峰分布;雙峰或多峰分布往往過于平滑。


然而,Silverman 的文章繼續,改進了 scipy 使用的方法,以獲得 R 和 Stata 使用的方法。在第 48 頁,我們得到方程 3.31:


h = 0.9 * A * n ^ (-1 / 5)

# A defined on previous page, eqn 3.30

A = min(standard deviation, interquartile range / 1.34)

Silverman 將這種方法描述為:


兩全其美……總而言之,平滑參數的選擇 ([eqn] 3.31) 將適用于廣泛的密度范圍,并且易于評估。對于許多目的,它肯定是窗口寬度的充分選擇,對于其他人來說,它將是后續微調的良好起點。


因此,Wikipedia 和 Scipy 似乎使用了 Silverman 提出的具有已知弱點的估計器的簡單版本。R 和 Stata 使用更好的版本。


查看完整回答
反對 回復 2021-12-17
  • 1 回答
  • 0 關注
  • 452 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號