什么是样条曲线的周期版本?

机器算法验证 回归 时间序列 线性模型 样条 基函数
2022-04-01 12:32:59

在这个用多项式拟合周期性数据有什么问题?发布后,我尝试使用傅里叶基扩展和多项式基扩展来拟合玩具周期数据(每日温度数据集)。我从@Cliff AB 和@Aksakal 那里得到了很好的答案,为什么傅里叶基础更适合这种情况。

同时,@whuber 在评论中提到,使用周期性版本的样条线是另一种选择。那么,什么是样条曲线的周期版本以及基础扩展是什么样的?

1个回答

Venables Ripley 书中讨论了周期性样条曲线。基本上,通过(正确地)指定周期性,数据在一段时间内被聚合到复制中,并且样条适合插值趋势。例如,使用AirPassengersR 中的数据集来模拟飞行趋势,我可能会使用分类固定效应来表示年度效应,并使用样条曲线来插入剩余的月度趋势。我的样条插值可以说是一个糟糕的插值,但找到一个合适的样条完全是另一个话题:) 这个例子可能更有用一点,因为它处理平均其他自回归趋势。

我的从头开始的方法适合周期性样条曲线,但在端点处具有不连续性,但是可以通过在两个周期内复制这些数据并将样条曲线拟合到中心半部分来轻松解决这个问题。

matplot(matrix(log(AirPassengers), ncol=12), type='l', axes=F, ylab='log(Passengers)', xlab='Month')
axis(1, at=1:12, labels=month.abb)
axis(2)
box()
title('Monthly air passenger data 1949:1960')

ap <- data.frame('lflights'= log(c(AirPassengers)), month=month.abb, year=rep(1949:1960, each=12))
ap$month.n <- match(ap$month, month.abb)
ap$monthly.diff <- lm(lflights ~ factor(year), data=ap)$residuals
matplot(matrix(ap$monthly.diff, ncol=12), type='l', axes=F, ylab='log(Passengers)', xlab='Month')
axis(1, at=1:12, labels=month.abb)
axis(2)
box()
title('Monthly residuals for air passenger data 1949:1960')

library(splines)
ap$monthly.pred <- lm(monthly.diff~bs(month.n, degree=2, knots = c(5)), data=ap)$fitted
lines(1:12, ap$monthly.pred[1:12], lwd=2)

在此处输入图像描述

在此处输入图像描述