首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用`loess.smooth`时出错,但不使用“`loess`”或“`lowess`”

使用`loess.smooth`时出错,但不使用“`loess`”或“`lowess`”
EN

Stack Overflow用户
提问于 2011-01-10 10:20:02
回答 2查看 6.2K关注 0票数 7

我需要平滑一些模拟数据,但偶尔遇到问题时,模拟纵坐标平滑大部分是相同的值。下面是一个最简单的例子,可以重复使用。

代码语言:javascript
复制
> 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.smoothloess使用的是相同的估计函数,但前者是处理评价点的“辅助函数”。错误似乎来自于一个C函数:

代码语言:javascript
复制
> 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.

  • Find
  1. 理解为什么只有loess.smooth (而不是其他函数)会产生这个错误,并为这个loess.smooth找到一个解决方案--使用loess,但仍然在与向量x不同的指定点数上计算估计值。例如,我可能希望在平滑过程中只使用x <- seq(0,50,10),但在x <- 0:50上评估估计值。据我所知,使用带有新数据框架的predict不能很好地处理这种情况,但是如果我遗漏了什么,请告诉我。
  2. 以不阻止程序移动到下一个模拟数据集的方式处理错误。

提前感谢您在这个问题上的任何帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-10 10:44:47

用于第1部分:--这需要一些跟踪,但是如果您这样做的话:

loess.smooth(x, y, family = "guassian")

这个模型会合适的。这是由于loess.smoothloess的缺省值不同而产生的;前者有family = c("symmetric", "gaussian"),而后者则相反。如果您搜索loessloess.smooth的代码,当family = "gaussian" iterations设置为1时,您将看到这一点。否则,它将获得值loess.control()$iterations。如果您在simpleLoess中进行迭代,下面的函数调用将返回一个NaN向量

代码语言:javascript
复制
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

这将导致下一个函数调用抛出您看到的错误:

代码语言:javascript
复制
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部分的

代码语言:javascript
复制
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)))

这意味着:

代码语言:javascript
复制
> 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中的错误,将允许计算继续进行。

您需要通过包含类似于(如果在循环中这样做的话)来处理trytryCatch的输出:

代码语言:javascript
复制
mod <- try(loess.smooth(x, y))
if(inherits(mod, "try-error"))
    next
## if here, model work, do something with `mod`

我可能会将trytryCatch与通过loess进行拟合结合起来,并在这样的问题上使用predict

票数 8
EN

Stack Overflow用户

发布于 2011-01-10 10:36:32

这是我第一次遇到这些函数,所以我不能帮你那么多,但这与y-值的方差为0有关系吗?现在,您尝试从已经非常平滑的数据中估计出一条平滑的行,这是可行的:

代码语言:javascript
复制
x <- 0:50
y <- c(rep(0,25),rep(1,26))
loess.smooth(x,y)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4645682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档