有没有办法强制zoo :: rollmean函数返回一个与它的输入长度相同的向量? (或者可能使用其他功能?)

时间:2010-12-12 15:25:30

标签: r zoo

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]中,它将仅计算右边的平均值

4 个答案:

答案 0 :(得分:11)

查看na.pad的{​​{1}}参数,并将其设置为rollmean()。错过了最后一点;所以你还需要将手段对齐到右边:

TRUE

除非您需要将这些内容作为1列矩阵,否则请放弃> 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 来电。

好的,从进一步澄清看来,您似乎想要计算一些与结果向量中的其他方法无法真正比​​较的方法。但如果你必须......

cbind()

由于OP有兴趣估计MA然后拟合样条曲线,因此通过这样做而不是直接从数据中估计样条曲线来获取增益可能是有益的。

> 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

你很难说出这两者之间的区别 Comparison of direct smooth and smooth of MA

并且曲线在开始强制估计MA时偏离最大。

答案 1 :(得分:7)

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

使用带有函数mean的rollapply,而partial = TRUE将保留无法计算函数的初始值。

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

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

答案 2 :(得分:3)

阅读文档确实会让您受益匪浅。请参阅?rollmean,特别是na.padalign参数。

答案 3 :(得分:2)

到目前为止,这个问题被三位经验的R编码员看作是模棱两可的,但似乎你确实需要某种外推价值的缺失方法。您是否想要在开头或结尾处的估算值仍不清楚。此代码将返回右对齐矢量,并将第一个非NA值替换为起始NA。如果你想使用左对齐的rollmeans,动物园里也会有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