我正在尝试获取 [0, 1] (比例)范围内的值的核密度估计,并获取该密度估计中特定分位数出现位置的值。 R 包 scdens 有一个同名的函数,看起来它应该做我想要的事情。然而,虽然设置下限可以按预期工作,但设置上限却不能。
以下代码使用示例数据集重现了我的问题。
# Required package
library(scdensity)
# Sample data
x <- c(0.01, 0.3, 0.5, 0.99)
此代码块演示了参数
constraint = "boundedLeft"
和 opts = list(lowerBound = 0)
产生 x < 0. 的密度估计为 0 的预期结果
# Lower bound
dens1 <- scdensity(x,
constraint = c("boundedLeft"),
opts = list(lowerBound = 0))
plot(dens1)
#> Warning in regularize.values(x, y, ties, missing(ties), na.rm = na.rm):
#> collapsing to unique 'x' values
此块演示了
constraint = "boundedRight"
和 opts = list(upperBound = 1)
导致 x > 0 的非零密度估计,这似乎与参数中指定的内容不一致。
# Upper bound
dens2 <- scdensity(x,
constraint = c("boundedRight"),
opts = list(upperBound = 1))
plot(dens2)
此块演示了当指定上限和下限时,只有下限似乎可以按预期工作。
# Lower & upper bounds
dens3 <- scdensity(x,
constraint = c("boundedLeft", "boundedRight"),
opts = list(lowerBound = 0, upperBound = 1))
plot(dens3)
#> Warning in regularize.values(x, y, ties, missing(ties), na.rm = na.rm):
#> collapsing to unique 'x' values
创建于 2024-08-19,使用 reprex v2.1.0
scdensity
作者在这里。 感谢您让我注意到这一点! 确实有一个bug。如果您需要修复它以便立即使用,请按照以下方式修改源代码:在 weightedKDE.R
中,从第 420 行开始,出现以下代码:
if ("boundedRight" %in% P$constraints) {
gR <- P$g[P$g >= P$upperBound]
if (!symmetric) {
AshapeNew <- NormalGridFcn(gR, 0, P$y, P$h)
} else {
if (P$upperBound < P$PoS) {
stop("The upper bound cannot be less than the point of symmetry.")
}
if ("boundedLeft" %in% P$constraints) {
if (!isTRUE(all.equal(P$lowerBound + P$upperBound, 2*P$PoS))) {
stop("Lower and upper bounds must be equidistant from the point of symmetry.")
}
} else {
AshapeNew <- NormalGridFcn(gR, 0, yL, P$h) + NormalGridFcn(gR, 0, yR, P$h)
P$Ashape <- rbind(P$Ashape, -AshapeNew) # <-- PROBLEM
P$bshape <- c(P$bshape, rep(-P$boundTol, dim(AshapeNew)[1])) # <-- PROBLEM
}
}
# *** PROBLEM lines should go here ***
}
标有
PROBLEM
的两行位置错误;它们应该被移出 else
块。
由于约束的可能组合很多,所以代码有很多分支逻辑;这些行最终出现在错误的位置。 不知道它在开发过程中是如何逃过我的注意的!
我会尽快通过 CRAN 获取更新。
顺便说一句,您可能已经很清楚了,但是
scdensity
只会产生两边都为零的估计,因为它使用的是高斯 KDE。 因此,如果您的比例的真实分布在 0 和 1 附近不可忽略,您将需要尝试不同的方法。