линейная интерполяция временных рядов 15 Гц для соответствия временным рядам 25 Гц в R

Привет, у меня есть следующие данные, записанные с частотой 15 Гц, и я хочу передискретизировать их с помощью линейной интерполяции до 25 Гц. Каков наилучший способ добиться этого? Вот первая секунда моего набора данных:

     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 Гц.

  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 Гц?

Кажется, есть явные пакеты для обработки временных рядов в R, такие как zoo и xts, но я не уверен, нужны ли они мне. Оба набора данных запускаются одновременно, поэтому после повышения дискретизации я мог просто сопоставить их по номеру строки.

Спасибо за вашу помощь!


person florian    schedule 09.08.2014    source источник
comment
Страница справки для approx довольно подробно описывает, как указать x-значения, при которых вы хотите интерполяции! Если хотите, используйте lm, чтобы создать уравнение для линейной подгонки, и передайте ему вектор данных.   -  person Carl Witthoft    schedule 09.08.2014
comment
Не могли бы вы рассказать немного подробнее, пожалуйста? Я думаю, что у меня есть общая проблема с пониманием приблизительной функциональности ... может быть, есть и лучшая функция для достижения того, что я хочу.   -  person florian    schedule 09.08.2014


Ответы (2)


Я сделаю некоторые предположения: во-первых, столбцы данных «YTSIMTMD», «RBDDLO_0» и «RBDDGS_0» содержат непрерывные данные, поэтому можно использовать линейную интерполяцию. Во-вторых, этот столбец IDLWMWC1 содержит двоичные данные, поэтому мы будем интерполировать, используя метод = константа, который выбирает значение данных в последний момент времени данных перед временем интерполяции. Учитывая это, следующее использует приблизительно для интерполяции и объединения их во фрейм данных. Времена интерполяции генерируются с временным интервалом 1/частота. Я помещаю ваши данные во фрейм данных под названием 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.

person WaltS    schedule 09.08.2014
comment
Ваши предположения верны - я только что понял, насколько плохо я умею задавать вопросы - извините за это, я думаю, что это было из-за моего непонимания примерной функциональности, которую я понял во время обеда. Для меня действительно важными переменными являются RBDDLO_0,RBDDGS_0, но интересно посмотреть, как это было бы сделано для других! Итак, если я правильно понимаю ваш код, вы сначала создаете временную последовательность с шагом 40 мс в первой строке... затем вы используете приблизительно, чтобы соответствовать этой последовательности. cbind и sapply становятся необходимыми, поскольку вы хотите получить все переменные в одной строке, вместо того, чтобы делать это var за var? - person florian; 09.08.2014
comment
Вот так. Если вы собираетесь активно использовать R, вероятно, стоит познакомиться с функциями применения. sapply является одним из наиболее распространенных. - person WaltS; 09.08.2014

Вот пример использования 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')

В вашем случае входными данными являются time для значений x и все, с чем вы работаете для значений y. Затем просто введите последовательность «новых» значений x с интервалом 25 Гц (0,04 секунды), чтобы получить нужные значения.

person Carl Witthoft    schedule 09.08.2014