2016-06-27 4 views
1

Как я могу сделать поворотное окно/цикл (обратный период 30 дней/точек данных) при ранжировании данных с помощью base::rank? Ниже показано, что функция apply.rolling, похоже, не работает.apply.rolling window/loop с функцией ранжирования

Смотрите пример ниже:

# example data 
require(xts) 
set.seed(3)  
A <- matrix(runif(900, max=30), ncol=3) 
Data <- xts(A, Sys.Date()-300:1) 
names(Data) <- c("C1", "C2", "C3") 

Это приводит (только последние 7 дней/точек данных показаны):

2016-06-20 16.71131510 12.80074552 19.27525535 
2016-06-21 22.92512330 25.11613536 17.45237229 
2016-06-22 20.09403965 17.20945809 28.06481040 
2016-06-23 28.68593738 4.84698272 18.36108782 
2016-06-24 15.52956209 25.54946621 3.97892474 
2016-06-25 25.76582707 18.14117193 8.17883282 
2016-06-26 25.23925100 16.07418907 15.35118717 

я выбираю только последние 30 точек данных:

rolldata30 <- tail(Data[,2:3], 30) 
rollindex30 <- tail(Data[,1], 30) 

Я ранжирую данные (последние 30 точек данных) вектора C2 и C3 base d по их первоначальным значениям. Таким образом, это период 2016-05-28 до 2016-6-26. Затем я создаю новый вектор, который вычисляет среднее значение из двух. factorx показывает результат я заинтересован в

rank30 <- as.xts(apply(-rolldata30, 2, rank, na.last= "keep")) 
factor <- cbind(rollindex30, global = rowMeans(rank30)) 
factorx <- last(factor) 

Какие результаты в:.

2016-06-20 16.711315 14.5 
2016-06-21 22.925123 9.5 
2016-06-22 20.094040 9.0 
2016-06-23 28.685937 19.0 
2016-06-24 15.529562 15.0 
2016-06-25 25.765827 18.5 
2016-06-26 25.239251 17.0 

с данными в последний день:

  C1  global 
2016-06-26 25.23925  17 

Как я могу сделать расчет прокатки в для получения точного расчета по 2016-5-27 по 2016-06-26, 2016-05-26 до 2016-06-25 и т. Д.?

PerformanceAnalytics::apply.rolling Использование дает ошибку:

Ошибка в XTS (х, order.by = order.by, частота = частота, .class = "двойной",: order.by требует соответствующего по времени на основе объекта

require(PerformanceAnalytics) 
test1 <- apply.rolling(Data, width=30, gap=30, by=1, FUN=function(x) as.xts(-x, 2, rank)) 

Я сделал следующую функцию. factorz дает тот же результат. Возможно, функция помогает сделать его прокатки?

rollrank <- function(x) 
{ 
    a <- tail(x, 30) 
    b <- as.xts(apply(-a, 2, rank, na.last= "keep")) 
    c <- cbind(a, global = rowMeans(b)) 
    d <- last(c) 
    return(d) 
} 
factorz <- rollrank(Data[,2:3]) 

ответ

1

Аргумент FUN для apply.rolling не имеет смысла. Я подозреваю, что вы имели в виду FUN = function(x) as.xts(apply(-x, 2, rank, na.last="keep")). Но это все равно не будет работать, потому что FUN возвращает объект с несколькими строками.

Функция rollrank подходит очень близко к тому, что вам нужно, и я рекомендую использовать rollapply вместо apply.rolling. Я предлагаю вам создать функцию на основе вашего первого примера, а затем передать эту функцию на rollapply.

myrank <- function(x) { 
    rolldata30 <- x[,2:3] 
    rollindex30 <- x[,1] 
    rank30 <- as.xts(apply(-rolldata30, 2, rank, na.last= "keep")) 
    factor <- cbind(rollindex30, global = rowMeans(rank30)) 
    factorx <- last(factor) 
    return(factorx) 
} 
test1 <- rollapply(Data, 30, myrank, by.column=FALSE) 
tail(test1) 
#     C1 global 
# 2016-06-23 7.806336 19.5 
# 2016-06-24 17.456436 17.5 
# 2016-06-25 29.196350 12.5 
# 2016-06-26 25.185687 11.0 
# 2016-06-27 19.775105 6.5 
# 2016-06-28 12.067774 16.0 
+0

Спасибо, это то, что я искал! –