You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中拟合带趋势的时间序列调和回归模型及绘图报错问题

解决HarmonicRegression包中harmonic.regression函数的长度匹配错误

咱先拆解下你遇到的错误根源:你用的tempdub是单变量时间序列(TSA包里的月度气温数据),而harmonic.regression函数在做输入校验时,会用nrow(inputts)来判断时间序列的观测数。但单变量的ts对象调用nrow()会返回NULL(长度为0),和length(time(tempdub))(有实际观测长度)做比较时,就触发了这个“argument is of length zero”的错误。

下面是具体的修复步骤和完整代码:

修复方案

  1. 调整输入数据格式:把单变量时间序列转换成矩阵格式,让函数能正确识别观测值的数量。
  2. 对齐绘图的时间轴:拟合后的结果要和原始数据的时间属性保持一致,避免绘图时时间轴错位。

修正后的完整代码

library(TSA)
library(HarmonicRegression)
data(tempdub)

# 将单变量时间序列转为矩阵,解决nrow判断的核心问题
har_model <- harmonic.regression(
  inputts = as.matrix(tempdub), 
  inputtime = time(tempdub), 
  Tau = 24, 
  normalize = TRUE, 
  norm.pol = FALSE, 
  norm.pol.degree = 1, 
  trend.eliminate = FALSE, 
  trend.degree = 1
)

# 绘制拟合结果:保持原序列的时间属性,让拟合值和原始数据对齐
plot(tempdub, type = "p", ylim = range(c(fitted(har_model), tempdub)), main = "带趋势的调和回归拟合结果")
lines(fitted(har_model), col = "red", lwd = 2)
legend("topright", legend = c("原始气温数据", "拟合值"), 
       col = c("black", "red"), pch = c(1, NA), lty = c(NA, 1))

关键说明

  • as.matrix(tempdub):这一步是核心,把单变量ts转成矩阵后,nrow()就能正确返回观测值的数量,函数的输入校验就能通过。
  • 绘图时直接用tempdub的默认绘图参数,再叠加拟合值的线,这样时间轴(1964-1975年的月度数据)会自动对齐,比手动指定start和freq更稳妥。
  • 你的参数设置(trend.degree = 1、trend.eliminate = FALSE)已经正确指定了保留一次趋势项,符合你“带趋势的调和回归”需求。

运行这段代码后,就能成功拟合模型,并且看到原始数据和拟合趋势的对比图了。

内容的提问来源于stack exchange,提问作者Javide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:48:55