smooth.spline出现spar-finding提示的含义、成因及抑制方法
关于
smooth.spline提示信息的解析与处理 问题重现
数据集:
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-finding: non-finite value inf; using BIG value
提示信息的含义
这是smooth.spline在自动寻找平滑参数spar过程中产生的提示而非错误:
- 程序内部计算时出现了无穷大(
inf)的非有限值 - 遇到该情况,程序会自动切换使用预设的极大值(BIG value)继续运算,最终仍能输出有效结果
成因分析
该提示主要和输入数据的尺度差异有关:
date列作为Date类型,底层存储为距离1970-01-01的天数,数值量级在18000以上;value列数值量级在25万左右- 开启交叉验证(
cv=TRUE)时,程序会频繁尝试不同的spar值,尺度差异加上内部寻优的计算逻辑,容易触发数值溢出,产生无穷大值
抑制提示的方法
方法1:标准化输入数据
消除date和value的尺度差异,避免数值溢出:
# 将date转为数值后标准化,value直接标准化 dat$date_scaled <- scale(as.numeric(dat$date)) dat$value_scaled <- scale(dat$value) # 执行平滑样条 smooth.spline(dat$date_scaled, dat$value_scaled, cv = TRUE)
若需要还原结果,可通过标准化的逆变换处理预测值。
方法2:抑制消息输出
用suppressMessages()或capture.output()直接屏蔽提示:
# 直接抑制所有消息类输出 suppressMessages(smooth.spline(dat$date, dat$value, cv = TRUE)) # 捕获指定类型的输出,仅屏蔽目标提示 capture.output( fit <- smooth.spline(dat$date, dat$value, cv = TRUE), type = "message" )
注意:suppressMessages()会屏蔽所有消息,若需保留其他重要提示,优先选择标准化或capture.output方法。
方法3:手动指定spar参数
若已知合适的平滑参数,直接指定spar值跳过自动寻优:
# 示例指定spar=0.5,可根据实际需求调整 smooth.spline(dat$date, dat$value, spar = 0.5, cv = TRUE)
内容的提问来源于stack exchange,提问作者wernor
相关产品推荐
相关产品推荐

