2

この質問は、数列の最大値の数と位置を決定するためのアルゴリズムに関するものです。したがって、質問には統計的な趣がありますが、特定の統計的特性には興味がなく、R で解決する必要があるため、プログラミングに傾いています。この質問に答えるために統計を使用することは問題ありません。必須ではありません。

時系列データ (つまり、順序付けられた数列) のサイクルの最大値を抽出したいと考えています。このようなデータの例は、太陽フレアの時系列 (~11 年周期、9 ~ 14 年) です。サイクルは完全な間隔で繰り返されるわけではなく、ピークは常に同じ高さではありません。

このためのアルゴリズムを説明している最近の論文を見つけましたが、その論文では実際に例として太陽フレアが使用されています (図 5、Scholkmann et al. 2012、アルゴリズム)。私は、このアルゴリズム、または同等に効果的なアルゴリズムが R パッケージとして利用できることを望んでいました。

「自動マルチスケールベースのピーク検出」に関するショルクマンの論文へのリンク http://www.mdpi.com/1999-4893/5/4/588

「pastecs」パッケージの「turningpoints」機能を試してみましたが、感度が高すぎるようです (つまり、検出されたピークが多すぎます)。最初に時系列を平滑化しようと考えましたが、これが最善のアプローチであるかどうかはわかりません (私は専門家ではありません)。

ご指摘ありがとうございます。

4

2 に答える 2

3

Rのパッケージを使用したソリューションを次に示します。最大値に近づいwmtsaたら、最大値の検索を容易にする独自の小さな関数を追加しました。wmtsa::wavCWTPeaks

PeakCycle <- function(Data=as.vector(sunspots), SearchFrac=0.02){
    # using package "wmtsa"
    #the SearchFrac parameter just controls how much to look to either side 
    #of wavCWTPeaks()'s estimated maxima for a bigger value
    #see dRange
    Wave <- wavCWT(Data)
    WaveTree <- wavCWTTree(Wave)
    WavePeaks <- wavCWTPeaks(WaveTree, snr.min=5)
    WavePeaks_Times <- attr(WavePeaks, which="peaks")[,"iendtime"]

    NewPeakTimes <- c()
    dRange <- round(SearchFrac*length(Data))
    for(i in 1:length(WavePeaks_Times)){
        NewRange <- max(c(WavePeaks_Times[i]-dRange, 1)):min(c(WavePeaks_Times[i]+dRange, length(Data)))
        NewPeakTimes[i] <- which.max(Data[NewRange])+NewRange[1]-1
    }

    return(matrix(c(NewPeakTimes, Data[NewPeakTimes]), ncol=2, dimnames=list(NULL, c("PeakIndices", "Peaks"))))
}

dev.new(width=6, height=4)
par(mar=c(4,4,0.5,0.5))
plot(seq_along(as.vector(sunspots)), as.vector(sunspots), type="l")
Sunspot_Ext <- PeakCycle()
points(Sunspot_Ext, col="blue", pch=20)

ここに画像の説明を入力

于 2013-05-03T01:48:14.590 に答える