更改R中的density()参数“调整”会导致密度曲线下的面积明显大于1

时间:2018-10-31 20:35:54

标签: r

density() Documentation

trapz() Documentation

我的理解是,根据定义,密度曲线下的面积为1,否则实际上不是密度。

我正在编写代码以创建具有某些约束的GMM(高斯混合模型),并想将输出与密度模型进行比较。我正在处理包含很多组件的数据,其中一些组件的标准偏差非常窄。 density()函数的默认值看起来有些超出我的经验数据的密度,因此我决定降低带宽。 density()包含一个参数“ adjust”,文档中指出该参数是density()中内核带宽的系数。我将该值降至0.1,然后继续构建我的建模代码。当需要测试模型时,看起来好像没有达到数据的峰值。在查找代码中的错误(经过数小时的检查和修复后,没有明显的错误)并重写算法并获得相同的结果之后,我测试了生成的模型曲线下的区域。它是1,但在视觉上远低于density(x = x, adjust = 0.1)生成的曲线。因此,我决定测试density()输出曲线下的面积。我的数据为6.28。我对此感到非常惊讶-我立即忽略了density()函数的AUC不是1的想法。

这种效果在我的计算机上以简单的混合物复制。首先,示例显示样本参数的AUC为〜1,调整参数为1。

require(stats)
require(pracma)
set.seed(1)
gaussianMix <- c(rnorm(n = 5000, 
                       mean = -50, 
                       sd = 50), 
                 rnorm(n = 100000, 
                       mean = 0, 
                       sd = 10),
                 rnorm(n = 10000,
                       mean = 50,
                       sd = 100)
                 )

mixtureDensity <- density(x = gaussianMix,
                          adjust = 1)

plot(mixtureDensity)

area <- trapz(mixtureDensity$x,
              mixtureDensity$y)
area

1.001025

现在使用,并将参数调整为0.1

require(stats)
require(pracma)
set.seed(1)
gaussianMix <- c(rnorm(n = 5000, 
                       mean = -50, 
                       sd = 50), 
                 rnorm(n = 100000, 
                       mean = 0, 
                       sd = 10),
                 rnorm(n = 10000,
                       mean = 50,
                       sd = 100)
                 )

mixtureDensity <- density(x = gaussianMix,
                          adjust = 0.1)

plot(mixtureDensity)

area <- trapz(mixtureDensity$x,
              mixtureDensity$y)
area

5.655676

我缺少明显的东西吗?为什么带宽调整系数导致AUC远大于1?通过将density()$ y的输出除以曲线下的计算面积来解决这个问题很容易,但是意识到我正在查看AUC大于5的“密度”曲线感到非常震惊。

1 个答案:

答案 0 :(得分:2)

您正在丢失某些内容,尽管可能并不明显。看一下密度图:它非常成角度,根本不光滑。您没有足够的时间对其进行评估。如果将n = 16384添加到density()调用中,则将以32倍的点数对其进行评估,而面积估算值将接近1。

mixtureDensity <- density(x = gaussianMix,
                          adjust = 0.1, n = 16384)

trapz(mixtureDensity$x, mixtureDensity$y)

# [1] 1.00003

编辑添加:我以为这是导致故障的集成错误,但实际上似乎不止于此。在这里,我叠加了3个密度估计值,分别为n = 512(默认为黑色),n = 1024(蓝色)和n = 16384(红色):

enter image description here

更大的n值会复制红色的值。因此,实际上看起来密度估计是错误的,不仅仅是离散化。