我需要平滑一些模拟数据,但偶尔遇到问题时,模拟纵坐标平滑大部分是相同的值。下面是一个最简单的例子,可以重复使用。
> x <- 0:50
> y <- rep(0,51)
> loess.smooth(x,y)
Error in simpleLoess(y, x, w, span, degree, FALSE, FALSE, normalize = FALSE, :
NA/NaN/Inf in foreign function call (arg 1)loess(y~x)、lowess(x,y)及其在MATLAB中的模拟结果在此示例中无误差地产生预期结果。我在这里使用loess.smooth,因为我需要在一定数量的点上评估估计值。根据文献资料,我认为loess.smooth和loess使用的是相同的估计函数,但前者是处理评价点的“辅助函数”。错误似乎来自于一个C函数:
> traceback()
3: .C(R_loess_raw, as.double(pseudovalues), as.double(x), as.double(weights),
as.double(weights), as.integer(D), as.integer(N), as.double(span),
as.integer(degree), as.integer(nonparametric), as.integer(order.drop.sqr),
as.integer(sum.drop.sqr), as.double(span * cell), as.character(surf.stat),
temp = double(N), parameter = integer(7), a = integer(max.kd),
xi = double(max.kd), vert = double(2 * D), vval = double((D +
1) * max.kd), diagonal = double(N), trL = double(1),
delta1 = double(1), delta2 = double(1), as.integer(0L))
2: simpleLoess(y, x, w, span, degree, FALSE, FALSE, normalize = FALSE,
"none", "interpolate", control$cell, iterations, control$trace.hat)
1: loess.smooth(x, y)loess也调用simpleLoess,但使用的是不同的参数。当然,如果对y值的变化足够大,使其为非零,则loess.smooth运行时不会出错,但即使在最极端的情况下,我也需要运行该程序。
希望有人能帮我做一件和/或下列所有事情:
problem.
loess.smooth (而不是其他函数)会产生这个错误,并为这个loess.smooth找到一个解决方案--使用loess,但仍然在与向量x不同的指定点数上计算估计值。例如,我可能希望在平滑过程中只使用x <- seq(0,50,10),但在x <- 0:50上评估估计值。据我所知,使用带有新数据框架的predict不能很好地处理这种情况,但是如果我遗漏了什么,请告诉我。提前感谢您在这个问题上的任何帮助。
发布于 2011-01-10 10:44:47
用于第1部分:--这需要一些跟踪,但是如果您这样做的话:
loess.smooth(x, y, family = "guassian")
这个模型会合适的。这是由于loess.smooth和loess的缺省值不同而产生的;前者有family = c("symmetric", "gaussian"),而后者则相反。如果您搜索loess和loess.smooth的代码,当family = "gaussian" iterations设置为1时,您将看到这一点。否则,它将获得值loess.control()$iterations。如果您在simpleLoess中进行迭代,下面的函数调用将返回一个NaN向量
pseudovalues <- .Fortran(R_lowesp, as.integer(N), as.double(y),
as.double(z$fitted.values), as.double(weights), as.double(robust),
integer(N), pseudovalues = double(N))$pseudovalues这将导致下一个函数调用抛出您看到的错误:
zz <- .C(R_loess_raw, as.double(pseudovalues), as.double(x),
as.double(weights), as.double(weights), as.integer(D),
as.integer(N), as.double(span), as.integer(degree),
as.integer(nonparametric), as.integer(order.drop.sqr),
as.integer(sum.drop.sqr), as.double(span * cell),
as.character(surf.stat), temp = double(N), parameter = integer(7),
a = integer(max.kd), xi = double(max.kd), vert = double(2 *
D), vval = double((D + 1) * max.kd), diagonal = double(N),
trL = double(1), delta1 = double(1), delta2 = double(1),
as.integer(0L))这一切都与黄土的稳健拟合(方法)有关。如果您不希望/需要健壮的fit,请在您的family = "gaussian"调用中使用loess.smooth。
另外,请注意,loess.smooth的默认值与loess的默认值不同,例如'span'和'degree'。因此,请仔细检查您想要安装的模型,并调整相关函数的默认值。
第2部分的:
DF <- data.frame(x = 0:50, y = rep(0,51))
mod <- loess(y ~ x, data = DF)
pred <- predict(mod, newdata = data.frame(x = c(-1, 10, 15, 55)))
mod2 <- loess(y ~ x, data = DF, control = loess.control(surface = "direct"))
pred2 <- predict(mod2, newdata = data.frame(x = c(-1, 10, 15, 55)))这意味着:
> pred
1 2 3 4
NA 0 0 NA
> pred2
1 2 3 4
0 0 0 0如果这是你的意思,默认情况下不会推断。事实上,我不认为在这里使用predict有什么问题。
用于第3部分:查看?try和?tryCatch,它们可以封装在黄土拟合函数(loess.smooth say)周围,如果遇到loess.smooth中的错误,将允许计算继续进行。
您需要通过包含类似于(如果在循环中这样做的话)来处理try或tryCatch的输出:
mod <- try(loess.smooth(x, y))
if(inherits(mod, "try-error"))
next
## if here, model work, do something with `mod`我可能会将try或tryCatch与通过loess进行拟合结合起来,并在这样的问题上使用predict。
发布于 2011-01-10 10:36:32
这是我第一次遇到这些函数,所以我不能帮你那么多,但这与y-值的方差为0有关系吗?现在,您尝试从已经非常平滑的数据中估计出一条平滑的行,这是可行的:
x <- 0:50
y <- c(rep(0,25),rep(1,26))
loess.smooth(x,y)https://stackoverflow.com/questions/4645682
复制相似问题