2

我需要一些帮助来平滑 R 中的一些数据。所以基本上,我只有一个“时间”列和一个“速度”列。速度基本上代表了某些蝌蚪的运动。只是我的数据有很多噪音,我认为使用“移动平均线”可能会帮助我平滑我的图表并揭示某些模式。我如何在 R 中做到这一点?或者有没有更好的平滑技术可以让像我这样的 R 新手用户更容易理解?

多谢你们

我的数据基本上看起来像这样......但它持续了 9000 秒

Time    Velocity
1.36    2.4
1.81    1.2
2.19    2.4
2.51    2.1
2.98    1.8
3.51    3.0
4.88    2.1
5.38    2.0
6.52    2.4
6.71    1.2
7.29    2.4
7.67    2.1
8.27    1.8
9.13    3.0
9.95    2.1
10.69   2.0
11.29   2.54
12.82   1.64
13.32   2.70
13.89   2.19
14.33   2.44
14.93   2.93
15.75   2.77
17.63   3.21
18.18   2.4
18.82   1.2
20.02   2.4
20.86   2.1
21.44   1.8
22.24   3.0
23.07   2.1
23.67   2.0
4

3 回答 3

5

看看rollmeanRzoo包中的函数。这应该符合您的需求!

更新:

现在我有更多的时间,这里有一些示例代码。如果您想在时间序列的开头和结尾填充值,则必须使用rollapply,否则只需使用rollmean。看看控制台输出,我的意思就会很清楚了。

# Packages
library(zoo)

# Start RNG
set.seed(10)

# Sample data
tmp <- data.frame(time = 1:30, 
                  velocity = round(runif(30, 1, 3), digits = 2))

# Moving average (window size = 5) using rollmean
rollmean(tmp[, 2], k = 5, fill = NA)
 [1]    NA    NA 1.806 1.694 1.682 1.620 1.588 1.726 1.896 2.014 1.952 1.944 1.916 1.828 1.620 1.680 1.602 1.792 1.966 2.192 2.396 2.378 2.206 2.142
[25] 2.232 2.018 2.184 2.164    NA    NA

# Moving average (window size = 5) using rollapply
rollapply(tmp[, 2], width = 5, function(...) {round(mean(...), digits = 3)}, partial = TRUE)
 [1] 1.823 1.965 1.806 1.694 1.682 1.620 1.588 1.726 1.896 2.014 1.952
[12] 1.944 1.916 1.828 1.620 1.680 1.602 1.792 1.966 2.192 2.396 2.378
[23] 2.206 2.142 2.232 2.018 2.184 2.164 2.103 1.910
于 2013-06-26T10:21:21.130 回答
2

如果您加载“TTR”包(技术交易规则),您可以从 MA“家族”中选择众多 MA 之一。

?SMA

SMA(x, n = 10, ...)

EMA(x, n = 10, wilder = FALSE, ratio = NULL, ...)

DEMA(x, n = 10, v = 1, wilder = FALSE, ratio = NULL)

WMA(x, n = 10, wts = 1:n, ...)

EVWMA(价格,数量,n = 10,...)

ZLEMA(x, n = 10, ratio = NULL, ...)

VWAP(价格,数量,n = 10,...)

VMA(x, w, 比率 = 1, ...)

于 2013-06-26T13:34:09.977 回答
2

R 中的移动平均线很简单:

MoveAve <- function(x, width) {
    as.vector(filter(x, rep(1/width, width), sides=2));
}

x您的数据在哪里width,平均窗口的长度在哪里。

使用函数的sides参数filter可以控制窗口的位置,见文档:

如果边 = 1,则滤波器系数仅适用于过去的值;如果边 = 2,它们以滞后 0 为中心。在这种情况下,过滤器的长度应该是奇数,但如果是偶数,则更多的过滤器在时间上是向前的而不是向后的。

于 2013-06-26T09:49:23.067 回答