【问题标题】:Create lags and moving average创建滞后和移动平均线
【发布时间】:2012-11-19 18:35:30
【问题描述】:

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

【问题讨论】:

  • 请您先更正您的代码; LAG_tmpd[g, j] 中的错误 ?
  • 代码在我的电脑上运行良好,我没有收到此错误。

标签: r lag moving-average


【解决方案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)] }

【讨论】:

    【解决方案2】:

    您可以使用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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2022-01-26
      • 2013-12-22
      • 2021-08-13
      • 2020-01-06
      • 1970-01-01
      • 2011-06-29
      相关资源
      最近更新 更多