将序列与缺失值对齐

mat*_*fee 3 r alignment sequence missing-data cross-correlation

我使用的语言是R,但你不一定需要知道R来回答这个问题.

问题: 我有一个序列可以被认为是基本事实,而另一个序列是第一个的移位版本,有一些缺失值.我想知道如何调整两者.

建立

我的序列ground.truth基本上是一组时间:

ground.truth <- rep( seq(1,by=4,length.out=10), 5 ) +
                rep( seq(0,length.out=5,by=4*10+30), each=10 )
Run Code Online (Sandbox Code Playgroud)

想想ground.truth我正在做以下事情:

{take a sample every 4 seconds for 10 times, then wait 30 seconds} x 5
Run Code Online (Sandbox Code Playgroud)

我有一个第二序列observations,其被ground.truth 移位与缺少的值的20%:

nSamples <- length(ground.truth)
idx_to_keep <- sort(sample( 1:nSamples, .8*nSamples ))
theLag <- runif(1)*100
observations <- ground.truth[idx_to_keep] + theLag
nObs     <- length(observations)
Run Code Online (Sandbox Code Playgroud)

如果我绘制这些矢量,这就是它的样子(请记住,将它们视为次数):

在此输入图像描述

我试过的.我想:

  • 计算班次(theLag在上面的例子中)
  • 计算一个idx这样的矢量ground.truth[idx] == observations - theLag

首先,假设我们知道theLag.请注意,这ground.truth[1]不一定observations[1]-theLag.事实上,我们有ground.truth[1] == observations[1+lagI]-theLag一些lagI.

为了计算这个,我想我会使用互相关(ccf函数).

但是,每当我这样做时,我会得到一个最大的延迟.互相关0,意思是ground.truth[1] == observations[1] - theLag.但我已经在我明确的例子尝试这样做肯定observations[1] - theLag不是 ground.truth[1](即修改idx_to_keep,以确保它不会在它具有1).

这种转变theLag不应该影响互相关(不是ccf(x,y) == ccf(x,y-constant)吗?)所以我稍后会解决这个问题.

也许我误解了,因为observations它没有那么多的价值观ground.truth?即使在我设置的更简单的情况下theLag==0,互相关函数仍然无法识别正确的滞后,这使我相信我正在考虑这个错误.

有没有人有一个通用的方法让我去解决这个问题,或者知道一些可以帮助的R函数/软件包?

非常感谢.

flo*_*del 6

对于滞后,您可以计算两组点之间的所有差异(距离):

diffs <- outer(observations, ground.truth, '-')
Run Code Online (Sandbox Code Playgroud)

您的滞后应该是出现的length(observations)时间值:

which(table(diffs) == length(observations))
# 55.715382960625 
#              86 
Run Code Online (Sandbox Code Playgroud)

再检查一遍:

theLag
# [1] 55.71538
Run Code Online (Sandbox Code Playgroud)

一旦找到,问题的第二部分就很简单theLag:

idx <- which(ground.truth %in% (observations - theLag))
Run Code Online (Sandbox Code Playgroud)