Как обращаться с NA при усреднении агрегированных наборов данных - PullRequest
0 голосов
/ 02 января 2019

В моем исследовании каждый человек находится в одном наборе данных.Это данные временного ряда, поэтому каждая строка равна времени.В моем исследовании у меня есть три разные группы.Итак, я хочу усреднить все наборы данных, которые принадлежат к одной группе.В конце я хочу иметь один набор данных, каждая строка которого составляет один час, а значения в ячейке являются средними значениями группы в данный момент времени.Теперь проблема в том, что в моем наборе данных много пропущенных значений.У меня есть два метода, как усреднить значения и агрегировать их по часам.

Вот так выглядит набор данных одного человека (набор данных содержит больше строк, чем указано ниже):

              DateTime       V2
1: 2018-01-01 20:38:00 2.346598
2: 2018-01-01 20:42:00       NA
3: 2018-01-01 20:46:00       NA
4: 2018-01-01 20:50:00 6.000000
5: 2018-01-01 20:54:00 5.234660
6: 2018-01-01 20:58:00 6.132660

Я использовал методы для этого.

Методone:

Сначала я усреднял каждую строку между двумя наборами данных, а затем агрегировал усредненный набор данных по часам.

daxy<-bind_rows(dx,dy) %>%
  group_by(DateTime) %>%
  summarise_all(funs(mean(., na.rm = TRUE))) #average the two datasets

daxy.1 <- melt(as.data.frame(daxy), id=c("DateTime")) #melt the data in right format
daxy.2 <- aggregate(daxy.1$value,  by=list(format(daxy.1$DateTime, "%Y-%m-%d %H"),variable=daxy.1$variable), 
                    FUN=mean,na.rm = TRUE) #Aggregate all values by hour and calculate the mean for every hour

Метод два:

Для каждого отдельного набора данных я агрегирую первые наборы данных (вычисляем среднее значение для каждого часа), а затем усредняю ​​эти агрегированные наборы данных.

dx.1 <- melt(as.data.frame(dx), id=c("DateTime"))
dx.2 <- aggregate(dx.1$value,  by=list(format(dx.1$DateTime, "%Y-%m-%d %H"),variable=dx.1$variable), 
                  FUN=mean,na.rm = TRUE) #Aggregate individual X by hour
dy.1 <- melt(as.data.frame(dy), id=c("DateTime"))
dy.2 <- aggregate(dy.1$value,  by=list(format(dy.1$DateTime, "%Y-%m-%d %H"),variable=dy.1$variable), 
                  FUN=mean,na.rm = TRUE) #Aggregate individual Y by hour

daxy.3 <-bind_rows(dx.2,dy.2) %>%
  group_by(variable,Group.1) %>%
  summarise_all(funs(mean(., na.rm = TRUE))) #Average aggregated individuals X ad Y 

Теперь я ожидаю, что daxy.2 и daxy.3 имеют одинаковые усредненные значения в час.Но это результат:

головка (daxy.2)

        Group.1 variable        x
1 2018-01-01 20       V2 3.666548
2 2018-01-01 21       V2 5.543472

головка (daxy.3)

   variable    Group.1         x
1    V2    2018-01-01 20    3.732948
2    V2    2018-01-01 21    6.409164

Я знаю, что это расхождение связано с отсутствующими значениями.Если я заменю все пропущенные значения на 0, тогда результат будет точно таким же.

У меня вопрос, какой из этих двух методов является правильным.Сначала усредните каждый отдельный набор данных одной группы, а затем агрегируйте его за час.Или сначала объединить каждый отдельный набор данных в час, а затем усреднить набор данных по группе?

1 Ответ

0 голосов
/ 03 января 2019

Я не совсем понимаю проблему, вот что я сделал. Пожалуйста, не стесняйтесь не считать это ответом.
Во-первых, если вы хотите выполнить усреднение по часам и по группам V2, V3 и V4, вам следует привязать все имеющиеся у вас кадры данных так же, как вы это сделали. Затем попробуйте это:

library(tidyverse)
library(reshape2)

daverage.1 <- melt(daverage, id.vars = "DateTime")

daverage.2 <- aggregate(value ~ format(DateTime, "%Y-%m-%d H") + variable, daverage.1, 
          FUN = mean, na.rm = TRUE)

daverage.3 <- daverage.1 %>%
  mutate(DateHour = format(DateTime, "%Y-%m-%d H")) %>%
  group_by(DateHour, variable) %>%
  summarise(value = mean(value, na.rm = TRUE))

all.equal(as.data.frame(daverage.2), as.data.frame(daverage.3))
#[1] "Names: 1 string mismatch"

Как видите, оба метода дают одинаковые средние значения. Только одно из имен столбцов отличается.

Что касается разных результатов, которые вы получаете, кажется, что вы усредняете сначала по часам. А затем используйте этот результат для усреднения по группам V*. Это совсем не одно и то же. Используйте приведенный выше код, и результаты будут правильными, те, которые вы хотите.

...