seq.default中的错误(a,length = max(0,b - a - 1)):length必须是非负数

时间:2017-05-14 14:42:49

标签: r

我尝试运行下面的代码。

set.seed(307)

y<- rnorm(200)

h2=0.3773427

t=seq(-3.317670,  2.963407, length.out=500)

fit=density(y, bw=h2, n=1024, kernel="epanechnikov")

integrate.xy(fit$x, fit$y, min(fit$x), t[407])

但是,我收到了以下消息:

"Error in seq.default(a, length = max(0, b - a - 1)) : 
  length must be non-negative number"

我不确定是什么问题。

当我使用t[406]t[408]时,我没有遇到任何问题:

integrate.xy(fit$x, fit$y, min(fit$x), t[406])

integrate.xy(fit$x, fit$y, min(fit$x), t[408])

有谁知道问题是什么以及如何解决?请欣赏你的帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

我浏览了integrate.xy函数的源代码,似乎存在与xtol参数的使用有关的错误。

供参考,以下是integrate.xy功能的源代码:

function (x, fx, a, b, use.spline = TRUE, xtol = 2e-08) 
{
  dig <- round(-log10(xtol))
  f.match <- function(x, table) match(signif(x, dig), signif(table, 
                                                             dig))
  if (is.list(x)) {
    fx <- x$y
    x <- x$x
    if (length(x) == 0) 
      stop("list 'x' has no valid $x component")
  }
  if ((n <- length(x)) != length(fx)) 
    stop("'fx' must have same length as 'x'")
  if (is.unsorted(x)) {
    i <- sort.list(x)
    x <- x[i]
    fx <- fx[i]
  }
  if (any(i <- duplicated(x))) {
    n <- length(x <- x[!i])
    fx <- fx[!i]
  }
  if (any(diff(x) == 0)) 
    stop("bug in 'duplicated()' killed me: have still multiple x[]!")
  if (missing(a)) 
    a <- x[1]
  else if (any(a < x[1])) 
    stop("'a' must NOT be smaller than min(x)")
  if (missing(b)) 
    b <- x[n]
  else if (any(b > x[n])) 
    stop("'b' must NOT be larger  than max(x)")
  if (length(a) != 1 && length(b) != 1 && length(a) != length(b)) 
    stop("'a' and 'b' must have length 1 or same length !")
  else {
    k <- max(length(a), length(b))
    if (any(b < a)) 
      stop("'b' must be elementwise >= 'a'")
  }
  if (use.spline) {
    xy <- spline(x, fx, n = max(1024, 3 * n))
    if (xy$x[length(xy$x)] < x[n]) {
      if (TRUE) 
        cat("working around spline(.) BUG --- hmm, really?\n\n")
      xy$x <- c(xy$x, x[n])
      xy$y <- c(xy$y, fx[n])
    }
    x <- xy$x
    fx <- xy$y
    n <- length(x)
  }
  ab <- unique(c(a, b))
  xtol <- xtol * max(b - a)
  BB <- abs(outer(x, ab, "-")) < xtol
  if (any(j <- 0 == apply(BB, 2, sum))) {
    y <- approx(x, fx, xout = ab[j])$y
    x <- c(ab[j], x)
    i <- sort.list(x)
    x <- x[i]
    fx <- c(y, fx)[i]
    n <- length(x)
  }
  ai <- rep(f.match(a, x), length = k)
  bi <- rep(f.match(b, x), length = k)
  dfx <- fx[-c(1, n)] * diff(x, lag = 2)
  r <- numeric(k)
  for (i in 1:k) {
    a <- ai[i]
    b <- bi[i]
    r[i] <- (x[a + 1] - x[a]) * fx[a] + (x[b] - x[b - 1]) * 
      fx[b] + sum(dfx[seq(a, length = max(0, b - a - 1))])
  }
  r/2
}

xtol参数赋予的值正在行xtol <- xtol * max(b - a)中被覆盖。但是dig变量的值是根据函数输入中给出的xtol的原始值计算的。由于这种不匹配,行f.match中的bi <- rep(f.match(b, x), length = k)函数不会返回x和b之间的匹配(即NA)。这会导致您遇到的错误。

至少对于相关案例,一个简单的解决方法是删除xtol <- xtol * max(b - a)行。但是,您应该向此软件包的维护者提交错误报告,以进行更严格的修复。