gpt4 book ai didi

r - 在 R : Computation failed in `stat_density2d()` : bandwidths must be strictly positive 中使用 geom_密度_2d() 时出错

转载 作者:行者123 更新时间:2023-12-02 07:40:32 25 4
gpt4 key购买 nike

在尝试使用 ggplot2 制作测试二维密度图时,我使用了代码片段:

ggplot(df, aes(x = S1.x, y = S1.y)) + geom_point() + geom_density_2d()

我收到错误:“stat_密度2d()计算失败:带宽必须严格为正”

我的数据框如下所示:

> df

transcriptID S1.x S1.y S2.x S2.y
DQ459412 0.000000 0.000000 0.000000 0.000000
DQ459413 1.584963 2.358379 4.392317 3.085722
DQ459415 0.000000 0.000000 0.000000 0.000000
DQ459418 0.000000 0.000000 0.000000 0.000000
DQ459419 0.000000 0.000000 4.000000 2.891544
DQ459420 0.000000 0.000000 0.000000 0.000000

此外,var(df[,"S1.x"]) > 0var(df[,"S1.y"]) > 0

Fig 1 - 2d density plot with error

但是,我通过运行得到了没有错误的密度图:

ggplot(df, aes(x = S2.x, y = S2.y)) + geom_point() + geom_density_2d()

Fig 2 - density plot without error

如何解决图 1 中的错误?

最佳答案

所以真正的问题是 S1.xS1.y 值在其列中只有一个非零值。事实证明,geom_密度_2d 无法真正仅用一两个值来估计密度。但请继续阅读...

更新:

这个问题之前已经被问过,答案通常是您的数据列需要有非零方差。 但是你确实有非零方差,那么为什么它不起作用呢?

  • 查看 geom_密度_2d 的内部结构,我们发现它使用 MASS::kde2d 包函数来计算分布。
  • 查看 kde2d,我们发现它使用 MASS::bandwidth.nrd(df$x) 来估计带宽。
  • 查看bandwidth.nrd的帮助(其中包含代码),我们发现它使用了一个经验法则,获取分布的分位数,并减去第一个分位数的第二个分位数以获得带宽估计。
  • 对原始数据进行分位数,我们发现数据的分位数为零。
  • 使用 bandwidth.nrd 估计的带宽对原始数据运行 MASS::kde2d 会产生相同的错误:
library(MASS)
nn <- c("DQ459412","DQ459413","DQ459415","DQ459418","DQ459419","DQ459420")
s1x <- c(0,1.584963,0,0,0,0)
s1y <- c(0,2.358379,0,0,0,0)
s2x <- c(0,4.392317,0,0,4,0)
s2y <- c(0,3.085722,0,0,2.891544,0)
df <- data.frame(transcriptID=nn,S1.x=s1x,S1.y=s1y,S2.x=s2x,S2.y=s2y)
> quantile(df$s1x)
0% 25% 50% 75% 100%
0.000000 0.000000 0.000000 0.000000 1.584963
> quantile(df$s1y)
0% 25% 50% 75% 100%
0.000000 0.000000 0.000000 0.000000 2.358379
h <- c(MASS::bandwidth.nrd(df$x), MASS::bandwidth.nrd(df$y))
dens <- MASS::kde2d(df$s1x, df$s1y, h = h, n = n, lims = c(0,1,0,1))

Error in MASS::kde2d(df$s1x, df$s1y, h = h, n = n, lims = c(0, 1, 0, 1)) : bandwidths must be strictly positive

因此,使用 geom_密度_2D 的真正标准是 x 数据和 y 数据的第一分位数和第二分位数之间都需要有非零间隙。

现在要修复它,如果我做一个小的修改 - 将其中一个零替换为 0.1,如下所示:

nn <- c("DQ459412","DQ459413","DQ459415","DQ459418","DQ459419","DQ459420")
s1x <- c(0,1.584963,0,0,0.1,0)
s1y <- c(0,2.358379,0,0,0.1,0)
s2x <- c(0,4.392317,0,0,4,0)
s2y <- c(0,3.085722,0,0,2.891544,0)
df <- data.frame(transcriptID=nn,S1.x=s1x,S1.y=s1y,S2.x=s2x,S2.y=s2y)
print(df)

产量:

  transcriptID     S1.x     S1.y     S2.x     S2.y
1 DQ459412 0.000000 0.000000 0.000000 0.000000
2 DQ459413 1.584963 2.358379 4.392317 3.085722
3 DQ459415 0.000000 0.000000 0.000000 0.000000
4 DQ459418 0.000000 0.000000 0.000000 0.000000
5 DQ459419 0.100000 0.100000 4.000000 2.891544
6 DQ459420 0.000000 0.000000 0.000000 0.000000

然后我得到这个图而不是你的错误。

enter image description here您可以让 0.1 值接近零,最终它将无法再计算分布,并且您将再次收到错误。

处理这种情况的一种通用方法是向数据中添加非常少量的噪声,这有点模拟这样一个事实:任何基于连续分布的实际测量的有意义的计算都应该不受那少量噪声的影响。噪音。

希望有帮助。

关于r - 在 R : Computation failed in `stat_density2d()` : bandwidths must be strictly positive 中使用 geom_密度_2d() 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53075331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com