#r #statistics #dataframe #time-series
#r #Статистика #фрейм данных #временные ряды
Вопрос:
У меня есть фрейм данных с несколькими столбцами:
- состояние
- округ
- год
Тогда x, y и z, где x, y и z — наблюдения, уникальные для триплета, перечисленного выше. Я ищу разумный способ сохранить это во временных рядах, и xts мне этого не позволит, поскольку для каждого временного индекса существует несколько наблюдений. Я просмотрел пакет hts, но у меня возникли проблемы с пониманием того, как перенести в него мои данные из dataframe.
(Да, я опубликовал тот же вопрос на Quora, и мне посоветовали перенести его сюда!)
Комментарии:
1. можете ли вы показать, что вы уже пробовали?
2. Немного. Когда я попытался вставить это в xts, оно захлебнулось при добавлении имен строк, поскольку имена строк должны быть уникальными. В этом случае на комбинацию штата и округа приходится по строке за каждый год (около 3000). Итак, я смотрю на hts, и кажется, что это уже должен быть xts перед входом. Итак, я немного заблудился.
3. «Временной ряд» — это когда каждая строка соответствует другому времени. Судя по именам ваших столбцов, если только каждый
year
не относится к другому году, у вас нет временных рядов. Если это так, то вы, вероятно, ищетеdata.frame
. Есть ли причина, по которой вы думаете, что это временной ряд?4. Да, потому что это примерно 3150 временных рядов, объединенных в одно имя данных. Мой мыслительный процесс чем-то сродни: «конечно, есть объект, который может объединить это и упростить такие вещи, как построение графиков». Обработка этого как data.frame может быть лучшим вариантом.
5. Не могли бы вы предоставить нам несколько примеров данных?
Ответ №1:
Одним из вариантов является изменение формы ваших данных, чтобы у вас был столбец для каждой комбинации штата и округа. Это позволяет вам построить матрицу xts :
require(reshape)
Opt1 <- as.data.frame(cast(Data, Date ~ county State, value="Val"))
rownames(Opt1) <- Opt1$Date
Opt1$Date <- NULL
as.xts(Opt1)
В качестве альтернативы вы могли бы работать со списком объектов xts, каждый раз проверяя, что у вас правильный формат, запрошенный xts. То же самое относится к любому из других пакетов timeseries. Возможным решением было бы :
Opt2 <-
with(Data,
by(Data,list(county,State,year),
function(x){
rownames(x) <- x$Date
x <- x["Val"]
as.xts(x)
}
)
)
Что позволило бы сделать что-то вроде :
Opt2[["d","b","2012"]]
чтобы выбрать конкретный временной ряд. Для этого можно использовать все опции xts. Вы можете перебирать округа, штаты и годы для построения графиков, подобных этому :
Код для построения графика :
counties <- dimnames(Opt2)[[1]]
states <- dimnames(Opt2)[[2]]
years <- dimnames(Opt2)[[3]]
op <- par(mfrow=c(3,6))
apply(
expand.grid(counties,states,years),1,
function(i){
plot(Opt2[[i[1],i[2],i[3]]],main=paste(i,collapse="-"))
invisible()
}
)
par(op)
Тестовые данные :
Data <- data.frame( State = rep(letters[1:3],each=90),
county = rep(letters[4:6],90),
Date = rep(seq(as.Date("2011-01-01"),by="month",length.out=30),each=3),
Val = runif(270)
)
Data$year <- as.POSIXlt(Data$Date)$year 1900
Комментарии:
1. Я неравнодушен к подходу «список объектов xts». Я считаю, что работать со списками намного проще, чем отслеживать столбцы. Но многим людям, работающим в сфере электронных таблиц, нравится формат wide data, потому что его можно представить как электронную таблицу.
2. @JD Long : зависит от того, как вы хотите видеть данные. Если вы используете широкий формат, у вас есть временной ряд с несколькими переменными. Если вы используете список, у вас есть целый набор временных рядов только с одной переменной. Вот почему я предоставил оба варианта.
3. Я планирую опробовать оба варианта и посмотреть, что работает для меня лучше всего на практике. Вероятно, поэтому я так взволнован вышеупомянутым сообщением.