8
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

3 回答 3

14

查看 的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的直接平滑和平滑比较

并且曲线在您强制估计 MA 的开始处偏差最大。

于 2010-12-12T15:40:13.847 回答
11

虽然这是一个老问题,但对于任何阅读本文的人来说,希望它有所帮助。

将 rollapply 与函数均值一起使用,partial = TRUE 将保留无法计算函数的初始值。

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

??rollapply 
??rollapplyr # for right aligned moving average
于 2014-10-06T12:52:15.240 回答
2

到目前为止,三位经验丰富的 R 编码人员认为这个问题是模棱两可的,但您似乎确实希望为缺失的均值提供某种外推值。您是否想要在开头或结尾的估算值仍不清楚。此代码将返回一个右对齐的向量并将开始的 NA 替换为第一个非 NA 值。如果您想使用左对齐的rollmeans,zoo 中也会有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
于 2010-12-12T16:09:11.580 回答