r-‘smooth.spline’:spar查找:非有限值inf;使用BIG值



我有一个数据集:

dat <- structure(list(date = structure(c(18830, 18835, 18837, 18841, 
18843, 18844, 18848, 18850, 18852, 18856, 18858, 18863, 18865, 
18870, 18873, 18879, 18884, 18887, 18890, 18892, 18894, 18898, 
18899, 18901, 18904, 18905, 18906, 18908, 18915, 18920, 18922, 
18927, 18929, 18935, 18940, 18946, 18949, 18954, 18956, 18960, 
18963, 18975, 18978, 18982, 18985, 18989, 18990), class = "Date"), 
value = c(254183, 254552, 254702, 254792, 254840, 254860, 
254953, 254994, 255043, 255134, 255198, 255310, 255354, 255473, 
255543, 255677, 255900, 256162, 256338, 256451, 256570, 256812, 
256866, 256991, 257164, 257226, 257280, 257398, 257812, 258114, 
258232, 258528, 258680, 259110, 259401, 259754, 259930, 260219, 
260328, 260575, 260748, 261454, 261630, 261863, 262036, 262266, 
262330)), row.names = c(22L, 27L, 29L, 33L, 35L, 36L, 40L, 
42L, 44L, 48L, 50L, 55L, 57L, 62L, 65L, 71L, 76L, 79L, 82L, 84L, 
86L, 90L, 91L, 93L, 96L, 97L, 98L, 100L, 107L, 112L, 114L, 119L, 
121L, 127L, 132L, 138L, 141L, 146L, 148L, 152L, 155L, 167L, 170L, 
174L, 177L, 181L, 182L), class = "data.frame")

执行时:

smooth.spline(dat$date, dat$value, cv = TRUE)

我两次看到以下红色信息:

spar查找:非有限值inf;使用BIG值

这不是一个错误,因为我得到了预期的输出。我的猜测是,这是某种信息。有人知道这意味着什么和/或是什么原因导致的吗?

我可以抑制它吗?我不希望我的代码用户看到实际上不重要的红色消息时惊慌失措。

这是一个FORTRAN级别的消息,不能被suppressMessagessuppressWarnings抑制。但无论如何,这既不是警告,也不是错误。它只是报告了Inf在计算过程中有界于一些BIG值。这纯粹是为了";"安全";。

那么,为什么会发生这种情况呢?我的猜测如下。老实说,smooth.spline使用的FORTRAN程序有点过时了。它是在20世纪80年代末或90年代初使用单精度浮点数开发的。这限制了数值计算的准确性,并且存在上溢或下溢的危险。因此,该代码做了许多巧妙的技巧来稳定计算。显然,如果一个数字超出了单精度所能提供的范围,则应该将其截断为可表示的最大值。

我已经使用smooth.spline很多年了,直到你提出问题,我才看到这条消息。事实上,如果我更改你的代码

dat <- na.omit(dat)
smooth.spline(dat$date, dat$value, cv = TRUE)

dat <- na.omit(dat)
smooth.spline(dat$date, dat$value)

也就是说,如果我使用广义交叉验证(GCV(,消息就消失了。

请注意,对于平滑样条曲线,GCV在理论上优于原始CV。这就是为什么cv = FALSEsmooth.spline的默认值。我建议你坚持GCV。

最新更新