如何在R中平滑zoo时间序列?解决ksmooth返回非zoo对象问题
解决方法
ksmooth() 返回的是包含 x(平滑后的时间点)和 y(平滑后的值)的列表,默认会生成100个点,这和原zoo对象的长度不匹配,导致绘图报错。你需要把平滑结果转换成zoo对象,同时确保时间点和原数据对齐,具体操作如下:
步骤1:调整ksmooth参数并转换为zoo对象
如果想让平滑结果的时间点和原数据完全一致,可以指定 x.points 参数为原zoo的时间序列,生成和原数据长度相同的平滑值:
# 提取原zoo的时间点和数值 data_time <- time(data) data_values <- coredata(data) # 用原时间点做核平滑,确保输出长度匹配 smooth_result <- ksmooth(x = data_time, y = data_values, kernel = "normal", bandwidth = 3, x.points = data_time) # 将平滑结果转换成zoo对象 data.smoothKER <- zoo(smooth_result$y, order.by = smooth_result$x)
步骤2:正常绘图
现在 data.smoothKER 是标准的zoo对象,可以和原zoo对象一起绘图:
plot(datazoo, type = "l", col = "gray", main = "核平滑 vs 原始数据") lines(data.smoothKER, col = "red", lwd = 2) legend("topright", legend = c("原始数据", "核平滑"), col = c("gray", "red"), lty = 1)
补充说明
如果不需要严格对齐原时间点,只是想调整平滑点数量,可以用 n.points 参数指定(比如设为原数据的长度 length(data)),再转成zoo对象即可,同样能避免长度不匹配的问题。
内容的提问来源于stack exchange,提问作者DesperateWoman
相关产品推荐
相关产品推荐

