2

ここに私のデータがあります:

data1 <- c(726, 718, 699, 737, 743, 734, 726, 722, 715, 714, 752, 750, 
749, 746, 743, 734, 725, 717, 717, 708, 756, 753, 752, 746, 744, 
740, 737, 732, 728, 728, 720, 720, 714, 703, 702, 697, 758, 753, 
753, 746, 743, 734, 720, 706, 697, 761, 744, 749, 741, 738, 738, 
732, 725, 720, 712, 782, 778, 776, 773, 772, 770, 770, 769, 769, 
766, 763, 763, 756, 755, 753, 750, 749, 746, 737, 723, 711, 702, 
685, 782, 779, 778, 778, 776, 776, 775, 772, 770, 770, 766, 763, 
761, 756, 752, 738, 735, 729, 715)

これにより、次のように使用してプロットが得plot(data1)られます。

ここに画像の説明を入力

R を使用して8 つの個別のトレンドを分離するにはどうすればよいですか? それら(シフト)を手動で使用identify(data1)およびマークし、インデックスを使用してそれらを分離できますが、これらの種類のプロットの多くを扱っているため、私の場合は不可能です。プログラムで別々の行を抽出したい。トレンドやタグの変化を特定して8つの時系列を返す統計手法(時系列など)があれば教えてください。

編集

データセット全体のシリーズの数を特定する必要があることを明確にする必要があります。サンプル データの系列の数はたまたま 8 です。しかし、データをプロットしてブレークを手動で特定しない限り、その都度これを知ることはできません。

4

4 に答える 4

3

キリルはここにいると思います ( +1 )。これは、変更点またはブレークポイント分析と呼ばれることもある、研究/知識の重要な領域です。関連する R パッケージにはstrucchange changepoint、Kiril が言及した と が含まれますbcp

strucchangeは、最小二乗回帰を使用して、変更のbreakpoints()数が通知されたときに変更の場所を推定します (ここでは役に立ちません)。

changepointKiril が言ったように、Scott と Knott の Binary Segmentation、Auger と Lawrence の Segment Neighbourhoods、Killick らの Pruned Exact Linear Time (PELT) アルゴリズムなど、いくつかのアルゴリズムがあります。これは素晴らしいパッケージですが、私の非常に限られた経験では、これらの機能には多くの調整が必要です (これは行う価値があります)。

重要なタスクについては、データに関する知識を活用してより詳細なモデルを作成し、最終的にいくつかのメソッドを組み合わせてアンサンブル分類子を作成したいと考えています。

bcpしかし、単純なクリック アンド ゴーでは、Barry と Hartigan のベイズ手順の MCMC ベースの近似を使用するものを使用できます。

library(bcp)
changefit <- bcp(data1)
plot(changefit)

ここに画像の説明を入力

グループを分離する 1 つの方法は、事後確率のしきい値とsplit()それに基づくデータを選択することです。

data2 <- data.frame(data=data1, prob = changefit$posterior.prob)
threshold <- 0.90
split(data2,c(0, cumsum( ifelse (data2$prob > threshold, 1, 0))))
#split will warn about unequal lengths
于 2012-12-06T00:32:30.667 に答える
2

単調ではなく、「アップストローク」がしきい値よりも大きいことを確認する必要があるペアが 1 つあります。

labs=factor( c(0, cumsum( data1[-1] - data1[-length(data1)] > 7 )), 
             labels=letters[1:8])
plot(data1, pch=as.character(labs) )

ここに画像の説明を入力

サイクル数の自動計算が必要ですか? 次の長さを使用できます。

unique (factor( c(0, cumsum( data1[-1] - data1[-length(data1)] > 7 )) )) 

... この場合。ただし、6 を超えるアップストロークによって定義されるブレークを喜んで受け入れる必要があります。

于 2012-12-05T22:12:53.917 に答える
2

OK、あなたの問題を解決する統計的手法があります。私の理解が正しければ、実際にやりたいことは、データの統計的特性が変化する場所を検出すること、つまり、さまざまな動作を検出することです。これは「変更点検出」と呼ばれる手法によって行われ、R には「変更点」と呼ばれるこのための非常に優れたパッケージがあります'。かなり新しい計算を行うための線形アルゴリズムを使用します。私が間違っていなければ、ここで使用されている PELT アルゴリズムはかなり優れており、約 2 年前に発明されたものであり、かなり現代的なアプローチであると思います。データの平均と分散の両方で行われた変更を検出する関数「cpt.meanvar」を見てください。これは非常によくできていて、忍耐強くさえすれば、すべてのデータの変更を自動的に検出するのに十分な方法を見つけることができます。

于 2012-12-05T23:20:01.477 に答える
0

パッケージdbscanのような密度ベースのクラスター アルゴリズムを使用してみることができます。fpc

于 2013-05-04T18:11:12.213 に答える