0

我有一个数据框,其中包含许多气象和环境变量的日常测量结果。我需要创建 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
4

2 回答 2

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))
于 2012-12-01T21:48:36.393 回答
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)] }
于 2012-12-02T01:26:46.800 回答