Как разделить вывод по временным точкам в длинноформатных данных временных рядов?

#r #dplyr #time-series #missing-data

Вопрос:

Я хотел бы использовать gg_miss_var() из naniar пакета, чтобы посмотреть количество отсутствующих данных в каждый момент времени в моем фрейме данных. Фрейм данных включает данные временных рядов в длинном формате.

У меня есть код, который работает с df в целом (см. № 1 в Коде ниже). Как я могу расширить это, чтобы получить результат, разделенный по времени (см. № 2 в Коде ниже для моей попытки кода)?

Чтобы уточнить, что я хотел бы сделать, это, по сути, повторить #1 в коде, используя данные из каждой точки времени (для переменной точки времени). Поэтому количество отсутствующих данных для каждой переменной будет представлено для базовых данных, данных за 1 год и данных за 2 года отдельно. В настоящее время #1 в Коде рассматривает недостающие данные для всех временных точек (т. е. базовой линии, года 1, года 2) вместе взятых.

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

Ниже приведен пример фрейма данных (см. Пример данных). Обратите внимание, что фрейм данных, с которым я работаю, намного больше (т. Е. N = ~21 900)

Код

 library(tidyverse)
library(naniar) # for gg_miss_var()

# 1. All missing data
gg_miss_var(df[,c("Score.1","Score.2","Score.3","Score.4")]) 

# 2. Missing data split by timepoint [does not work]
df %>% 
  group_by(Timepoint) %>% 
  gg_miss_var(.[,c("Score.1","Score.2","Score.3","Score.4")]) %>%
  ungroup()

 

Примеры Данных

 
df <- structure(list(ID = c(1L, 1L, 1L, 2L, 
2L, 3L),  Timepoint = c("baseline", "year1", "year2", 
"baseline", "year1", "baseline"), Score.1 = c(NA, 6, 4, 4, 5, 5), Score.2 = c(11, 
10, 8, 8, 8, 9), Score.3 = c(4, NA, 9, 10, 8, 6), Score.4 = c(22, 
50, 33, 28, 27, 33)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

 

Пример Вывода

Ниже приведен результат, полученный для #1 в коде. Мне бы хотелось получить копии приведенного ниже, используя только данные за соответствующий момент времени (т. Е. базовый уровень, год1, год2).

введите описание изображения здесь

Комментарии:

1. Можете ли вы уточнить, что вы подразумеваете под «разделением»? Если у вас одинаковый номер каждого класса {baseline, year1, yeare2} Timepoint , вы можете pivot_wider указать этот столбец и получить отдельный столбец для каждого класса. Если вы хотите анализировать каждый класс временных точек отдельно, вы можете создать отдельные наборы данных, используя filter . Можете ли вы привести пример того, что вы хотите в конечном итоге сделать?

2. Пожалуйста, добавьте используемый пакет, так gg_miss_var как, насколько я знаю, это не базовая функция R.

3. Как выглядит ваш ожидаемый результат?

Ответ №1:

Вы этого ожидаете?

 library(tidyverse)
library(naniar)
df %>% select(-ID) %>% 
  group_by(Timepoint) %>% 
  gg_miss_var(facet = Timepoint)
 

введите описание изображения здесь

Если только вы не предпочитаете три отдельных участка. Тогда сделайте это:

 df %>% select(-ID) %>% 
  group_by(Timepoint) %>% 
  group_map(~gg_miss_var(.x) ggtitle(.y))
 

введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь

Это тот эффект, которого вы ожидали?