向后滚动rollapply

时间:2016-12-14 11:23:09

标签: r rollapply

我有一个包含2列的时间序列数据集:x是“每小时”的连续温度数据,y是定期采样的响应数据(定期采样时间为每天早上5点,下午2点,每天晚上8点)。

我想做两种滞后方法来分析数据

1)绘制所有我的y数据(常数)与越来越滞后的x数据(在1小时步骤中将x数据移位0-24小时),即下午6点的x和下午6点的y; x下午5点对比y下午6点...... x(前一天下午5点)vs y(下午6点)

2)与1)相同但累积移位,即“时间倒退”累积滞后窗口为0:24,对于x数据,步长为1,并针对y数据进行测试 即下午6点与下午6点的y; x at(平均下午5点和下午6点)vs y下午6点...... x(平均下午6点 - 下午5点)与y(下午6点)

我想为每个滞后场景(0 - 24)绘制一个“y”与“shift x”的线性模型(lm),并制作一个表格,其列数为滞后数,p值为lm;和调整lm的R2)所以我可以看到哪个滞后和“x”中的累积平均滞后最能解释y数据。

本质上它与“cummean”或“rollapply”功能相同,但是向后工作,但我在R中找不到任何可以做到这一点的东西。翻转X数据不起作用,因为需要保持数据的顺序,因为我需要x中几个y的延迟

我猜它需要一个'for'循环来运行每个滞后的所有数据,其中“i”是滞后

0延迟的单次运行将是这样的:

#Creating dummy data 

x<- zoo(c(10,10.5,10.5,11,11.5,12,12.5,12,12,12.5,13,12.5,12,12,11.5,10.5), as.Date(1:16))
y<- zoo(c(rep("NA",3),40,rep("NA",3),45,rep("NA",3),50,rep("NA",3),40), as.Date(1:16))
z<-merge(x, y, all = FALSE)
z

reslt<-lm(z$y~z$x)
a<-summary(reslt)$coefficients[2,4]
b<-summary(reslt)$adj.r.squared

ResltTable<-c(a,b)
colnames(ResltTable)<-c("p-value","Adj. R^2")

谢谢!

1 个答案:

答案 0 :(得分:0)

这将使y回归x i期前迭代i的值。注意,在使用NA的问题中使用“NA”。此问题还涉及每小时但提供每日数据,因此我们显示每日滞后。 dyn$lm运行lm添加自动对齐。 (请注意,昨天发布了一个新版本的dyn,它解决了R开发版本中R的变化。)我们已经为滞后0,1,2,...,10运行了这个版本但是如果你有更多的数据你可以将它运行到更高的值。如果您想要反向滞后,请将-i替换为i中的lag。如果您想使用从0到i的所有滞后,请使用lag(x, 0:-i)并适当调整cbind语句。

library(dyn) # also loads zoo


x <- zoo(c(10,10.5,10.5,11,11.5,12,12.5,12,12,12.5,13,12.5,12,12,11.5,10.5), as.Date(1:16))
y <- zoo(c(rep(NA,3),40,rep(NA,3),45,rep(NA,3),50,rep(NA,3),40), as.Date(1:16))
z < -merge(x, y, all = FALSE)
z


k <- 10 # highest lag to consider
tab <- t(sapply(0:10, function(i) {
  fm <- dyn$lm(y ~ lag(x, -i), z)
  s <- summary(fm)
  cbind(i, coef(fm)[1], coef(fm)[2], coef(s)[2, 4], s$adj.r.squared)
}))
colnames(tab) <- c("Lag", "Intercept", "Slope", "P Value", "Adj R Sq")
tab

,并提供:

> tab
      Lag  Intercept       Slope    P Value   Adj R Sq
 [1,]   0 -13.750000   5.0000000 0.04653741  0.8636364
 [2,]   1  -2.542373   3.8983051 0.09717103  0.7226502
 [3,]   2  -1.944444   3.8888889 0.29647353  0.2424242
 [4,]   3  14.651163   2.5581395 0.49421946 -0.1162791
 [5,]   4  70.357143  -2.1428571 0.78770438 -0.7857143
 [6,]   5  53.571429  -0.7142857 0.87896228 -0.9285714
 [7,]   6  58.461538  -1.1538462 0.84557904 -0.8846154
 [8,]   7  57.884615  -1.1538462 0.84557904 -0.8846154
 [9,]   8 160.000000 -10.0000000        NaN        NaN
[10,]   9 102.500000  -5.0000000        NaN        NaN
[11,]  10 120.000000  -6.6666667        NaN        NaN