线性插值15 Hz时间序列,与R中的25 Hz时间序列匹配

时间:2014-08-09 11:09:42

标签: r linear-interpolation

嗨我有以下15Hz记录的数据,我想使用线性插值重新采样到25 Hz。实现这一目标的最佳方法是什么? 这是我数据集的第一秒:

     RecordFile YTSIMTMD RBDDLO_0  RBDDGS_0 IDLWMWC1    time timeNF
864 2C01MUC.txx 85535.10    -0.31 -0.348873        1 0.00000      0
865 2C01MUC.txx 85535.17    -0.31 -0.348873        1 0.06667   6667
866 2C01MUC.txx 85535.23    -0.31 -0.348873        0 0.13334  13334
867 2C01MUC.txx 85535.30    -0.31 -0.348832        0 0.20000  20000
868 2C01MUC.txx 85535.37    -0.31 -0.348832        0 0.26667  26667
869 2C01MUC.txx 85535.43    -0.31 -0.348832        0 0.33334  33334
870 2C01MUC.txx 85535.50    -0.31 -0.348832        1 0.40000  40000
871 2C01MUC.txx 85535.57    -0.31 -0.348796        1 0.46667  46667
872 2C01MUC.txx 85535.63    -0.31 -0.348796        1 0.53334  53334
873 2C01MUC.txx 85535.70    -0.31 -0.348796        1 0.60000  60000
874 2C01MUC.txx 85535.77    -0.31 -0.348796        0 0.66667  66667
875 2C01MUC.txx 85535.83    -0.31 -0.348767        0 0.73334  73334
876 2C01MUC.txx 85535.90    -0.31 -0.348767        0 0.80000  80000
877 2C01MUC.txx 85535.97    -0.31 -0.348767        0 0.86667  86667
878 2C01MUC.txx 85536.03    -0.31 -0.348767        1 0.93334  93334
879 2C01MUC.txx 85536.10    -0.31 -0.348735        1 1.00000 100000

之后我想将它与以25 Hz

记录的数据集匹配
  vpName vpID origIndex areaNum areaName startMS endMS durationMS startF endF durationF accumIndex
1   2C01    1         1       2      ATT       0   560        560      0   14        14          1
2   2C01    1         1       2      ATT       0   560        560      0   14        14          1
3   2C01    1         1       2      ATT       0   560        560      0   14        14          1
4   2C01    1         1       2      ATT       0   560        560      0   14        14          1
5   2C01    1         1       2      ATT       0   560        560      0   14        14          1
6   2C01    1         1       2      ATT       0   560        560      0   14        14          1

我发现approx似乎是R中线性插值的线性插值,但是我不确定使用哪些参数来对15到25 Hz的数据进行上采样?

似乎有一个明确的包来处理R中的时间序列像zoo和xts,但我不确定我是否需要它们。 两个数据集同时开始,因此在上采样之后我可以简单地通过rownumber匹配。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

以下是一个示例,使用approxfun创建一个与输入数据线性拟合的函数:

xin<-seq(1,26,by=5)
 yin<-2.5+3*xin
 myfun<-approxfun(xin,yin)
 plot(xin,yin)
 newy<-myfun(seq(3,18,by=5))
 points(seq(3,18,by=5),newy)
 points(seq(3,18,by=5),newy,col='red')

在您的情况下,x值的输入为time,y值的输入为{{1}}。然后,以25Hz的间隔(0.04秒)输入一系列“新”x值,以获得所需的拟合值。

答案 1 :(得分:1)

我将做出一些假设 - 首先,数据列“YTSIMTMD”“RBDDLO_0”和“RBDDGS_0”包含连续数据,因此可以使用线性插值。其次,该列IDLWMWC1包含二进制数据,因此我们将使用method = constant进行插值,该方法在插值时间之前的最后一个数据时间选择数据值。鉴于此,以下使用近似进行插值并将它们组合成数据帧。插值时间以1 / freq的时间间隔生成。我将您的数据放入名为xx的数据框中。

t_seq <- seq(min(xx$time), max(xx$time),1/25)
ap <- cbind(t_seq, sapply(xx[,c("YTSIMTMD", "RBDDLO_0","RBDDGS_0")], 
                      function(y, x, nout) approx(x, y, nout, method="linear")$y, x=xx$time, nout=t_seq ))
ap <- cbind(ap,IDLWMWC1=approx(xx$time, xx$IDLWMWC1, t_seq, method="constant")$y)

我不太明白你的第二组数据与第一组数据有什么关系,但如果它只是同时开始的1/25间隔的附加信息,你可以使用cbind组合这两个数据框。