統計アルゴリズムを使用しないグラフィカルな回答を提供できます。あなたのデータから、「異常な」シーケンスが一定の部分を示しているか、逆に非常に大きな変動があるように見えることがわかりました。導関数に取り組み、この導関数に制限を設定するとうまくいく可能性があります。回避策は次のとおりです。
require(forecast)
test=c(df2$BP)
test=ma(test, order=50)
test=test[complete.cases(test)]
which <- ma(0+abs(diff(test))>1, order=10)>0.1
abnormal=test; abnormal[!which]<-NA
plot(x=1:NROW(test), y=test, type='l')
lines(x=1:NROW(test), y=abnormal, col='red')
機能: 最初に移動平均を使用してデータを「平滑化」し、微小変動が検出されないようにします。次に、「diff」関数 (導関数) を適用し、それが 1 より大きいかどうかをテストします (この値は、なだめる振幅に応じて手動で調整する必要があります)。次に、小さなギャップのない異常なシーケンスの「ブロック」全体を取得するために、ブール値に再度平滑化を適用し、0.1 よりも優れているかどうかをテストして、ゾーンの境界をより適切に把握します。最終的に、斑点のある部分を赤で重ねてプロットします。
これは、1 つのタイプの異常に対して機能します。他のタイプの場合、逆に微分に低いしきい値を設定し、平滑化の調整パラメーターをいじることができます。