1

この形式の時系列データセットがあります。

       Time Val1 Val2
     0 0.68 0.39
    30 0.08 0.14
    35 0.12 0.07
    40 0.17 0.28
    45 0.35 0.31
    50 0.14 0.45
   100 1.01 1.31
   105 0.40 1.20
   110 2.02 0.57
   115 1.51 0.58
   130 1.32 2.01

このデータセットを使用して、FC1=1 および FC2=1 の時刻を抽出します (予測ではありません)。これは、抽出したい注釈付きのポイントで作成したプロットです。

ここに画像の説明を入力

または関数を使用して補間/傍受して値を抽出するソリューションを探しています。たとえば、折り目変更 1 (y 軸など) で直線を描く場合、線が交差する X 軸上のすべての点を抽出したいと考えています。

提案を楽しみにしており、事前に感謝します!

4

1 に答える 1

2

を使用approxfunして補間を行いuniroot、単一根 (線が交差する場所) を見つけることができます。すべての交差点を見つけるには uniroot を複数回実行する必要がありますが、rle関数は開始点の選択に役立つ場合があります。

データの FC 値が 1 に近づくことはなく、1 を超えることもないため、表示されているよりも多くのデータを取得するか、異なる値を意味する必要があります。

詳細をお知らせいただければ (場合によっては、ご希望のプロットを含めることができます)、より詳細なヘルプを提供できる可能性があります。

編集

OK、これは線が交差する場所を見つける R コードです。

con <- textConnection('           Time Val1 Val2
         0 0.68 0.39
        30 0.08 0.14
        35 0.12 0.07
        40 0.17 0.28
        45 0.35 0.31
        50 0.14 0.45
       100 1.01 1.31
       105 0.40 1.20
       110 2.02 0.57
       115 1.51 0.58
       130 1.32 2.01')

mydat <- read.table(con, header=TRUE)

with(mydat, {
    plot( Time, Val1, ylim=range(Val1,Val2), col='green', type='l' )
    lines(Time, Val2, col='blue')
})
abline(h=1, col='red')

afun1 <- approxfun( mydat$Time, mydat$Val1 - 1 )
afun2 <- approxfun( mydat$Time, mydat$Val2 - 1 )
points1 <- cumsum( rle(sign(mydat$Val1 - 1))$lengths )
points2 <- cumsum( rle(sign(mydat$Val2 - 1))$lengths )

xval1 <- numeric( length(points1) - 1 )
xval2 <- numeric( length(points2) - 1 )

for( i in seq_along(xval1) ) {
    tmp <- uniroot(afun1, mydat$Time[ points1[c(i, i+1)] ])
    	xval1[i] <- tmp$root
}

for( i in seq_along(xval2) ) {
    tmp <- uniroot(afun2, mydat$Time[ points2[c(i, i+1)] ])
    	xval2[i] <- tmp$root
}

abline( v=xval1, col='green' )
abline( v=xval2, col='blue')
于 2013-03-08T00:42:52.200 に答える