Временной ряд графика с известной ошибкой (ggplot2) - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю с оценками American Community Survey (ACS) за 1 год для определенного местоположения в течение нескольких лет.Например, я пытаюсь представить, как со временем меняется соотношение мужчин и женщин, ездящих на велосипеде на работу.Из ACS я получаю оценки и стандартную ошибку, которую затем могу использовать для вычисления верхней и нижней границ оценок.

Таким образом, упрощенная структура данных в широком формате выглядит следующим образом:

| Year | EstimateM | MaxM | MinM | EstimateF | MaxF | MinF |
|------|-----------|------|------|-----------|------|------|
| 2005 | 3.0       | 3.5  | 2.5  | 2.0       | 2.3  | 1.7  |
| 2006 | 3.1       | 3.5  | 2.6  | 2.0       | 2.3  | 1.7  |
| 2007 | 5.0       | 4.2  | 5.8  | 2.5       | 3.0  | 2.0  |
| ...  | ...       | ...  | ...  | ...       | ...  | ...  |

Если бы я хотел только построить оценки, я бы melt данные с двумя переменными Estimate имели бы measure.vars

GenderModeCombined_long <- melt(GenderModeCombined,
                            id = "Year",
                            measure.vars = c("EstimateM",
                                             "EstimateF")

Длинные данные можно легко построитьс ggplot2

ggplot(data=GenderModeCombined_long,
  aes(x=year, y=value, colour=variable)) +
  geom_point() +
  geom_line()

Создает график, подобный следующему:

Imgur

(извините, не хватает представителя для публикации изображений)

Я застрял в том, как добавить панели ошибок к двум оценочным графикам.Я мог бы добавить их как measure vars к расплавленному набору данных, но тогда как мне сказать ggplot, что должно быть отображено в виде значений, а что - в виде столбцов ошибок?Нужно ли создавать отдельный фрейм данных только с минимальными / максимальными данными, а затем загружать их отдельно?

geom_errorbar(data = errordataMmax, aes(ymax = ??, ymin = ??)) 

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

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Как объяснил lbusett , ответ на этот вопрос не столько о графике, сколько о преобразовании данных из широкой в ​​длинную форму.Проблема здесь заключается в том, что существует несколько столбцов значений, то есть Estimate, Max, Min для каждого пола.

Начиная с версии v1.9.6 (на CRAN 19 сентября 2015 г.), Воплощение функции melt() позволяет плавно, т.е. преобразовывать из широкого в длинный формат, в несколько столбцов за один раз:

library(data.table)
options(datatable.print.class = TRUE)
cols <- c("Estimate", "Max", "Min")
long <- melt(setDT(GenderModeCombined), id.vars = "Year", measure.vars = patterns(cols), 
             value.name = cols, variable.name = "Gender")[
               , Gender := forcats::lvls_revalue(Gender, c("M", "F"))][]
long
    Year Gender Estimate   Max   Min
   <int> <fctr>    <num> <num> <num>
1:  2005      M      3.0   3.5   2.5
2:  2006      M      3.1   3.5   2.6
3:  2007      M      5.0   4.2   5.8
4:  2005      F      2.0   2.3   1.7
5:  2006      F      2.0   2.3   1.7
6:  2007      F      2.5   3.0   2.0

Теперь у нас есть три наблюдения для Year и Gender, которые можно построить по желанию:

library(ggplot2)
ggplot(long, aes(x = Year, y = Estimate, colour = Gender)) +
  geom_point() +
  geom_line() +
  geom_errorbar(aes(ymax = Max, ymin = Min), width = 0.1)

enter image description here

Обратите внимание, что на этом графике также показаны линии в дополнение к точкам и барам ошибок.Это связано с тем, что Year имеет тип целое число , которое ggplot2 распознается как непрерывная переменная.

Данные

'Функция s fread() очень удобна для чтения различных форматов данных.Таким образом, мы можем прочитать данные, опубликованные ОП, только с несколькими изменениями:

library(data.table)
GenderModeCombined <- fread(
"| Year | EstimateM | MaxM | MinM | EstimateF | MaxF | MinF |
| 2005 | 3.0       | 3.5  | 2.5  | 2.0       | 2.3  | 1.7  |
| 2006 | 3.1       | 3.5  | 2.6  | 2.0       | 2.3  | 1.7  |
| 2007 | 5.0       | 4.2  | 5.8  | 2.5       | 3.0  | 2.0  |
", drop = c(1L, 9L))

GenderModeCombined
    Year EstimateM  MaxM  MinM EstimateF  MaxF  MinF
   <int>     <num> <num> <num>     <num> <num> <num>
1:  2005       3.0   3.5   2.5       2.0   2.3   1.7
2:  2006       3.1   3.5   2.6       2.0   2.3   1.7
3:  2007       5.0   4.2   5.8       2.5   3.0   2.0
0 голосов
/ 29 декабря 2018

Добро пожаловать на SO.Проблема здесь в том, что у вас есть три «явные» переменные (Estimate, Min и Max) и «неявная» (пол), которая закодирована в именах столбцов.Чтобы решить эту проблему, нужно сделать «пол» явной группирующей переменной.После перехода к длинному формату создайте переменную пола, удалите указание пола из ключевого столбца (переменной) и затем вернитесь к широкоформатному формату.Примерно так будет работать:

library(ggplot2)
library(dplyr)
library(tidyr)
library(tibble)

GenderModeCombined <- tibble::tribble(
  ~Year,   ~EstimateM,   ~MaxM,   ~MinM,   ~EstimateF,   ~MaxF,   ~MinF,  
  2005,         3.0,    3.5,    2.5,         2.0,    2.3,    1.7,  
  2006,         3.1,    3.5,    2.6,         2.0,    2.3,    1.7,  
  2007,         5.0,    4.2,    5.8,         2.5,    3.0,    2.0
)

GenderModeCombined.long <- GenderModeCombined %>% 
  # switch to long format
  tidyr::gather(variable, value, -Year,  factor_key = TRUE) %>% 
  # add a gender variable
  dplyr::mutate(gender   = stringr::str_sub(variable, -1)) %>% 
  # remove gender indication from the key column `variable`
  dplyr::mutate(variable = stringr::str_sub(variable, end = -2)) %>%
  # back to wide format
  tidyr::spread(variable, value)

GenderModeCombined.long
#> # A tibble: 6 x 5
#>    Year gender Estimate   Max   Min
#>   <dbl> <chr>     <dbl> <dbl> <dbl>
#> 1  2005 F           2     2.3   1.7
#> 2  2005 M           3     3.5   2.5
#> 3  2006 F           2     2.3   1.7
#> 4  2006 M           3.1   3.5   2.6
#> 5  2007 F           2.5   3     2  
#> 6  2007 M           5     4.2   5.8

ggplot(data=GenderModeCombined.long,
       aes(x=Year, y=Estimate,colour = gender)) +
  geom_point() +
  geom_line() + 
  geom_errorbar(aes(ymax = Max, ymin = Min))  

Создано в 2018-12-29 пакетом Представить (v0.2.1)

...