为什么 stat_密度 (R; ggplot2) 和 gaussian_kde (Python; scipy) 不同?

2023-12-11

我正在尝试对一系列可能不是正态分布的分布生成基于 KDE 的 PDF 估计。

我喜欢 R 中 ggplot 的 stat_密度 似乎可以识别频率中的每个增量波动,但无法通过 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')

R example

我的Python代码是:

kde = stats.gaussian_kde(data.ravel())
kde.set_bandwidth(bw_method='silverman')

python example

统计文档显示herenrd0 是用于 bw 调整的 silverman 方法。

基于上面的代码,我使用相同的内核(高斯)和带宽方法(Silverman)。

谁能解释为什么结果如此不同?


对于什么是西尔弗曼规则似乎存在分歧。 TL;DR - scipy 使用了更糟糕的规则版本,该规则仅适用于正态分布的单峰数据。 R 使用更好的版本,“两全其美”并且“适用于广泛的密度”。

The scipy 文档说西尔弗曼规则是实施为:

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

Where d是维数(1,在你的情况下)和neff是有效样本量(点数,假设没有权重)。所以 scipy 带宽是(n * 3 / 4) ^ (-1 / 5)(乘以标准差,以不同的方法计算)。

相比之下,Rstats包文档将 Silverman 的方法描述为“标准差和四分位数最小值的 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)

wikipedia 版本相当于 scipy 版本。

所有三个来源(scipy 文档、维基百科和 R 文档)都引用了相同的原始参考文献:Silverman、B.W. (1986)。用于统计和数据分析的密度估计。伦敦:Chapman & Hall/CRC。 p。 48.ISBN 978-0-412-24620-3。维基百科和 R 特别引用了第 48 页,而 scipy 的文档没有提及页码。 (我已向维基百科提交了编辑,将其页面引用更新为第 45 页,见下文。)

阅读 Silverman 论文第 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)。西尔弗曼描述了这种方法:

虽然(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)

西尔弗曼将此方法描述为:

两全其美...总之,平滑参数的选择 ([eqn] 3.31) 对于各种密度都效果很好,并且评估起来很简单。对于许多用途来说,它肯定是窗口宽度的适当选择,而对于其他用途来说,这将是后续微调的良好起点。

因此,维基百科和 Scipy 似乎使用了 Silverman 提出的估计器的简单版本,但存在已知的弱点。 R和Stata使用更好的版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 stat_密度 (R; ggplot2) 和 gaussian_kde (Python; scipy) 不同? 的相关文章

  • Sorted(key=lambda: ...) 背后的语法[重复]

    这个问题在这里已经有答案了 我不太明白背后的语法sorted 争论 key lambda variable variable 0 Isn t lambda随意的 为什么是variable在看起来像的内容中陈述了两次dict 我认为这里的所有
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • Python:随时接受用户输入

    我正在创建一个可以做很多事情的单元 其中之一是计算机器的周期 虽然我将把它转移到梯形逻辑 CoDeSys 但我首先将我的想法放入 Python 中 我将进行计数 只需一个简单的操作 counter 1 print counter 跟踪我处于
  • 反加入熊猫

    我有两个表 我想附加它们 以便仅保留表 A 中的所有数据 并且仅在其键唯一时添加表 B 中的数据 键值在表 A 和 B 中是唯一的 但在某些情况下键将出现在表 A 和 B 中 我认为执行此操作的方法将涉及某种过滤联接 反联接 以获取表 B
  • 使用 genfromtxt 导入 numpy 中缺失值的 csv 数据

    我有一个 csv 文件 看起来像这样 实际文件有更多的列和行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 假设文件的名称是info csv如果我尝试使用导入它 data numpy genfromtxt i
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • 消除垂直线ggplot

    这个问题以前曾被问过 但答案并不总是明确或很复杂 我希望 ggplot2 的新版本能够带来更简单的解决方案 如何仅消除 ggplot 的垂直线而不消除轴刻度线或标签 这对于条形图来说确实很好 因为它可以消除图形中一些不必要的干扰 这里有一些
  • 更快地评估从右到左的矩阵乘法

    我注意到以二次形式评估矩阵运算右到左明显快于左到右在 R 中 取决于括号的放置方式 显然它们都执行相同的计算量 我想知道为什么会这样 这与内存分配有什么关系吗 A 5000 5000 B 5000 2 A matrix runif 5000
  • urllib2.urlopen() 是否实际获取页面?

    当我使用 urllib2 urlopen 时 我在考虑它只是为了读取标题还是实际上带回整个网页 IE 是否真的通过 urlopen 调用或 read 调用获取 HTML 页面 handle urllib2 urlopen url html
  • 在 pip.conf 中指定多个可信主机

    这是我尝试在我的中设置的 etc pip conf global trusted host pypi org files pythonhosted org 但是 它无法正常工作 参考 https pip pypa io en stable
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • R中的for循环和if函数

    我正在用 R 中的 if 函数编写一个循环 表格如下 ID category 1 a 1 b 1 c 2 a 2 b 3 a 3 b 4 a 5 a 我想使用 for 循环和 if 函数添加另一列来计算每个分组的 ID 如下所示的计数列 I
  • 在谷歌C​​olab中使用cv2.imshow()

    我正在尝试通过输入视频来对视频进行对象检测 cap cv2 VideoCapture video3 mp4 在处理部分之后 我想使用实时对象检测来显示视频 while True ret image np cap read Expand di
  • Python Flask 是否定义了路由顺序?

    在我看来 我的设置类似于以下内容 app route test def test app route
  • 是否可以将 cython 函数作为参数传递给 scipy 函数?

    Scipy 有许多函数接受 python 可调用来执行某些操作 特别是 我正在使用数学优化函数scipy optimize leastsq接受 Python 可调用作为目标函数参数 该目标函数可以通过以下方式调用leastsq在最小化过程中
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30

随机推荐

  • Dart 中的日期倒计时

    我正在尝试为我的特定日期创建一个倒计时 并显示在那之前还剩多少小时 分钟和秒 例如我想将计数器日期设置为 2018 年 10 月 25 日星期四上午 7 14 05 我想向用户显示 剩余时间 hh mm ss 直到 10 月 25 日 我试
  • 如何在Java中将itext pdf文件的段落设置为带背景色的矩形

    我正在使用 itext 库设计一个 pdf 报告 我已经在其中实现了一个段落 现在根据我的要求 我必须将此段落设置在具有背景颜色的矩形框中 但我无法做到这一点 这是我的 java 中的 Itext 代码 Font f new Font Fo
  • PHP 代码未在浏览器中呈现[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我有一个文件 manage php 其中包含 php
  • 在服务器上执行java代码

    我正在开发一个 Web 应用程序 一种用于编写和编译代码的在线 IDE 编程语言和编译器都是在大学内部开发的 我的问题是 是否可以在服务器上执行编译器 编译器是用java编写的 以便它编译代码并返回要下载的编译文件 更简单的是 用户使用在线
  • Python 3 的事件循环实现?

    有谁知道可用于 Python 3 的事件循环库 或绑定 如果它只支持 UNIX 系统也没关系 但我更喜欢也支持 Windows 系统 ETA 我意识到编写一个事件循环系统并不是非常困难 然而 我不想重新发明轮子 这些天我们仍然鼓励不要这样做
  • 为什么图像压缩算法要按子块处理图像?

    例如 考虑 DFT 或 DCT 准确地说 通过子块变换的图像与整体变换的图像之间有什么区别 生成的文件大小是否较小 算法是否更高效 变换后的图像看起来有什么不同吗 谢谢 它们被设计为可以使用并行硬件来实现 每个块都是独立的 可以在不同的计算
  • Cygwin 显示 UTC 时间而不是本地时间

    今天我注意到我的 cygwin shell 显示了错误的时间 它实际上是 UTC 时间 而它应该是我的当地时间 一旦我取消设置 TZ 变量 它就会显示当地时间 以下是一些显示情况的命令 我运行的是 Windows 10 我的 Windows
  • 通过 Powershell 中的 Web 服务使用复杂对象?

    我一直在尝试通过 Powershell 使用供应商提供的 Web 服务系统 我正在运行 4 0 以下是我用来设置代理以使用该服务的代码 uri http somehost employer net 9999 AdministrationSe
  • 为什么一个进程共享同一个HT核心时,另一个进程的执行时间会更短

    我有一个带有 4 个 HT 核心 8 个逻辑 CPU 的 Intel CPU 并且构建了两个简单的进程 第一个 int main for int i 0 i lt 1000000 i for int j 0 j lt 100000 j 第二
  • 如何使用 React 路由器嵌套路由

    我有多个布局 应包含不同的屏幕 每个布局都有自己的页眉 页脚和类似页面应该共享的其他内容 这是我想出的代码
  • d3.js 使用极坐标绘制元素

    我是 d3 js 新手 不确定要使用哪个 d3 功能 我需要围绕原点 在圆圈中 同心放置一组元素 svg selectAll circle each function d3 select this attr cx r Math cos th
  • UCM Clearcase:一个项目与多个项目中的流层次结构

    我们有一个项目 即将向稳定的代码库添加一项新功能 除了缺陷修复之外 不会进行任何重大更改 该计划不是在一段时间内 可能一个月 单独开发新功能 进行中间构建和测试 当功能完成并且质量可以接受时 将新功能的代码合并到主分支中 问题是就 Clea
  • scanf 导致 C 中的无限循环

    我对 C 语言比较陌生 但我已经编程几年了 我正在为大学课程编写一个程序 我很困惑为什么下面的 scanf 函数没有被调用 导致无限循环 我尝试过将 scanf 放在函数之外 调用它两次 一次从内部 一次从外部 以及其他一些方式 我在网上读
  • BizTalk部署期间不需要通过控制台导入MIS时

    允许哪些 BizTalk 应用程序 编排 模式 映射更改不强制通过管理控制台导入 MSI 而只在 GAC 中安装 DLL 通过控制台强制导入以停止编排并终止实例 但在 GAC 中安装仅需要重新启动该应用程序的主机 因此 有时不停止生产环境中
  • 一个接一个地执行方法,执行之间有暂停

    新手 obj c 问题 我正在编写一个简单的 iPad 演示文稿 不适用于 Appstore 我的任务是实现几个相继执行的方法 并且它们之间几乎没有停顿 主要结构如下 查看负载 暂停两秒 然后执行method1 暂停两秒 然后执行metho
  • 检查多个列中的一个值

    我有一个包含这样的列的表 例如 id col1 col2 col3 col4 现在 我想检查一下是否ANY of col1 col2 col3 col4具有传递的值 要做到这一点 路还很长 SELECT FROM table WHERE c
  • 从购物车中删除运费计算

    如何从商店的购物车中删除运费计算 这是网站 tintinportintin com br 在 app design frontend base default checkout xml 的第 89 行 你会发现
  • CPU最大线程数

    这与处理器的线程有什么关系 例如 Intel i5 有四个核心和四个线程 我们的程序中可以使用多少个线程 例如在 C 中使用 std thread STL 8个线程对于一个程序来说是大还是小 这确实取决于 根据经验 将线程数量限制为接近核心
  • Hyperledger Composer:错误:无法请求身份。尝试注册用户并返回证书时出错

    我正在关注一个hyperledger composer tutorial 我无法在执行命令时执行步骤 15 composer identity request c PeerAdmin byfn network org1 only u adm
  • 为什么 stat_密度 (R; ggplot2) 和 gaussian_kde (Python; scipy) 不同?

    我正在尝试对一系列可能不是正态分布的分布生成基于 KDE 的 PDF 估计 我喜欢 R 中 ggplot 的 stat 密度 似乎可以识别频率中的每个增量波动 但无法通过 Python 的 scipy stats gaussian kde