创造滞后和移动平均线

时间:2012-12-01 21:21:34

标签: r lag moving-average

我有一个数据框,其中包含许多气象和环境变量的每日测量值。我需要创建14天的滞后并计算3个不同连续滞后期的移动平均值(滞后0和1,滞后2到6和8到14.如果有人建议更好更短的方法来完成任务,我将不胜感激比以下所示。

library(gamair) 
library(mgcv) 
data(chicago) 

attach(chicago)
m <- length(tmpd)
t <- 14
LAG_tmpd <- matrix(0,m,t)  

for (j in 1:t)         
{
  for (g in 1:j)      
  {
    LAG_tmpd[g,j]<-NA

  }
  for(i in (j+1):m)   
  {
    LAG_tmpd[i,j]<-c(tmpd[i-j])

  }
}
tmpd_lag01 <- (LAG_tmpd[,1]+LAG_tmpd[,2])/2
tmpd_lag26 <- (LAG_tmpd[,3]+LAG_tmpd[,4]+LAG_tmpd[,5]+LAG_tmpd[,6]+LAG_tmpd[,7])/5
tmpd_lag713 <- (LAG_tmpd[,8]+LAG_tmpd[,9]+LAG_tmpd[,10]+LAG_tmpd[,11]+LAG_tmpd[,12]+LAG_tmpd[,13]+LAG_tmpd[,14])/7

2 个答案:

答案 0 :(得分:1)

您可以使用filter执行此操作,例如:

f <- function(vec, lags) {
    weights <- rep(0, max(lags))
    weights[lags] <- 1
    filter(vec, filter=weights/length(lags), sides=1)
}

tmpd_lag26 <- f(tmpd, c(3, 4, 5, 6, 7))

答案 1 :(得分:1)

您可以使用相当短的

复制结果
    m <- length(tmpd)
    lagmat <- matrix(rep(NA,m*14), nrow=m)
    for (i in 1:14){ lagmat[ (i+1):m, i] <- tmpd[1:(m-i)] }

    tmpd_lag01  <- rowMeans( lagmat[ , 1:2 ] )
    tmpd_lag26  <- rowMeans( lagmat[ , 3:7 ] )
    tmpd_lag713 <- rowMeans( lagmat[ , 8:14] )

请注意,你所谓的tmpd_lag01实际上计算了有价值滞后的一个时期的平均值并且滞后了两个时期,我发现这个有点奇怪的符号。如果这实际上不是您想要的,而是您希望在移动平均线中包含最新数据,那么初始代码将变为

    m <- length(tmpd)
    lagmat <- matrix(rep(NA,m*15), nrow=m)
    for (i in 1:15){ lagmat[ i:m, i] <- tmpd[1:(m-i+1)] }