获得曲线的转折点

时间:2018-04-11 02:40:42

标签: r time-series curve

使用从传感器获得的数据(可下载的data1data2)中的R创建以下曲线。

enter image description here

X轴是以毫秒为单位的时间,Y轴是两种抗体之间的结合响应(比如AB.2和AB.3)。我在算法上试图获得曲线的不同阶段的起始和结束时间点(由垂直线标记),特别是最后阶段(由蓝色垂直线标记)。一些曲线具有垂直的U形起始或拖尾部分,也应该被移除 使用以下代码创建曲线:

Load(data2)
ggplot(ff3,aes(x=time,y= bindingValue,color= SecondAb)) + geom_line()+
geom_point()+theme(legend.position="none")+ 
  geom_vline(xintercept=c(175,529.7782,1257.4810,1566.2750,1980),
     color=c('black' ,'black','black','blue','blue'))

对于我的第一个问题,我尝试了changepoint包,但它给了我太多的改变点。我试图使用以下两个函数来获取时间点,但它没有正确获得正确的转折点,因为它找到局部最小值并且调整阈值是另一个问题,因为我有来自不同数据集的数千条曲线。

inflect <- function(x, threshold = 1){
up   <- sapply(1:threshold, function(n) c(x[-(seq(n))], rep(NA, n)))
down <-  sapply(-1:-threshold, function(n) c(rep(NA,abs(n)), x[- 
seq(length(x), length(x) - abs(n) + 1)]))
a    <- cbind(x,up,down)
minima = which(apply(a, 1, min) == a[,1])
as.vector(minima)
}

transition_values <-function(dd){
threshold<-ceiling(max(dd$time,na.rm = T)/60)
w <-dd$time[inflect(dd$bindingValue,threshold)]
w
}

调用该函数给我:

transition_values(ff3)
# 99.16498  529.77820  895.91300 1257.48100 (Here getting two points correct here)

如何以编程方式获得确切的转折点?

对于我的第二个问题(删除曲线的U形部分)我试图使用以下代码删除异常值但我正在寻找更有效的东西

remove_outliers <- function(x, na.rm = TRUE, ...) {
qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
H <- 1.5 * IQR(x, na.rm = na.rm)
y <- x
y[x < (qnt[1] - H)] <- NA
y[x > (qnt[2] + H)] <- NA
y
}

0 个答案:

没有答案