Вы можете использовать aggregate
для преобразования ваших данных в ежедневные и еженедельные интервалы, а затем рассчитать автокорреляцию с любой функцией, которая делает это для обычных временных рядов (скажем, acf
).Например:
# make a data set to play with
library(zoo)
ts <- sort(runif(100)*168*3) # 100 observations over 3 weeks
ys <- runif(100) # y values
z <- zoo(ys, order.by=ts)
# ** convert to daily/weekly. ?aggregate.zoo
# NOTE: can use ts instead of index(z)
z.daily <- aggregate(z,index(z) %/% 24) # has 21 elements (one per day)
z.weekly <- aggregate(z,index(z) %/% 168) # has 3 elements (one per week)
# Now compute correlation, lag 1 (index in z.daily/weekly)
daily.acf <- acf(z.daily, lag.max=1)[1]
weekly.acf <- acf(z.weekly, lag.max=1)[1]
aggregate
преобразует z
в ежедневные или еженедельные данные, где вы суммируете все вхождения за каждый день / неделю.Он выполняет группировку, просматривая index(z) %/% 24
(или 168), который является целой частью часа наблюдения, деленной на 24 (т. Е. Днем, когда это происходит).
Затем функция acf
вычисляет автокорреляцию(с lag
по индексам вектора, а не по времени).
Я не особо разбираюсь в статистике, и я заметил одну вещь: если вы сделаете:
weekly.acf <- acf(z.daily,lag.max=7)[7]
вы получаете ответ, отличный от того, когда вычисляете автокорреляцию из z.weekly
, потому что он выполняет автокорреляцию с данными ежедневно с задержкой 7, в отличие от еженедельных данных с задержкой 1 - такЯ не уверен, что то, что я делаю, действительно то, что вы хотите.