gpt4 book ai didi

r - 使用 `loess.smooth` 但不是 `loess` 或 `lowess` 时出错

转载 作者:行者123 更新时间:2023-12-04 11:44:10 25 4
gpt4 key购买 nike

我需要平滑一些模拟数据,但是当要平滑的模拟纵坐标大多是相同的值时,偶尔会遇到问题。这是最简单情况的一个可重现的小示例。

> 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 函数:
> 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运行没有错误,但我需要程序在最极端的情况下运行。

希望有人可以在以下一项和/或所有方面帮助我:
  • 明白为什么只有loess.smooth ,而不是其他函数,会产生此错误并找到此问题的解决方案。
  • 使用 loess 找到解决方法但仍在评估可能与向量 x 不同的指定数量的点的估计。例如,我可能只想使用 x <- seq(0,50,10)在平滑中,但在 x <- 0:50 处评估估计值.据我所知,使用 predict使用新的数据框将无法正确处理这种情况,但如果我在那里遗漏了什么,请告诉我。
  • 以不会阻止程序移动到下一个模拟数据集的方式处理错误。

  • 在此先感谢您对这个问题的任何帮助。

    最佳答案

    第 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))

    这一切都与 Loess 中的稳健拟合(方法)有关。如果您不想要/不需要坚固的贴合,请使用 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 拟合函数( loess.smooth 说),如果 loess.smooth 中出现错误,这将允许计算继续遇到了。

    您将需要处理 try 的输出或 tryCatch通过包含类似的内容(如果您在循环中执行此操作:
    mod <- try(loess.smooth(x, y))
    if(inherits(mod, "try-error"))
    next
    ## if here, model work, do something with `mod`

    我可能会结合 trytryCatch带配件通过 loess并使用 predict对于这样的问题。

    关于r - 使用 `loess.smooth` 但不是 `loess` 或 `lowess` 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4645682/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com