你们知道如何解决在血压曲线中发现伪影/异常值的问题吗?我的目标是编写一个程序,找出每个人工制品的开始和结束。以下是不同伪影的一些示例,绿色区域是正确的血压曲线,红色区域是伪影,需要检测:
我的第一个想法是从整个曲线和曲线的短间隔内的许多平均值中计算平均值,然后找出它的不同之处。但是血压变化很大,我认为这行不通,因为它会发现太多不存在的“人工制品”。
感谢您的输入!
编辑:这是两个示例人工制品的一些数据:
在没有任何数据的情况下,只能选择将您指向不同的方法。
首先(不知道您的数据,这始终是一个巨大的缺点),我会向您指出马尔可夫切换模型,可以使用HiddenMarkov 包或HMM包进行分析。(不幸的是RHmm
,第一个链接描述的 -package 不再维护)
您可能会发现研究 Twitter 的异常值检测是值得的。
此外,有许多博客文章探讨了变化点检测或制度变化。我发现这篇 R-bloggers 博客文章对开始很有帮助。它指的是CPM
-package,代表“使用参数和非参数方法进行顺序和批量变更检测”,BCP
-package(“变更点问题的贝叶斯分析”)和ECP
-package(“Non-Parametric Multiple Change-Point多元数据分析”)。您可能想查看前两个,因为您没有多变量数据。
这对你开始有帮助吗?
我可以提供一个不使用任何统计算法的图形答案。从您的数据中,我观察到“异常”序列似乎呈现出恒定的部分,或者相反,呈现出非常高的变化。研究衍生品,并为此衍生品设置限制可能会奏效。这是一种解决方法:
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 以更好地掌握区域的边界。最终,我用红色将斑点部分过度绘制。
这适用于一种异常。对于另一种类型,您可以相反地在导数上设定一个低阈值,并使用平滑的调整参数。