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

rollmeanRのzooパッケージの関数を見てください。これはあなたのニーズに合うはずです!

アップデート:

もう少し時間ができたので、サンプル コードをいくつか示します。時系列の最初と最後に値を入力したい場合は、 を使用する必要があり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 の 1 つを選択できます。

?SMA

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

EMA(x, n = 10, ワイルダー = FALSE, 比率 = NULL, ...)

DEMA(x、n = 10、v = 1、ワイルダー = FALSE、比率 = NULL)

WMA(x、n = 10、重量 = 1:n、...)

EVWMA(価格、出来高、n = 10、...)

ZLEMA(x、n = 10、比率 = 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と、ウィンドウの位置を制御できます。ドキュメントを参照してください。

side = 1 の場合、フィルター係数は過去の値のみを対象としています。side = 2 の場合、それらはラグ 0 を中心に配置されます。この場合、フィルターの長さは奇数である必要がありますが、偶数の場合、フィルターの多くは後方よりも時間的に前方になります。

于 2013-06-26T09:49:23.067 に答える