系列のデータポイントの数を減らすにはどうすればよいですか?


11

私は10年以上統計を勉強していません(それから基本コースだけです)ので、私の質問は少し理解しにくいかもしれません。

とにかく、私がしたいことは、シリーズのデータ​​ポイントの数を減らすことです。X軸は測定開始からのミリ秒数で、Y軸はそのポイントの読み取り値です。

多くの場合、数千のデータポイントがありますが、必要なのは数百だけです。だから私の質問は:データポイントの数を正確に減らすにはどうすればよいですか?

呼ばれるプロセスは何ですか?(だから私はそれをググることができます)優先アルゴリズムはありますか(C#で実装します)

あなたがいくつかの手がかりを得たことを願っています。適切な用語が欠けて申し訳ありません。


編集:詳細はこちら:

取得した生データは心拍数データであり、最後のビートからのミリ秒数の形式です。データをプロットする前に、最初のサンプルからのミリ秒数と、各データポイント(60000 / timesincelastbeat)でのbpm(1分あたりの拍数)を計算します。

データを視覚化したい、つまり折れ線グラフにプロットしたい。グラフのポイント数を数千から数百に減らしたい。

1つのオプションは、シリーズの1秒ごと、またはおそらく5秒ごとの平均bpmを計算することです。これらの期間(5秒間隔の秒)ごとに少なくとも1つのサンプルがあることがわかっていれば、それは非常に簡単でした。


私はこれを忘れました:x軸に沿ったポイントにはさまざまな間隔があります。

よくわかりません。Y軸はありませんか?

あ、ごめんなさい。タイプミス。私は上でそれを変更しました。

また、もう少し情報を提供する必要があると思います。たとえば、まだグラフを視覚化できません。あなたの目標は何ですか?

すみません。上記の詳細をいくつか追加しました。

回答:


10

2つの問題があります。ポイントが多すぎることと、残りのポイントを滑らかにする方法です。

サンプルを薄くする

リアルタイムで到着する観測が多すぎる場合は、常に単純なランダムサンプリングを使用してサンプルを間引くことができます。これも当てはまるため、ポイントの数は非常に大きくする必要があります。

あなたが持っていると仮定し、N個のポイントを、あなたが唯一の希望のnそれらの。次に、離散均一U(0、N-1)分布からn個の乱数を生成します。これらはあなたが使うポイントです。

これを順次実行する場合、つまり各ポイントで使用するかどうかを決定する場合は、確率pのポイントを受け入れます。したがって、p = 0.01を設定すると、(平均して)100分の1ポイントを受け入れます。

データが不均一に広がっていて、ポイントの密な領域のみを薄くしたい場合は、間引き機能をもう少し洗練させてください。たとえば、pの代わりに、次のようにします。

1pexp(λt)

λtt1p

λp

平滑化

おそらく、単純な移動平均型スキームのようなものです。または、(他の人が提案したように)カーネルスムーザーのようなより高度なものに行くこともできます。シナリオでは急激な落ち込みが非常に早く起きるはずなので、あまり滑らかにしないように注意する必要があります。

この種のものに利用できるC#ライブラリがあるはずです。

結論

必要に応じて薄くし、滑らかにします。


ああ、面白いですが、予測可能である必要があります。つまり、データを表示するたびに同じ結果が得られます。

その場合、選択したポイントのn個のインデックスを生成し、それらのインデックスを保存します。
csgillespie 2010

または、サンプリングする前にシードをRNGに保存します。
Dirk Eddelbuettel、2010

シードに関するダークの解決策は、おそらくより良いオプションです。
csgillespie 2010

1秒あたりの平均の計算は問題ありませんが、特定の1秒のデータがない場合はどうしますか。前後の秒数から補間を行うことができると思いますが、これには特定の(名前付きの)メソッドが必要なので、すでに発明されたものを発明しようとはしません。

9

さて、あなたが探している言葉は「サンプリング」だと思いますが、なぜそれをしたいのかはわかりません。数千のデータポイントはあまり多くありません。または、より少ない数の等間隔の点をプロットするためだけに探していますか?これは通常「ビニング」と呼ばれます。

視覚化を生成することが目標ですか?その場合、生データを保持し、それをスキャッタグラフとしてプロットし、何らかの中心的傾向(回帰線、スプラインなど)をオーバーレイして、テイクホームメッセージが何であるべきかを伝えることができます。

または、何らかの方法で結果を数値で要約するという目標はありますか?その場合は、問題をさらに詳しく説明する必要があります。


うん、視覚化は私が欲しいものです。質問にさらに情報を追加しました。

生データを平滑線でプロットするセカンド。
JoFrhwld 2010

生データを平滑化線でプロットするサードパーティ---別の視覚化として、時間の経過に伴うBPMの変化をプロットすることもできます。
John

5

平均を計算することは、データポイントの数を単に減らすこととは異なるデータセットにつながります。1分あたり1つの心拍数が他の心拍数よりもはるかに速い場合、平滑化プロセスによって信号が失われます。

125-125-0-125-125を100として要約すると、データが示すストーリーは平滑化によって異なります。

時々、心臓は拍動をスキップすることさえありますが、それは興味深いイベントですが、プロットされた心拍数データを見たいと思っています。

したがって、のような式で2点間の距離を計算することをお勧めしますd=sqrt((time1-time2)^2 + (bpm1-bpm2))

プログラムで最小距離を設定します。次に、データを反復処理し、すべてのポイントの後に、dが最小距離よりも小さいすべてのポイントを削除します。

時間とbpmの単位は同じではないので、単位を意味のある方法でスケーリングする方法を見つける方法を考えてみてください。このタスクを正しく実行するには、最終的にグラフを解釈し、どのような情報が不可欠であると考えているかを医師に尋ねる必要があります。


興味深い投稿。私も調べます。あなたはおそらく正しいです。

2

多くのサンプルでBPMが同じままである場合(または気にならない方法で無限に変化している場合)、実際に気になる有効数字にデータを切り捨ててから、ランレングスエンコーディングを実行できます。

たとえば、Rではこのデータは次のとおりです。

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

この出力があります

rle(data)
Run Length Encoding
  lengths: int [1:3] 10 15 15
  values : num [1:3] 0 1 2

1

あなたは十分な情報を提供していません。データポイントを減らす理由は何ですか。数千は最近では何もありません。

同じデータを表示するたびに同じ結果が必要だとすると、単純に平均値をビン化したいと思うでしょう。x軸の間隔が可変です。多分あなたはそれを一貫性のあるものにしようとしているのですか?その場合、ビンの幅をおそらく50ミリ秒、つまり100に設定し、そこにあるすべてのポイントを平均します。ビンの幅を必要なだけ大きくして、データポイントを必要なセットのサイズに減らします。

なぜデータを取り除くのかという理由なしに答えることは本当に難しい質問です。


すみません。上記の詳細をいくつか追加しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.