任务:在移动窗口中找到最佳线性拟合的斜率(例如,最小化误差方差)。x 值是等距的,例如随着时间的推移自动测量。
问题:性能是一个问题,因为它需要对许多数据集重复。
天真的实现:循环 y 值。
#some data
x <- 0:(8*60)
set.seed(42)
y <- -x^2*0.01+x*20+rnorm(8*60+1,mean=300,sd=50)
plot(y~x,pch=".")
optWinLinFit0 <- function(x,y,win_length) {
xfit <- x[seq_len(win_length)]
xfit <- xfit-min(xfit)
#regression on moving window
res <- lapply(seq_len(length(x)-win_length),function(i,x,y) {
y <- y[seq_len(win_length)+i-1]
list(y=y,fit = lm.fit(cbind(1,xfit),y))
},x=x, y=y)
#find fit with smallest sigma^2
winner <- which.min(sapply(res,function(x) 1/(win_length-2)*sum(x$fit$residuals^2)))
y <- res[[winner]]$y
#return fit summary and predicted values
list(n=winner,summary=summary(lm(y~xfit)),
dat=data.frame(x=x[-seq_len(winner-1)][seq_len(win_length)],
y=y,
ypred=res[[winner]]$fit$fitted.values))
}
res0 <- optWinLinFit0(x,y,180)
lines(ypred~x,data=res0$dat,col="red",lwd=2)
红线给出了移动窗口位置的拟合值,其中误差方差最小:
任何想法如何更快地做到这一点?