Есть ли способ заставить Zoo :: Rollmean функцию, чтобы вернуть вектор, который является той же длиной, что и ввод? (или, возможно, использовать другую функцию?)
Вопрос
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)
Тебе было бы трудно толкнуть, чтобы сказать разницу между этими двумя
И кривые больше всего отклоняются в начале, где вы заставляете оценку 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