我正在尝试为我的数据绘制内核密度估计值,但我得到了一个错误(“带宽必须严格为正”),因为 0.25 和 0.75 分位数是相同的。这里MASS::kde2d
提出了一个解决方案,但我不确定如何为in编写一个类似的函数。h
stat_density_2d()
的解决方案kde2d
是:
kde2d(df$s1x, df$s1y,
h = c(ifelse(bandwidth.nrd(df$s1x) == 0, 0.1, bandwidth.nrd(df$s1x)),
ifelse(bandwidth.nrd(df$s1y) == 0, 0.1, bandwidth.nrd(df$s1y))))
因为我正在处理情节,所以我需要“h”来获取一个可以动态处理构面的函数,否则我会将静态值添加到“h”。
更新:我试过了
h = c(function(x) ifelse(bandwidth.nrd(x)==0,0.01,bandwidth.nrd(x)),
function(y) ifelse(bandwidth.nrd(y)==0,0.01,bandwidth.nrd(y)))
和
h= function(x) ifelse(x==c(0,0),c(0.01,0.01),x)
以及一些变化,但不知道到底发生了什么,我不确定如何编写函数。
这是我生成的一些数据,可能会有所帮助:
xx <- rbind(data.frame(x = c(rep(30.00000,40),rep(30.00000,10)+rnorm(10)),
y = c(rep(-90.00000,40),rep(-90.00000,10)+rnorm(10)),
grp = 'A'),
data.frame(x = c(rep(30.00000,50)+rnorm(50)),
y = c(rep(-90.00000,50)+rnorm(50)),
grp = 'B'))
ggplot()+
stat_density_2d(data = xx, aes(x,y, fill = ..level..), geom = 'polygon')+
facet_wrap(~grp)