Скользящие запаздывающие различия

Хорошо, поэтому я хочу создать скользящие запаздывающие различия в R.

vec <- c(43.79979, 44.04865, 44.17308, 44.54638, 44.79524, 44.79524, 44.79524, 44.42195, 44.54638, 44.79524, 44.42195, 43.30206, 43.30206, 43.17764, 43.30206)

> length(vec)
[1] 15

Это то, что я пробовал до сих пор:

vec1 <- rollapply(vec, width = 2,  fill = NA, FUN = diff)

Это дает такой результат:

[1]  0.24886  0.12443  0.37330  0.24886  0.00000  0.00000 -0.37329  0.12443  0.24886 -0.37329 -1.11989  0.00000 -0.12442  0.12442       NA

> length(vec1)
[1] 15

Обратите внимание, что у нас есть значение NA в элементе 15.

Итак, я хочу сделать это различие в лагах, скажем, для лагов 1,2 и 3 ... Таким образом, приведенный выше код не подходит для этого, поэтому я пробую следующее:

lag1 <- diff(vec, lag = 1, differences = 1, arithmetic = TRUE, na.pad = TRUE)
lag2 <- diff(vec, lag = 2, differences = 1, arithmetic = TRUE, na.pad = TRUE)
lag3 <- diff(vec, lag = 3, differences = 1, arithmetic = TRUE, na.pad = TRUE)
length(lag1)
length(lag2)
length(lag3)

Результат этого:

> lag1
 [1]  0.24886  0.12443  0.37330  0.24886  0.00000  0.00000 -0.37329  0.12443  0.24886 -0.37329 -1.11989  0.00000 -0.12442  0.12442
> lag2
 [1]  0.37329  0.49773  0.62216  0.24886  0.00000 -0.37329 -0.24886  0.37329 -0.12443 -1.49318 -1.11989 -0.12442  0.00000
> lag3
 [1]  0.74659  0.74659  0.62216  0.24886 -0.37329 -0.24886  0.00000  0.00000 -1.24432 -1.49318 -1.24431  0.00000
> length(lag1)
[1] 14
> length(lag2)
[1] 13
> length(lag3)
[1] 12

Обратите внимание, что когда разница с запаздыванием выше ... он помещает результат сравнения в строку, в которой вычиталось значение ... поэтому он взял наше текущее значение - значение с запаздыванием. Он помещает результат сравнения на позицию запаздывающего значения. Затем мы теряем длину вектора. Я действительно хочу поместить результат с разницей в начальный номер (diff) и разместить ведущие NA, чтобы учесть недостающие значения в начале набора данных.

Используя в качестве примера задержку 2, это мой желаемый результат:

> lag2
 [1]  NA    NA 0.37329  0.49773  0.62216  0.24886  0.00000 -0.37329 -0.24886  0.37329 -0.12443 -1.49318 -1.11989 -0.12442  0.00000

Кто-нибудь знает способ как это исправить ??

Чтобы, возможно, объяснить немного больше:

это начало вектора:

vec <- c(43.79979, 44.04865, 44.17308..... 

Итак, если мы сделаем разницу в 2 с задержкой ...

Берем 3-й элемент ... 44.17308 - 43.79979 = результат 0.37329.

Итак, я хочу иметь NA NA 0.37329

Вместо размещения 0.37329 на первой позиции в новом векторе lag2.


person Andrew Bannerman    schedule 11.08.2017    source источник
comment
ага - я вижу ... так что на самом деле зайдите в вектор с помощью c (rep (NA, n) ... а затем вычисляются различия, так что они помещаются в желаемое положение. Отлично   -  person Andrew Bannerman    schedule 11.08.2017


Ответы (2)


Так же, как в Zoo lag diff back in data frame

vec = c(43.79979, 44.04865, 44.17308, 44.54638, 44.79524, 44.79524, 44.79524, 44.42195, 44.54638, 44.79524, 44.42195, 43.30206, 43.30206, 43.17764, 43.30206)
require(zoo)

apply(lag(zoo(vec), c(-2,0), na.pad = TRUE), 1L, diff)

#> apply(lag(zoo(vec), c(-2,0), na.pad = TRUE), 1L, diff)
#       1        2        3        4        5        6        7        8        9       10       11       12       13       14       15 
#      NA       NA  0.37329  0.49773  0.62216  0.24886  0.00000 -0.37329 -0.24886  0.37329 -0.12443 -1.49318 -1.11989 -0.12442  0.00000 

10 мая 2018 года мне указал @thistleknot (спасибо!), который dplyr маскирует собственный lag общий stats. Поэтому убедитесь, что у вас не прикреплено dplyr, или вместо этого запустите stats::lag явно, иначе мой код не запустится.

Думаю, я нашел виновника: github.com/tidyverse/dplyr/issues/1586 ответ: Это естественное следствие наличия большого количества пакетов R. Просто будьте ясны и используйте stats :: lag или dplyr :: lag

person catastrophic-failure    schedule 11.08.2017
comment
Ошибка: n должен быть неотрицательным целочисленным скаляром, а не удвоением длины 2. На самом деле не уверен, но я не думаю, что он принимает c (-2,0) - person Andrew Bannerman; 11.08.2017

Для тех, кто ищет tidyverse решение, один из вариантов - использовать dplyr::lag, который я считаю более интуитивным, чем с base::apply.

    vec - dplyr::lag(vec, n = 2)

Таким образом, идея в основном состоит в том, чтобы сгенерировать второй вектор с позициями с запаздыванием на n и просто вычесть два вектора без дальнейшего усложнения, максимально используя векторизованные функции в R.

person elcortegano    schedule 29.01.2020