为什么在这段代码中 sc密度不能与boundedRight一起使用?

问题描述 投票:0回答:1

我正在尝试获取 [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

r kernel-density
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 附近不可忽略,您将需要尝试不同的方法。

© www.soinside.com 2019 - 2024. All rights reserved.