我有一个数据框,其中包含许多气象和环境变量的每日测量值。我需要创建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
答案 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)] }