Перемещение дисперсии с агрегацией - PullRequest
0 голосов
/ 18 мая 2018

У меня есть 6-минутные данные термопары частоты.Термопары устанавливаются на разной высоте, и на каждой высоте есть число термопар, различающихся радиальным положением

DT_TI_RECORDED      HEIGHT      POS             TEMPERATURE
2018-05-16 00:00:00     1       90              111
2018-05-16 00:00:00     1       180             112
2018-05-16 00:00:00     1       270             113
2018-05-16 00:00:00     2       90              112
2018-05-16 00:00:00     2       180             114
2018-05-16 00:00:00     2       270             115
2018-05-16 00:00:00     3       90              112
2018-05-16 00:00:00     3       180             112
2018-05-16 00:00:00     3       270             113
...
2018-05-16 00:06:00     1       90              111
2018-05-16 00:06:00     1       180             112
2018-05-16 00:06:00     1       270             113
2018-05-16 00:06:00     2       90              112
2018-05-16 00:06:00     2       180             114
2018-05-16 00:06:00     2       270             112
2018-05-16 00:06:00     3       90              114
2018-05-16 00:06:00     3       180             112
2018-05-16 00:06:00     3       270             114
...

Каждые 6 минут для каждой уникальной комбинации высоты и положения, которые я хотел бы рассчитать назад n ежечасная скользящая дисперсия. Допустим, 4 часа.

Оригинальный код, который я пытаюсь продублировать, написан для пакета статистики SAS

    PROC EXPAND DATA=Raw_data
        OUT=Moving_Variance
        ALIGN = BEGINNING
    ;
    by HEIGHT POS;
    ID DT_TI_RECORDED ;
        CONVERT TEMPERATURE = Moving_4hour_Var /  METHOD = none TRANSFORMOUT = (MOVVAR 40); 
    #/* 40 obs at 6min freq = 4hour moving variance*/
    QUIT;

Я потратил пару часов на поиск в Google Iдумаю, что нужная мне библиотека R называется zoo, а нужная мне функция - rollapply, но я не могу понять, как объединить агрегации с rollapply.

Я пробовал

moving_var <- Raw_data %>%
              aggregate(HEIGHT,POS) %>%
              rollapply( TEMPERATURE, width = 40, FUN = sd, fill = NA)

но не работает.Я очень плохо знаком с программированием на R, и это сводит меня с ума.

1 Ответ

0 голосов
/ 18 мая 2018

Попробуйте выполнить следующее агрегирование:

library(zoo)

result = aggregate(temp ~ pos + height,
              data = df,
              FUN = function(x){
                  rollapply(x, width = 40, FUN = var, by = 40)
              }
)

width - это ширина скользящего окна, а by - это количество точек, пропущенных для начальной точки следующего окна.С 40 в каждом вы получите начало каждого окна рядом с концом предыдущего.

Полученный фрейм данных имеет один столбец для каждого окна.Эту структуру можно считать «широкой».Если вы хотите, чтобы он был «длинным» форматом, используйте gather от tidyr или melt от reshape2.

Пример:

df = structure(list(pos = c(0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 
                            180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 
                            0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 
                            270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 
                            180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 
                            0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 
                            270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 
                            180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 
                            0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 
                            270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 
                            180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 0, 90, 180, 270, 
                            0, 90, 180, 270), height = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                            3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                            3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                            3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                            3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                            3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                            3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                            3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                            3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                            3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                            3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), temp = 1:160), .Names = c("pos", 
                            "height", "temp"), row.names = c(NA, -160L), class = "data.frame")

> head(df,20)
   pos height temp
1    0      1    1
2   90      1    2
3  180      1    3
4  270      1    4
5    0      2    5
6   90      2    6
7  180      2    7
8  270      2    8
9    0      3    9
10  90      3   10
11 180      3   11
12 270      3   12
13   0      4   13
14  90      4   14
15 180      4   15
16 270      4   16
17   0      1   17
18  90      1   18
19 180      1   19
20 270      1   20


library(zoo)

result = aggregate(temp ~ pos + height,
              data = df,
              FUN = function(x){
                  rollapply(x, width = 3, FUN = var, by = 3)
              }
)

приведет к:

   pos height temp.1 temp.2 temp.3
1    0      1    256    256    256
2   90      1    256    256    256
3  180      1    256    256    256
4  270      1    256    256    256
5    0      2    256    256    256
6   90      2    256    256    256
7  180      2    256    256    256
8  270      2    256    256    256
9    0      3    256    256    256
10  90      3    256    256    256
11 180      3    256    256    256
12 270      3    256    256    256
13   0      4    256    256    256
14  90      4    256    256    256
15 180      4    256    256    256
16 270      4    256    256    256
...