R - 在血压曲线中找出异常值/假象的方法

时间:2015-12-17 14:36:12

标签: r outliers drift

你们有没有想过如何解决血压曲线中发现人工制品/异常值的问题?我的目标是编写一个程序,找出每个人工制品的起点和终点。以下是不同人工制品的一些例子,绿色区域是正确的血压曲线,红色区域是人工制品,需要检测:

enter image description here

enter image description here

enter image description here

这是全血压曲线的一个例子: enter image description here

我的第一个想法是从整条曲线计算平均值,并在曲线的短间隔内计算许多均值,然后找出它的不同之处。但血压变化很大,以至于我认为这不会起作用,因为它会发现太多不存在的"人工制品"。

感谢您的投入!

编辑:以下是两个示例人工制品的一些数据:

Artefact1

Artefact2

2 个答案:

答案 0 :(得分:3)

没有任何数据,只有指向不同方法的选项。

首先(不知道您的数据,这总是一个巨大的缺点),我会指向Markov switching models,可以使用HiddenMarkov - 包或HMM进行分析-包。 (不幸的是,不再保留第一个链接描述的RHmm - 包)

您可能会发现值得研究推特outlier detection

此外,有许多博客文章涉及变更点检测或政权更改。我发现this R-bloggers blog帖子对一开始非常有帮助。它指的是CPM - 包,它代表"顺序和批量变化检测使用参数和非参数方法",BCP - 包("贝叶斯变换分析)点问题")和ECP - 包("多变量数据的非参数多变点分析")。您可能希望查看前两个,因为您没有多变量数据。

这有助于您入门吗?

答案 1 :(得分:0)

我可以提供不使用任何统计算法的图形答案。根据您的数据,我观察到"异常"序列似乎呈现恒定部分,或相反,非常高的变化。处理衍生工具,并对此衍生工具设置限制可能有效。这是一个解决方法:

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')

它的作用:第一次&#34;平滑&#34;具有移动平均值的数据可防止检测到微观变化。然后它应用&#34;差异&#34;函数(导数)并测试它是否大于1(此值将根据舒缓幅度手动调整)。然后,为了得到一个完整的&#34;块&#34;在没有微小间隙的异常序列中,我们再次对布尔值应用平滑并测试它优于0.1以更好地掌握区域的边界。最后,我用红色过度绘制了斑点部分。

enter image description here

这适用于一种异常。对于另一种类型,您可以在导数上反向构成一个低阈值,并使用平滑的调整参数。