2016-04-04 5 views
0

私は100から200までの値を持つデータセットを持っていますが、データにはいくつかのスパイクがあります。 私はrollmeanまたはrollapllyでデータセット全体を滑らかにしたくありません。隣人に基づく平均値で具体的な値を変更してください

私はそのようにそれを仕事をしたい:

  1. は、条件(値> 300)

  2. でこれらのスパイクから 計算された平均値/中央値でこれらのあまりに大きな値を置き換える見つけます近くの10の値。擬似コードで

例:

data[n] = spike 

data[n] = mean(from data[n-5] to data[n+5]) 

それだけのデータである点で、全体のデータセットに窓関数を使用していないようです。

が、私はこの質問を好き事前

+0

再現可能な例を追加してください。あなたは「近くの10人の隣人」から何を意味していますか? – Sotos

+1

2つのスパイクが相次いでいるとどうなりますか?または 'n + 5'' n-5'がスパイクを持っている場合は - [this]を見てください(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-再現可能な例) – Sotos

+0

十分なウィンドウサイズの中央値はこれを解決するはずです –

答えて

0

でいただきありがとうございます。典型的な移動平均/ k-最近傍推定。ノンパラメトリックなアプローチ。次は動作するはずです。

foo <- function(x, thresh = 300, h = 5, window.fun = mean) { 
    spikes.loc <- which(x > thresh) 
    low.bound <- spikes - h 
    up.bound <- spikes + h 
    N <- length(spikes.loc) 
    x.hat <- x 
    for (i in 1:N) x.hat[spikes.loc[i]] <- window.fun(x[low.bound[i]:up.bound[i]]) 
    return(x.hat) 
    } 

この関数は、元の観測ベクトルx、閾値、ウィンドウサイズ(平滑化パラメータ)、ならびにユーザが指定したウィンドウ関数を取ります。戻り値はベクトル平滑化データです。スパイク点で元のデータと異なるだけです。ウィンドウ関数の一般的な選択は密度関数です。したがって、すべての隣接データの加重平均で終わります。

あなたのデータが均等に配置されていると仮定しているので、単純なインデックスx [i-h]:x [i + h]は適切な近傍を示しています。より一般的な設定では、ウィンドウはユークリッド距離に基づいていますが、Nはコストの高い観測数であるため、O(N * N)のコストがかかりません。

Rには、ノンパラメトリック推定/平滑化ツールが組み込まれています。最も基本的なものは、移動平均の一般化kernel smoothingです。これは、O(N log(N))コストでの高速計算にFFTアルゴリズムを使用します。 ?ksmoothをご覧ください。より高度なものはKernSmoothsmパッケージです。

+0

ありがとう、私はしたいように見えます。私は手書きの機能について考えましたが、まずホイールを発明する前に尋ねることにしました。 –

関連する問題