R?中非负变量密度图的好方法


36
plot(density(rexp(100))

显然,左侧所有的密度都表示偏差。

我希望总结一些非统计人员的数据,并且我想避免有关为何非负数据的密度在零左边的问题。这些图用于随机检查;我想按治疗组和对照组显示变量的分布。分布通常是指数级的。由于各种原因,直方图比较棘手。

快速的Google搜索使统计人员可以在非负内核上进行工作,例如: this

但是,它有没有在R中实现?在已实现的方法中,对于描述性统计,它们中的任何一种是否“最佳”?

编辑:即使from命令可以解决我当前的问题,也很高兴知道是否有人基于非负密度估计的文献实现了内核


3
这不是您要问的问题,但是我不会将内核密度估算应用于应该是指数的事物,尤其是向非统计受众进行演示时。我将使用分位数-分位数图,并说明如果分布是指数分布,则该图应为直线。
Nick Cox

6
plot(density(rexp(100), from=0))
斯特凡纳·洛朗

4
有时我做得相当成功的一件事是在日志上得到一个kde,然后转换密度估计值(不要忘记雅可比行列式)。另一种可能性是使用对数样条线密度估计设置,以便它知道边界。
Glen_b


1
我在stata-journal.com/sjpdf.html?articlenum=gr0003中讨论了@Glen_b提到的转换方法(请参阅第76-78页)。通过使用log(x + 1)而不是log并修改Jacobian可以容纳零。
Nick Cox

Answers:


21

从空间统计的边缘加权方法中借鉴的一种解决方案是将左侧的密度截断为零,但对最接近零的数据进行加权。这个想法是,每个值都“散布”到以为单位的单位总面积的内核中。删除内核中可能溢出到负区域的任何部分,并将内核重新规范化为单位面积。XXX

例如,使用高斯核,重归一化权重为ķHÿX=经验值-1个2ÿ-X/H2/2π

wX=1个/0ķÿXdÿ=1个1个-ΦXH0

其中是均值和标准差的正态变量的累积分布函数。可比较的公式可用于其他内核。X ħΦXH

这比尝试将带宽缩小到接近更简单,并且计算速度更快。无论如何,很难确切规定应如何将带宽更改为接近。但是,该方法也是临时的:在附近仍然会有一些偏差。它似乎比默认的密度估计更好。这是使用较大数据集的比较:0 0000

数字

蓝色显示默认浓度,红色显示针对边缘调整的浓度。真实的基础分布跟踪为虚线以供参考。0


R代码

中的density函数R会抱怨权重之和不是统一的,因为它希望所有实数的积分都是统一的,而这种方法会使正数的积分等于统一。作为检验,将后者积分估计为黎曼和。

set.seed(17)
x <- rexp(1000)
#
# Compute a bandwidth.
#
h <- density(x, kernel="gaussian")$bw # $
#
# Compute edge weights.
#
w <- 1 / pnorm(0, mean=x, sd=h, lower.tail=FALSE)
#
# The truncated weighted density is what we want.
#
d <- density(x, bw=h, kernel="gaussian", weights=w / length(x))
d$y[d$x < 0] <- 0
#
# Check: the integral ought to be close to 1:
#
sum(d$y * diff(d$x)[1])
#
# Plot the two density estimates.
#
par(mfrow=c(1,1))
plot(d, type="n", main="Default and truncated densities", xlim=c(-1, 5))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)

21

一种替代方法是Kooperberg及其同事的方法,该方法基于使用样条曲线估算密度的方法,以近似数据的对数密度。我将展示一个使用@whuber答案中数据的示例,该示例将允许对方法进行比较。

set.seed(17)
x <- rexp(1000)

您需要为此安装logspline软件包。如果不是,请安装:

install.packages("logspline")

使用以下logspline()功能加载包装并估算密度:

require("logspline")
m <- logspline(x)

在下面,我假设d工作区中存在来自@whuber答案的对象。

plot(d, type="n", main="Default, truncated, and logspline densities", 
     xlim=c(-1, 5), ylim = c(0, 1))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
plot(m, add = TRUE, col = "red", lwd = 3, xlim = c(-0.001, max(x)))
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)

结果图如下所示,对数线密度由红线显示

默认,截断和对数线密度

另外,可以通过参数lbound和来指定对密度的支持ubound。如果我们希望假设密度在0的左侧为0,并且在0处存在不连续性,则可以lbound = 0在调用中使用logspline(),例如

m2 <- logspline(x, lbound = 0)

得出以下密度估计值(此处显示为原始对数m线拟合,因为前一个图已经很忙)。

plot.new()
plot.window(xlim = c(-1, max(x)), ylim = c(0, 1.2))
title(main = "Logspline densities with & without a lower bound",
      ylab = "Density", xlab = "x")
plot(m,  col = "red",  xlim = c(0, max(x)), lwd = 3, add = TRUE)
plot(m2, col = "blue", xlim = c(0, max(x)), lwd = 2, add = TRUE)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)
axis(1)
axis(2)
box()

结果图如下所示

有和没有支撑下限的对数密度估计值的比较

xX=0x


1
01个

@whuber好问题。我最近才碰到这种方法。我怀疑这里要问的一个好问题是,由于截断法和对数线法只是对真实密度的估计,因此统计上拟合的差异是否显着?不过,我不确定到底为什么它在零时表现出色。我也很想知道为什么。
恢复莫妮卡-G.辛普森

@GavinSimpson,谢谢你的回答。您可以使用最新版本的来重绘最后的情节logspline吗?对我来说,有界和无界版本的密度都在处为零x = 0
cel 2014年

4

要按组比较分布(您说的其中一项目标是目标),为什么不更简单一些?如果N大,则平行箱形图可以很好地工作;如果N很小,则平行带状图将起作用(并且两个都很好地显示了异常值,这在您的数据中是有问题的)。


1
是的,谢谢,那行得通。但是我喜欢密度图。它们显示的数据比框线图更多。我想似乎还没有实施任何措施,我感到很惊讶。也许我有一天会自己实现其中一项。人们可能会发现它很有用。
generic_user

1
我也喜欢密度图。但您必须考虑您的听众。
彼得·弗洛姆

1
必须在这一方面与@PeterFlom达成共识。如果您的听众没有统计学知识,也不要太复杂。您也可以进行比较/平行箱形绘图,并在顶部叠加蝴蝶图。这样,箱形图摘要以及所有数据都可见。
doug.numbers

不同的人对汇总地块的理解不同的建议当然是正确的。尽管了解了密度图是什么(并且了解它不是概率),但我不了解什么是“平行箱线图”。它建议使用平行坐标图,但我怀疑这是不正确的。
DWin

2

可以使用Stéphane注释from = 0,此外,还可以使用rug (x)


4
如果我错了,请纠正我,但from=0看起来好像只是抑制了低于0的值的绘制;它不正确的计算的事实,一些分布已涂抹在0以下
尼克·考克斯

1
那是正确的。使用该from命令将产生一个图,看起来它的峰值恰好为零。但是,如果您查看带有不断减小的bin的直方图,则很多数据将显示AT峰值为零。这from只是一个图形技巧。
generic_user

@NickCox我不确定,但我不认为可以from=0抑制任何事情。它只是从零开始“网格”。
斯特凡·洛朗

区别在于,对于负值,估计的密度是否为非零,而不是是否绘制了密度。如果研究人员只想可视化,他们可能会决定不担心这一点。
尼克·考克斯

@NickCox命令density(rexp(100), from=0)无关与图形
斯特凡纳·洛朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.