Есть ли способ заставить Zoo :: Rollmean функцию, чтобы вернуть вектор, который является той же длиной, что и ввод? (или, возможно, использовать другую функцию?)

StackOverflow https://stackoverflow.com/questions/4422363

  •  09-10-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Посмотрите 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

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

> ## 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

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

Другие советы

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

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

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

??rollapply 
??rollapplyr # for right aligned moving average

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

До сих пор вопрос был замечен как неоднозначный третий опыт R, но кажется, что вы хотите, чтобы вы хотели, чтобы какое-то экстраполированное значение для отсутствующих средств. Хотели ли вы, что вмененные значения в начале или конец остается неясным. Этот код вернет правый выровненный вектор и замените начало NA с первым значением 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top