1 回答

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 使用更好的版本。
添加回答
舉報