でいただきありがとうございます。典型的な移動平均/ 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
をご覧ください。より高度なものはKernSmooth
とsm
パッケージです。
再現可能な例を追加してください。あなたは「近くの10人の隣人」から何を意味していますか? – Sotos
2つのスパイクが相次いでいるとどうなりますか?または 'n + 5'' n-5'がスパイクを持っている場合は - [this]を見てください(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-再現可能な例) – Sotos
十分なウィンドウサイズの中央値はこれを解決するはずです –