Как лучше всего обрабатывать временные ряды в R?

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

Пример:

Допустим, я хочу сделать линейную регрессию двух временных рядов. Временные ряды содержат ежедневные данные, но здесь и там могут быть пробелы, поэтому временные ряды не являются регулярными. Естественно, я хочу сравнивать только точки данных, где оба временных ряда имеют данные. Это то, что я делаю в настоящее время, чтобы читать файлы csv во фрейм данных:

library(zoo)
apples <- read.csv('/Data/apples.csv', as.is=TRUE)
oranges <- read.csv('/Data/oranges.csv', as.is=TRUE)
apples$date <- as.Date(apples$date, "%d/%m/%Y")
oranges$date <- as.Date(oranges$date, "%d/%m/%Y")
zapples <- zoo(apples$close,apples$date)
zoranges <- zoo(oranges$close,oranges$date)
zdata <- merge(zapples, zoranges, all=FALSE)
data <- as.data.frame(zdata)

Есть ли более тонкий способ сделать это?

Кроме того, как я могу разделить данные, например, выбрать записи в data с датами в течение определенного периода?


person c00kiemonster    schedule 11.02.2011    source источник
comment
Код не совсем правильный, и у нас нет ваших CSV-файлов... может быть, какие-то фиктивные данные?   -  person J. Win.    schedule 11.02.2011
comment
Исправил опечатки в коде. Но я не вижу смысла в фиктивных данных. Просто возьмите любые случайные данные и поместите их в CSV-файл с двумя столбцами и назовите дату одного столбца, а другой - закрыть.   -  person c00kiemonster    schedule 11.02.2011
comment
Причина в том, что ваш вопрос не считается низкокачественным, и чтобы респонденты могли легко запускать код, а несколько респондентов запускали его, используя один и тот же ввод. Поскольку это то, что вы можете сделать самостоятельно, не зная ответа на вопрос, обычно считается, что вы несете ответственность за это.   -  person G. Grothendieck    schedule 11.02.2011
comment
Истинный. Но так как я попросил лучшие практики (у меня не было какой-то конкретной проблемы, с которой нужно было бы иметь дело, я просто хотел знать, есть ли более прямой способ достижения того же результата), я действительно не думал, что это необходимо. Любой, кто привык работать с временными рядами в R, сможет понять суть кода, а затем добавить свои 0,02 доллара. Тем не менее спасибо за ваши ответы.   -  person c00kiemonster    schedule 11.02.2011


Ответы (2)


Попробуйте что-нибудь в этом духе. Это предполагает, что даты находятся в столбце 1. Пакет dyn можно использовать для преобразования lm, glm и многих подобных функций регрессионного типа в те, которые принимают ряды зоопарка. Напишите dyn$lm вместо lm, как показано:

library(dyn) # also loads zoo
fmt <- "%d/%m/%Y"
zapples <- read.zoo('apples.csv', header = TRUE, sep = ",", format = fmt)
zoranges <- read.zoo('oranges.csv', header = TRUE, sep = ",", format = fmt)
zdata <- merge(zapples, zoranges)
dyn$lm(..whatever.., zdata)

Вам не нужен all = FALSE, так как lm будет игнорировать строки с NA при настройке по умолчанию своего аргумента na.action.

Функцию window.zoo можно использовать для нарезки данных.

В зависимости от того, что вы хотите сделать, вы также можете взглянуть на пакеты xts и quantmod.

person G. Grothendieck    schedule 11.02.2011
comment
Я понятия не имел о пакете dyn, он действительно очень хорош. - person c00kiemonster; 11.02.2011

Почему вы преобразовали оба фрейма данных в zoo, а затем объединили и преобразовали обратно во фрейм данных? Если вам нужен фрейм данных, просто запустите эту строку после вашего read.csv().

data <- merge(apples, oranges, by = "date")

И вот как подмножество.

subset(data, date < slicemax & date > slicemin)
person J. Win.    schedule 11.02.2011