Скользящее средневзвешенное значение в R (множественные наблюдения) - PullRequest
0 голосов
/ 22 февраля 2019

Есть ли какая-нибудь быстрая функция, которая способна вычислить скользящее среднее значение, которое взвешено?Это необходимо, потому что у меня есть несколько наблюдений (не всегда одно и то же число) на одну точку данных (изменение в секундах), и я усредняю ​​это.Когда я беру скользящее среднее, я хочу изменить вес, чтобы получить беспристрастное скользящее среднее.

До сих пор я придумал это решение (в этом примере с окном 3 секунды).

sam <- data.table(val_mean=c(1:15),N=c(11:25))

sam[,weighted:=val_mean*N]

sam[,rollnumerator:=rollapply(weighted,3,sum,fill=NA,align="left")]

sam[,rolldenominator:=rollapply(N,3,sum,fill=NA,align="left")]

sam[,rollnumerator/rolldenominator]

Я не смог найти ни одного вопроса, который уже решает эту проблему.

Речь идет не о неравном расстоянии между данными: я могу позаботиться об этом, расширив свою таблицу данных с помощью NA длявключите каждую секунду (пример выше одинаково разнесен).Кроме того, я не хочу включать веса в смысле RcppRoll's roll_mean: там веса фиксированы для всех временных окон («Вектор длины n, дающий веса для каждого элемента в окне »."), в то время как в моем случае веса меняются в зависимости от обрабатываемых в данный момент значений.В-третьих, мне не нужен адаптивный размер окна, он должен оставаться фиксированным (скажем, через 3 секунды).

1 Ответ

0 голосов
/ 22 февраля 2019

1) Использование by.column = FALSE:

library(data.table)
library(zoo)

wmean <- function(x) weighted.mean(x[, 1], x[, 2])
sam[, rollapplyr(.SD, 3, wmean, by.column = FALSE, fill = NA, align = "left")]

2) Другой подход заключается в кодировании значений и весов в сложный вектор:

wmean_cmplx <- function(x) weighted.mean(Re(x), Im(x))
sam[, rollapply(complex(real = val_mean, imag = N), 3, wmean_cmplx, 
  fill = NA, align = "left")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...