我尝试运行下面的代码。
library(sfsmisc)
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])
但是,我收到以下消息:
“seq.default中的错误(a,长度=最大值(0,b - a - 1)): 长度必须是非负数“。
我不确定是什么问题。
当我使用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])
有谁知道问题是什么以及如何解决?感谢您的帮助,谢谢!
答案 0 :(得分:1)
错误消息的信息量不大,但如果查看integrate.xy(x,fx,a,b)
函数的代码,则可以看到当插值分布中找不到b
的匹配项时会出现此错误。 x,给定公差因子。由于未指定容差因子,因此使用默认值xtol=2e-08
。
使用xtol
,integrate.xy
函数定义dig
参数,该参数等于dig=round(-log10(xtol))
。此参数用于定义将参数b
与x的插值分布匹配时要考虑的小数点后的位数。
如果您更改xtol
,则可以看到该函数仅返回xtol~<3.16228e-7
值的错误消息,对应于dig
值为6和dig
之间的阈值值为7.这意味着当在小数点后面取6位数时,你会在x的插值分布中找到b
的匹配,但是当你取7时,则不会。
您可以通过将xtol
参数更改为值3.16228e-7或更高来解决您的问题。
integrate.xy(fit$x, fit$y, min(fit$x), t[407],xtol=3.16228e-7)
[1] 0.9565527
答案 1 :(得分:1)
感谢您的建议。我尝试了该方法,并且不再使用set.seed(307)查看上述模拟的错误。但是,当我尝试运行以下代码时仍会出现错误:
for (i in 1:2000) {
print(i)
set.seed(i)
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],xtol=3.16228e-7)
}
当我使用xtol = 4.16228e-6时会发生同样的情况。
有没有办法解决这个问题,以免我遇到这个问题?