我需要平滑一些模拟数据,但是当要平滑的模拟坐标大多是相同的值时,偶尔会遇到问题。这是最简单情况的一个可重复的小示例。
> 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
则运行不会出错,但我需要程序在最极端的情况下运行。
希望有人可以帮助我完成以下一项和/或全部工作:
- 了解为什么只有
loess.smooth
而不是其他函数会产生此错误并找到解决此问题的方法。 - 找到一种解决方法,使用
loess
但仍评估与向量 x 不同的指定点数的估计值。例如,我可能只想x <- seq(0,50,10)
在平滑中使用,但在 处评估估计x <- 0:50
。据我所知,使用predict
新的数据框无法正确处理这种情况,但如果我在那里遗漏了什么,请告诉我。 - 以不会阻止程序移动到下一个模拟数据集的方式处理错误。
在此先感谢您对此问题的任何帮助。