Есть ли способ заставить функцию zoo :: rollmean возвращать вектор такой же длины, что и его входные данные? (или может использовать другую функцию?) - PullRequest
3 голосов
/ 12 декабря 2010
input = cbind(c(3,7,3,5,2,9,1,4,6,4,7,3,7,4))
library(zoo)
output = cbind(rollmean(input,4))
print(input)
print(output)

выход:

      [,1]
 [1,]    3
 [2,]    7
 [3,]    3
 [4,]    5
 [5,]    2
 [6,]    9
 [7,]    1
 [8,]    4
 [9,]    6
[10,]    4
[11,]    7
[12,]    3
[13,]    7
[14,]    4
      [,1]
 [1,] 4.50
 [2,] 4.25
 [3,] 4.75
 [4,] 4.25
 [5,] 4.00
 [6,] 5.00
 [7,] 3.75
 [8,] 5.25
 [9,] 5.00
[10,] 5.25
[11,] 5.25

но когда я пытаюсь связать это:

Error in cbind(input, output) :
  number of rows of matrices must match (see arg 2)
Calls: print -> cbind
Execution halted

Я бы хотел использовать функцию, которая была бы достаточно умной и не сдавалась, если она не получает данные на обоих концах вектора и не вычисляет выходной сигнал в соответствии только с имеющимися данными. так, например, в input [1] он будет вычислять только среднее значение справа

Ответы [ 4 ]

11 голосов
/ 12 декабря 2010

Посмотрите на аргумент na.pad на rollmean() и установите его на TRUE. Пропустил последний бит; поэтому вам также нужно выровнять средства вправо:

> input <- c(3,7,3,5,2,9,1,4,6,4,7,3,7,4)
> rollmean(input, 4, na.pad = TRUE, align = "right")
 [1]   NA   NA   NA 4.50 4.25 4.75 4.25 4.00 5.00 3.75 5.25 5.00 5.25 5.25

Если вам не нужны эти вещи в виде матрицы из 1 столбца, отбросьте вызовы cbind().

ОК, из дальнейших разъяснений кажется, что вы хотите вычислить некоторые средства, которые на самом деле не сопоставимы с другими средствами в векторе результатов. Но если ты должен ...

> k <- 4
> c( cumsum(input[1:(k-1)]) / 1:(k-1), rollmean(input, k, align = "right") )
 [1] 3.000000 5.000000 4.333333 4.500000 4.250000 4.750000 4.250000 4.000000
 [9] 5.000000 3.750000 5.250000 5.000000 5.250000 5.250000

Поскольку ФП заинтересован в оценке МА для подгонки к нему сплайна, возможно, было бы полезно посмотреть, что вы получаете, делая это, вместо оценки сплайна непосредственно из данных.

> ## model observed data
> mod <- smooth.spline(seq_along(input), input, df = 3)
> ## plot data and fitted spline
> plot(seq_along(input), input)
> lines(predict(mod, seq_along(input)), col = "red", lwd = 2)
> ## model the fudged MA
> mod2 <- smooth.spline(seq_along(input),
+                       c( cumsum(input[1:(k-1)]) / 1:(k-1),
+                         rollmean(input, k, align = "right") ), df = 3)
> ## add this estimated spline
> lines(predict(mod2, seq_along(input)), col = "blue", lwd = 2)

Тебе трудно понять разницу между этими двумя Comparison of direct smooth and smooth of MA

и кривые отклоняются больше всего в начале, где вы форсируете оценку МА.

8 голосов
/ 06 октября 2014

Хотя это старый вопрос, для всех, кто его читает, надеюсь, что это поможет.

Использование rollapply со средним значением функции и частичным = TRUE сохранит начальные значения, где функция не может быть рассчитана.

x <- rollapply(input, width = 5, FUN = mean, align = "centre", partial = TRUE")

??rollapply 
??rollapplyr # for right aligned moving average
3 голосов
/ 12 декабря 2010

Вы бы действительно выиграли от чтения документации. См. ?rollmean, в частности аргументы na.pad и align.

2 голосов
/ 12 декабря 2010

До сих пор этот вопрос считался неоднозначным тремя опытными R-кодерами, но кажется, что вам действительно нужно какое-то экстраполированное значение для недостающих средних. Хотели ли вы вмененные значения в начале или в конце, остается неясным. Этот код вернет выровненный по правому краю вектор и заменит начальные NA первыми значениями, отличными от NA. В зоопарке также была бы функция na.locf, если вы хотите работать с выровненными по левому краю роллами.

long.roll <- function(input, k) { rtroll <-  
                           rollmean(input, k, align="right", na.pad=TRUE)
                return(c(rep(rtroll[k], k-1), rtroll[-(1:(k-1))]) ) }
long.roll(input,4)
#  [1] 4.50 4.50 4.50 4.50 4.25 4.75 4.25 4.00 5.00 3.75 5.25 5.00 5.25
# [14] 5.25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...