Скользящая средняя со сгруппированными данными - PullRequest
0 голосов
/ 10 ноября 2018

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

Кроме того, я хотел бы построить вывод, в котором измерение для каждой группы нанесено на график относительно номера группы пациентов.

Может кто-нибудь помочь мне, пожалуйста? Я пытался закодировать этот анализ, но я не уверен, что у меня все хорошо.

  SURG_DATE VES_2A Index
 21/05/2013    1     1
 10/06/2013    1     1
 06/01/2014    1     1
 29/01/2014    0     1
 11/03/2014    3     2
 05/04/2014    1     2
 06/04/2014    1     2
 14/05/2014    1     2
 28/05/2014    3     3
 02/09/2014    2     3
 16/09/2014    2     3
 17/09/2014    0     3
 21/10/2014    2     5
 05/12/2014    0     5
 19/12/2014    2     5
 11/01/2015    1     5
 15/01/2015    1     6
 17/01/2015    2     6
 24/01/2015    1     6
 19/02/2015    1     6

Код, который я пробовал:

tapply(test$VES_2A, 
       test$Index, 
       function(x) rollmean(x, 12, na.pad=TRUE))

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Это немного двусмысленно, но я думаю, что вы хотите это:

test <- cbind(time=rownames(test), test)  # first add a time variable

# then create a list with rolling mean for each id and time
ls1 <- lapply(seq_along(test$time), 
              function(x) cbind(time=x,  # time variable
                                with(test[test$time %in% 1:x, ], 
                                     aggregate(list(VES_2A=VES_2A), 
                                               list(Index=Index), mean))  # rolling mean
                                ))

tot <- transform(t(sapply(ls1, colMeans)), Index="total")  # occasionally add a total column

long <- rbind(do.call(rbind, ls1), tot)  # bind all rows together into long format data frame
wide <- reshape2::dcast(long, time ~ Index)  # reshape to wide w/ e.g. reshape2::dcast()
rm(ls1, tot)  # clean up

Уступая

> wide
   time    1        2        3        5        6    total
1     1 1.00       NA       NA       NA       NA 1.000000
2     2 1.00       NA       NA       NA       NA 1.000000
3     3 1.00       NA       NA       NA       NA 1.000000
4     4 0.75       NA       NA       NA       NA 0.750000
5     5 0.75 3.000000       NA       NA       NA 1.875000
6     6 0.75 2.000000       NA       NA       NA 1.375000
7     7 0.75 1.666667       NA       NA       NA 1.208333
8     8 0.75 1.500000       NA       NA       NA 1.125000
9     9 0.75 1.500000 3.000000       NA       NA 1.750000
10   10 0.75 1.500000 2.500000       NA       NA 1.583333
11   11 0.75 1.500000 2.333333       NA       NA 1.527778
12   12 0.75 1.500000 1.750000       NA       NA 1.333333
13   13 0.75 1.500000 1.750000 2.000000       NA 1.500000
14   14 0.75 1.500000 1.750000 1.000000       NA 1.250000
15   15 0.75 1.500000 1.750000 1.333333       NA 1.333333
16   16 0.75 1.500000 1.750000 1.250000       NA 1.312500
17   17 0.75 1.500000 1.750000 1.250000 1.000000 1.250000
18   18 0.75 1.500000 1.750000 1.250000 1.500000 1.350000
19   19 0.75 1.500000 1.750000 1.250000 1.333333 1.316667
20   20 0.75 1.500000 1.750000 1.250000 1.250000 1.300000

Участок

library(ggplot2)
ggplot(long, aes(time, VES_2A, color=Index)) +
  geom_line()

enter image description here

Скажите мне, что вы думаете, надеюсь, это то, что вы хотели.

Данные

test <- structure(list(VES_2A = c(1L, 1L, 1L, 0L, 3L, 1L, 1L, 1L, 3L, 
                                  2L, 2L, 0L, 2L, 0L, 2L, 1L, 1L, 2L, 1L, 1L), Index = c(1L, 1L, 
                                                                                         1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 6L, 6L, 
                                                                                         6L, 6L)), class = "data.frame", row.names = c(NA, -20L))
0 голосов
/ 10 ноября 2018

Использование данных, воспроизводимых в примечании в конце, позволяет получить скользящее среднее текущего и двух предыдущих наблюдений отдельно для каждого значения индекса и добавить порядковый номер. Поскольку каждое значение индекса занимает 4 строки, мы используем 1: 4.

Из вопроса о том, что должно быть нанесено, не ясно, но мы показываем скользящее среднее и seq для каждого индекса на одной панели. Для классической графики замените screen = 1 на screen = colnames(wide), если вам нужны отдельные панели. Для ggplot2 для получения отдельных панелей пропустите facet=NULL.

library(zoo)

roll <- function(x) rollmeanr(x, 3, fill = NA)
df3 <- transform(df, mean3 = ave(VES_2A, Index, FUN = roll), seq = 1:4)

wide <- na.omit(read.zoo(df3[-1], index = "seq", split = "Index"))

# classic graphics
plot(wide, screen = 1, type = "o", pch = colnames(wide))

# ggplot2 gtraphics
library(ggplot2)
autoplot(wide[-3], facet = NULL)

Примечание

Lines <- "  VES_2A Index
     1     1
     1     1
     1     1
     0     1
     3     2
     1     2
     1     2
     1     2
     3     3
     2     3
     2     3
     0     3
     2     5
     0     5
     2     5
     1     5
     1     6
     2     6
     1     6
     1     6"
df <- read.table(text = Lines, header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...