11

我在处理 R 中的时间序列时遇到问题。

#--------------read data

wb = loadWorkbook("Countries_Europe_Prices.xlsx") 
df = readWorksheet(wb, sheet="Sheet2")

x <- df$Year
y <- df$Index1

y <- lag(y, 1, na.pad = TRUE)
cbind(x, y)

它给了我以下输出:

        x     y
 [1,] 1974    NA
 [2,] 1975  50.8
 [3,] 1976  51.9
 [4,] 1977  54.8
 [5,] 1978  58.8
 [6,] 1979  64.0
 [7,] 1980  68.8
 [8,] 1981  73.6
 [9,] 1982  74.3
[10,] 1983  74.5
[11,] 1984  72.9
[12,] 1985  72.1
[13,] 1986  72.3
[14,] 1987  71.7
[15,] 1988  72.9
[16,] 1989  75.3
[17,] 1990  81.2
[18,] 1991  84.3
[19,] 1992  87.2
[20,] 1993  90.1

但我希望 y 中的第一个值是 50.8 等等。换句话说,我想得到一个负滞后。我不明白,我该怎么办?

我的问题与这个问题非常相似,但是我无法解决它。我想我仍然不明白解决方案......

R向量/数据帧中的基本滞后

4

4 回答 4

13

内置的“引导”功能怎么样?(来自 dplyr 包)它不是完全完成了 Ahmed 的功能吗?

cbind(x, lead(y, 1))

如果您希望能够在同一函数中计算正滞后或负滞后,我建议使用他的“移位”函数的“较短”版本:

shift = function(x, lag) {
  require(dplyr)
  switch(sign(lag)/2+1.5, lead(x, abs(lag)), lag(x, abs(lag)))
}

它所做的是创建 2 种情况,一种滞后,另一种领先,并根据滞后的符号选择一种情况(+1.5 是将 {-1, +1} 转换为 {1, 2 } 选择)。

于 2015-02-12T16:53:01.117 回答
3

有一种更简单的方法可以做到这一点,我已经从这个链接中完全捕捉到了。我将在这里做的是解释你应该分步做什么:

首先通过运行以下代码创建以下函数:

shift<-function(x,shift_by){
    stopifnot(is.numeric(shift_by))
    stopifnot(is.numeric(x))

    if (length(shift_by)>1)
        return(sapply(shift_by,shift, x=x))

    out<-NULL
    abs_shift_by=abs(shift_by)
    if (shift_by > 0 )
        out<-c(tail(x,-abs_shift_by),rep(NA,abs_shift_by))
    else if (shift_by < 0 )
        out<-c(rep(NA,abs_shift_by), head(x,-abs_shift_by))
    else
        out<-x
    out
}

这将创建一个shift使用两个参数调用的函数;一个是您需要操作其滞后/领先的向量,另一个是您需要的滞后/领先的数量。

例子:

假设您有以下向量:

x<-seq(1:10)

x
 [1]  1  2  3  4  5  6  7  8  9 10

如果您需要x一阶滞后

shift(x,-1)
[1] NA  1  2  3  4  5  6  7  8  9 

如果您需要x一阶领先(负滞后)

shift(x,1)
[1]  2  3  4  5  6  7  8  9 10 NA
于 2015-02-10T21:20:23.920 回答
3

lag() 函数的反面是lead()

于 2019-08-24T19:20:32.903 回答
3

更简单的解决方案:

y = dplyr::lead(y,1)
于 2019-02-08T06:16:41.563 回答