Прежде всего я хотел бы описать свою проблему: Что я хочу сделать, так это рассчитать количество всплесков цен в 24-часовом окне, в то время как я получаю полчаса данных.Ошибка в rollapply: индекс за пределами
Я видел все сообщения Stackoverflow, например. это одна: Rollapply for time series
(Если есть более значимые из них, пожалуйста, дайте мне знать;))
Как я не могу и, вероятно, также не должны загружать свои данные, вот минимальный пример: имитировать случайный переменную, преобразовать ее в объект xts и использовать определенную пользователем функцию для обнаружения «всплесков» (конечно, довольно смешно в этом случае, но иллюстрирует ошибку).
library(xts)
##########Simulate y as a random variable
y <- rnorm(n=100)
##########Add a date variable so i can convert it to a xts object later on
yDate <- as.Date(1:100)
##########bind both variables together and convert to a xts object
z <- cbind(yDate,y)
z <- xts(x=z, order.by=yDate)
##########use the rollapply function on the xts object:
x <- rollapply(z, width=10, FUN=mean)
Функция работает так, как предполагается: она принимает 10 предыдущих значений и вычисляет среднее значение.
Затем я определил собственную функцию, чтобы найти пики: пик является локальным максимумом (выше, чем m точек вокруг него) И, по крайней мере, такой же большой, как среднее из периодов времени + h. Это приводит к:
find_peaks <- function (x, m,h){
shape <- diff(sign(diff(x, na.pad = FALSE)))
pks <- sapply(which(shape < 0), FUN = function(i){
z <- i - m + 1
z <- ifelse(z > 0, z, 1)
w <- i + m + 1
w <- ifelse(w < length(x), w, length(x))
if(all(x[c(z : i, (i + 2) : w)] <= x[i + 1])&x[i+1]>mean(x)+h) return(i + 1) else return(numeric(0))
})
pks <- unlist(pks)
pks
}
И работает отлично: Перейти к примеру:
plot(yDate,y)
#Is supposed to find the points which are higher than 3 points around them
#and higher than the average:
#Does so, so works.
points(yDate[find_peaks(y,3,0)],y[find_peaks(y,3,0)],col="red")
Однако, используя функцию rollapply()
приводит к:
x <- rollapply(z,width = 10,FUN=function(x) find_peaks(x,3,0))
#Error in `[.xts`(x, c(z:i, (i + 2):w)) : subscript out of bounds
я первый подумал, ну, возможно, ошибка возникает из-за того, что она может запускать int отрицательный индекс для первых точек из-за параметра m
. К сожалению, установка m
на ноль не изменяет ошибку.
Я тоже попытался проследить эту ошибку, но не нашел источник. Может ли кто-нибудь помочь мне здесь?
Я смущен относительно того, что цель здесь. Вы пытаетесь найти пики на основе общего среднего, а затем использовать это с несколькими точками вокруг заданного значения? Ошибки вашего кода в операторе 'if'. В вашем объекте 'xts' у вас есть два столбца, поэтому индексы, которые вычисляются' c (z: i, (i + 2): w) ', являются'> 100'. Оператор подмножества '[.xts' пытается взять строки на основе индекса и есть строки' <100'. – jamieRowen
Также оказалось, что операторы отношения не выполняют, как вы могли бы ожидать здесь, с объектом 'xts' – jamieRowen
Прошу прощения, я постараюсь выразить себя лучше: Предполагается, что функция пика найдет пики. Пики определяются как точки, превышающие m точек в их окружении, и (потому что в периоды с низкой волатильностью эти точки могут быть очень низкими) должны превышать порог. Общая цель - определить количество пиков в 24-часовом окне или в определенный день, который в конце должен быть задан длиной (find_peaks). – user18093