我在实地考察时从一些鸟类那里收集了大量的时间深度数据。
我试图通过设置深度阈值来对潜水行为进行分类,超过该深度阈值可以说发生了潜水。然而,数据中存在在鸟类内部和鸟类之间变化的背景噪声,这使得确定固定阈值存在问题(对于一只鸟来说,它主要会捕捉到潜水,但对于另一只鸟会捕捉到所有东西 - 见图)。
有没有办法将数据转换为“展平”背景噪声的基线,例如 0,以便深度值 > 0 可以捕获所有尖峰?
我知道有各种聚类技术可以很容易地在这里对潜水行为进行分类,但问题是我之后必须从加速度和深度值的滚动窗口创建一个巨大的数据集(用于深度学习),以及二进制值最后指示是否在该窗口内发生了潜水,并且使用可变阈值执行此操作会使事情变得非常复杂。(理想情况下,我希望能够从给定窗口获取深度向量并运行一行代码,int((d_vec > thrshold).any())以确定是否发生了任何潜水)

更新:
我制定了一个令人满意的解决方案,即采用约 30 个值的滚动窗口并将它们偏移该窗口的中值(被视为“基线”)。这很好地“平滑”了我的情节,同时保留了每次潜水的形状,但我仍然全神贯注地寻求更好的解决方案(或改进下面的代码)......
cat("\rTransforming data...")
k = 30
# take rolling median as baseline for each window
offset = zoo::rollapply(ts_data_d$Depth, width=k, by=k, FUN=median)
offset = rep(offset, each=k)
# match lengths
dif = length(ts_data_d$Depth) - length(offset)
offset = c(offset, rep(tail(offset, 1), dif))
# Zero-offset data
new_series = ts_data_d$Depth - offset
new_series[new_series<0] = 0 # negative depth meaningless
new_series[(length(new_series)-dif):length(new_series)] = 0 # no dives as device removed
ts_data_d$Depth_mod = new_series
