私は、4つの変数(date
、x
、y
、z
)の約14k観測を含む非常に大きな時系列を持っています。R時系列の次の行と前の行の違いを取得する方法は?
どのように、(現在の値(t
)と前回(t-1
)との差を計算する関数diff(df$vector, lag = 1)
に反して)は、各値の次の値(t+1
)との差を計算することができるし、前値(t-1
)?
私は、4つの変数(date
、x
、y
、z
)の約14k観測を含む非常に大きな時系列を持っています。R時系列の次の行と前の行の違いを取得する方法は?
どのように、(現在の値(t
)と前回(t-1
)との差を計算する関数diff(df$vector, lag = 1)
に反して)は、各値の次の値(t+1
)との差を計算することができるし、前値(t-1
)?
遅れを設定するための要求を理解するために...いくつかのデータを生成している:
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
私が正しくあなたの質問を理解していれば、あなたが望むすべてが、そう= 2
あなたが探していることは2のdiff
です! (@Kake_Fiskにより示唆されるようにあなたはdiff
ないlag
を使用する必要があります。)@Coatlessから受け入れ答えからのデータを使用:
set.seed(11)
a = sample(1:10, 10)
diff(a,2)
ができます:
:OPからのコメントの後[1] 2 8 2 -1 -1 -4 -4 6
編集を
あなたのコメントが正しく理解できれば、@ 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
Rは 'diff(a、2)'を 'diff(a、lag = 2)'と解釈します。私は同じ結果を得ます: 'set。シード(11) =試料(1:10、10) [1] 3 1 5 9 7 8 6 4 2 10 差分(2) [1] 6 6 3 -3 -3 -6 4 diff(a、lag = 2) [1] 6 6 3 -3 -3 4 4 ' –
これがポイントです。 Kake_Fiskは間違っている「遅れ」を示唆し、受け入れられた答えは、ベースRですでに利用可能な関数を構築することによって、正確ではあるが不必要に複雑になります。 – hvollmeier
OK! 'diff(a、lag = 2)'を返し、 't'と' t-2'の間の差を返しますが、オフセットと配列の先頭を設定することで修正できます: 'c(NA、diff(a、 2)) ' –
hm no、lag = 2は、現在の値tとt-2の差を計算します。 私はt + 1とt-1の違いを得る必要があります。 –