В моем исследовании каждый человек находится в одном наборе данных.Это данные временного ряда, поэтому каждая строка равна времени.В моем исследовании у меня есть три разные группы.Итак, я хочу усреднить все наборы данных, которые принадлежат к одной группе.В конце я хочу иметь один набор данных, каждая строка которого составляет один час, а значения в ячейке являются средними значениями группы в данный момент времени.Теперь проблема в том, что в моем наборе данных много пропущенных значений.У меня есть два метода, как усреднить значения и агрегировать их по часам.
Вот так выглядит набор данных одного человека (набор данных содержит больше строк, чем указано ниже):
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, тогда результат будет точно таким же.
У меня вопрос, какой из этих двух методов является правильным.Сначала усредните каждый отдельный набор данных одной группы, а затем агрегируйте его за час.Или сначала объединить каждый отдельный набор данных в час, а затем усреднить набор данных по группе?