Построение месячных временных рядов в R должно быть проще - PullRequest
0 голосов
/ 21 октября 2018

R может быть удивительно мощным и разочаровывающим одновременно.Это делает обучение R не-статистикам (бизнес-студентам в моем случае) довольно сложным делом.Позвольте мне проиллюстрировать это простой задачей.

Допустим, вы работаете с набором данных временных рядов за месяц.Большинство бизнес-данных обычно отображаются в виде месячных временных рядов.Мы хотели бы построить данные таким образом, чтобы ось X отображала комбинацию месяца и года.Например, январь 2017 года может быть изображен как 2017-01.Это должно быть просто с командой заговора.Не верно.

Генерация данных Давайте проиллюстрируем это на примере.Я сгенерирую случайный временной ряд ежемесячных данных для 120 наблюдений, представляющих 10-летнюю информацию, начинающуюся в январе 2007 года и заканчивающую в декабре 2017 года. Вот код.

set.seed(1234)
x <- rnorm(120)
d <-.07
y <- cumsum(x+d)*-1

Поскольку мы не объявили данные какВременной ряд, нанесение его с помощью команды plot не вернет предполагаемые метки для оси X.См. Код и диаграмму ниже.

plot(y, type="l")

enter image description here

Теперь должна быть опция на сюжете или plot.ts команда для отображения временной оси для определенной оси x.Я не мог найти один.Итак, вот обходной путь.

  1. Объявите набор данных как временные ряды.
  2. Используйте tsp и seq для создания необходимых меток оси X.
  3. Постройте диаграмму, но подавьте ось X.
  4. Используйте команду оси для добавления пользовательских меток оси X.
  5. Добавьте дополнительный шаг для рисования вертикальной линии в 2012 году.

Вот код.

my.ts <- ts(y, start=c(2007, 1), end=c(2017, 12), frequency=12)    
tsp = attributes(my.ts)$tsp
dates = seq(as.Date("2007-01-01"), by = "month", along = my.ts)
plot(my.ts, xaxt = "n", main= "Plotting outcome over time",
     ylab="outcome", xlab="time")
axis(1, at = seq(tsp[1], tsp[2], along = my.ts), labels = format(dates, "%Y-%m"))
abline(v=2012, col="blue", lty=2, lwd=2)

Результат показан ниже.enter image description here

Это работоспособное решение для большинства исследователей данных.Но если ваша аудитория состоит из студентов или профессионалов, для написания слишком большого количества строк кода.

Вопрос : можно ли построить переменную временного ряда (объект) с помощью команды plot сопция формата, управляющая отображением оси x?

-

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Габор на месте.Это действительно зависит только от того, что вы хотите, и от того, что вы хотите откопать или изменить.Вот простая альтернатива, использующая более новый и менее известный пакет, который отлично подходит для печати xts типов:

## alternative
library(rtsplot)            # load the plotting package
library(xts)                # load the xts time-series container package
xx <- as.xts(my.ts)         # create an xts object
rtsplot(xx, main= "Plotting outcome over time")
rtsplot.x.highlight(xx, which(index(xx)=="Jan 2012"), 1)

Как вы можете видеть, тогда в этом случае используется два вызова - rtsplotимеет много хороших значений по умолчанию.Ниже приведен скриншот, так как я ленив, у окна графика, конечно, нет строки заголовка ...

enter image description here

0 голосов
/ 22 октября 2018
Пакет

ggplot2 имеет функцию scale_x_date для построения временных рядов в желаемых масштабах, метках, перерывах и пределах (в формате дня, месяца, года).Все, что вам нужно, это date объект класса и значения y.Например,

dates = seq(as.Date("01-01-2007",  format = "%d-%m-%Y"), length.out = 120, by = "month")
df <- data.frame(dates, y)  

# use the format you need in your plot using scale_x_date
library(ggplot2)
ggplot(df, aes(dates, y)) + geom_line() + scale_x_date(date_labels = "%b-%Y") +
geom_vline(xintercept = as.Date("01-01-2012",  format = "%d-%m-%Y"), linetype = 'dotted', color = 'blue')

y vs dates

0 голосов
/ 21 октября 2018

Я думаю, что вопрос сводится к желанию предварительно написанной функции для пользовательской оси, которую вы имеете в виду.Обратите внимание, что plot(my.ts) дает график с галочками каждый месяц и метками каждый год, что для меня выглядит лучше, чем график, показанный в вопросе, но если вам нужна пользовательская ось, поскольку R является языком программирования, вы, безусловно, можете написать простую функцию дляэто и с тех пор это просто вопрос вызова этой функции.

Например, для начала вам нужна функция, которая принимает объект с частотой 12 ts.Она рисует ось X с галочками для каждого месяца, обозначающего годы и каждый каждый месяц, где каждый аргумент может быть делителем 12. По умолчанию 3, поэтому отображается метка для каждого третьего месяца (кроме января, который отображается какгод).len - это количество букв в показанном месяце, которое может быть равно 1, 2 или 3. 1 означает, что Jul будет отображаться как J, 2 означает Ju, а 3 означает Jul. Значение по умолчанию: 1.

xaxis12 <- function(ser, every = 3, len = 1) {
  tt <- time(ser)
  axis(side = 1, at = tt, labels = FALSE)

  is.every <- cycle(ser) %in% seq(1, 12, every)[-1]
  month.labs <- substr(month.abb[cycle(ser)][is.every], 1, len) 
  axis(side = 1, at = tt[is.every], labels = month.labs, 
    cex.axis = 0.7, tcl = -0.75)

  is.jan <- cycle(ser) == 1
  year.labs <- sprintf("'%02d", as.integer(tt)[is.jan] %% 100)
  axis(side = 1, at = tt[is.jan], labels = year.labs, 
    cex.axis = 0.7, tcl = -1)
}

# test
plot(my.ts, xaxt = "n")
xaxis12(my.ts)

screenshot

...