如何获得 R 时间序列中下一行和上一行之间的差异?
How to get the difference between next and previous row in an R time series?
我有一个相当大的时间序列,包含 4 个变量的大约 14k 个观察值(date
、x
、y
、z
)。
我如何(与计算当前值 (t
) 和前一个值 (t-1
) 之间的差值的函数 diff( df$vector, lag = 1)
相反)计算每个value 下一个值 (t+1
) 和前一个值 (t-1
) 之间的差异?
如果我对你的问题理解正确,你只需要设置滞后 = 2。
所以,为了理解请求...生成一些数据:
set.seed(11)
a = sample(1:10, 10)
数据为:
3 1 5 9 7 8 6 4 2 10
需要T+1 vs. T-1
:
T = 0 => No computation
T = 1 => 5 - 3 = 2
T = 2 => 9 - 1 = 8
...
T = 9 => 10 - 4 = 6
T = 10 => No computation
有了那个被建立...
#' Future Difference
#'
#' Obtain the lagged difference between X[t+1+lag] - X[t-1-lag]
#' @param x A \code{vec}
#' @param lag A \code{integer} indicating the lag
#' @return A \code{vec} with differences taken at T+lag v. T-lag
#' @examples
#' set.seed(11)
#' a = sample(1:10, 12)
#' fdiff(a)
fdiff = function(x, lag = 1){
# Number of obs
n = length(x)
# Trigger error to prevent subset
if(n < 2+lag){stop("`x` must be greater than `2+lag`")}
# X_(T+1) - X_(T-1)
x[(2+lag):n] - x[1:(n-lag-1)]
}
在 a
上调用它得到:
fdiff(a)
2 8 2 -1 -1 -4 -4 6
您要查找的是 diff
个,共 2 个! (您应该按照@Kake_Fisk的建议使用diff
而不是lag
。)使用@Coatless接受的答案中的数据:
set.seed(11)
a = sample(1:10, 10)
diff(a,2)
给出:
[1] 2 8 2 -1 -1 -4 -4 6
根据 OP 的评论进行编辑:
如果我正确理解了您的评论,您从@coatless 接受的答案并没有给您您所要求的。您正在寻找一个系列,它可以为您提供每个元素与其邻居的上一个和下一个差异。所以这个系列的长度必须是原始系列的 2 倍减去 2(因为第一个元素没有前一个值,最后一个没有下一个值)。
一种可能的解决方案可能是:
set.seed(11)
a = sample(1:10, 10)
a
[1] 3 1 5 9 7 8 6 4 2 10
prev <- a[1:(length(a)-1)] - a[2:length(a)] # series of previous values
nxt <- -1 * prev # series of next values
nextPrevValues <- rep(0,2 * (length(a)-1))
for(i in 1:length(a)-1){
nextPrevValues[2*i-1] <- nxt[i]
nextPrevValues[2*i] <- prev[i]
}
从第一个元素到下一个元素的差异开始,您将获得每个元素的前一个和下一个差异。最后一个元素只有以前的值。
nextPrevValues
[1] -2 2 4 -4 4 -4 -2 2 1 -1 -2 2 -2 2 -2 2 8 -8
我有一个相当大的时间序列,包含 4 个变量的大约 14k 个观察值(date
、x
、y
、z
)。
我如何(与计算当前值 (t
) 和前一个值 (t-1
) 之间的差值的函数 diff( df$vector, lag = 1)
相反)计算每个value 下一个值 (t+1
) 和前一个值 (t-1
) 之间的差异?
如果我对你的问题理解正确,你只需要设置滞后 = 2。
所以,为了理解请求...生成一些数据:
set.seed(11)
a = sample(1:10, 10)
数据为:
3 1 5 9 7 8 6 4 2 10
需要T+1 vs. T-1
:
T = 0 => No computation
T = 1 => 5 - 3 = 2
T = 2 => 9 - 1 = 8
...
T = 9 => 10 - 4 = 6
T = 10 => No computation
有了那个被建立...
#' Future Difference
#'
#' Obtain the lagged difference between X[t+1+lag] - X[t-1-lag]
#' @param x A \code{vec}
#' @param lag A \code{integer} indicating the lag
#' @return A \code{vec} with differences taken at T+lag v. T-lag
#' @examples
#' set.seed(11)
#' a = sample(1:10, 12)
#' fdiff(a)
fdiff = function(x, lag = 1){
# Number of obs
n = length(x)
# Trigger error to prevent subset
if(n < 2+lag){stop("`x` must be greater than `2+lag`")}
# X_(T+1) - X_(T-1)
x[(2+lag):n] - x[1:(n-lag-1)]
}
在 a
上调用它得到:
fdiff(a)
2 8 2 -1 -1 -4 -4 6
您要查找的是 diff
个,共 2 个! (您应该按照@Kake_Fisk的建议使用diff
而不是lag
。)使用@Coatless接受的答案中的数据:
set.seed(11)
a = sample(1:10, 10)
diff(a,2)
给出:
[1] 2 8 2 -1 -1 -4 -4 6
根据 OP 的评论进行编辑:
如果我正确理解了您的评论,您从@coatless 接受的答案并没有给您您所要求的。您正在寻找一个系列,它可以为您提供每个元素与其邻居的上一个和下一个差异。所以这个系列的长度必须是原始系列的 2 倍减去 2(因为第一个元素没有前一个值,最后一个没有下一个值)。 一种可能的解决方案可能是:
set.seed(11)
a = sample(1:10, 10)
a
[1] 3 1 5 9 7 8 6 4 2 10
prev <- a[1:(length(a)-1)] - a[2:length(a)] # series of previous values
nxt <- -1 * prev # series of next values
nextPrevValues <- rep(0,2 * (length(a)-1))
for(i in 1:length(a)-1){
nextPrevValues[2*i-1] <- nxt[i]
nextPrevValues[2*i] <- prev[i]
}
从第一个元素到下一个元素的差异开始,您将获得每个元素的前一个和下一个差异。最后一个元素只有以前的值。
nextPrevValues
[1] -2 2 4 -4 4 -4 -2 2 1 -1 -2 2 -2 2 -2 2 8 -8