使用从传感器获得的数据(可下载的data1,data2)中的R创建以下曲线。
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
}