2015-09-03 1 views
4

У меня есть объект xts реализованной (запаса) волатильности, и я хочу наложить минимальную волатильность для каждого запаса/столбца. Вот пример, который я не могу правильно работать. Он циклически перемещается по минимальному волновому вектору. Спасибо.Как применить pmax к объекту xts в r?

require(xts) 
set.seed(3)  
A <- matrix(runif(18, max=0.30), ncol=3) 
A.xts <- xts(A, Sys.Date()-6:1) 
Min_Vols <- c(.10, .20, .30) 
B <- pmax(as.matrix(A.xts), Min_Vols) 
A.xts; B 

выше генерирует

    [,1]  [,2]  [,3] 
2015-08-28 0.05041246 0.03739003 0.16021061 
2015-08-29 0.24225492 0.08838028 0.16717483 
2015-08-30 0.11548271 0.17328298 0.26037585 
2015-08-31 0.09832030 0.18929378 0.24891261 
2015-09-01 0.18063020 0.15360477 0.03343475 
2015-09-02 0.18131822 0.15150717 0.21110651 
       [,1]  [,2]  [,3] 
2015-08-28 0.1000000 0.1000000 0.1602106 
2015-08-29 0.2422549 0.2000000 0.2000000 
2015-08-30 0.3000000 0.3000000 0.3000000 
2015-08-31 0.1000000 0.1892938 0.2489126 
2015-09-01 0.2000000 0.2000000 0.2000000 
2015-09-02 0.3000000 0.3000000 0.3000000 

Где я хочу B быть:

    [,1]  [,2]  [,3] 
2015-08-28 0.10000000 0.20000000 0.30000000 
2015-08-29 0.24225492 0.20000000 0.30000000 
2015-08-30 0.11548271 0.20000000 0.30000000 
2015-08-31 0.10000000 0.20000000 0.30000000 
2015-09-01 0.18063020 0.20000000 0.30000000 
2015-09-02 0.18131822 0.20000000 0.30000000 
+1

Использование и шоу ' set.seed' для генерации ваших данных примера. Покажите ожидаемый результат. Предполагая, что вы хотите использовать sapply (1: ncol (A), function (i) pmax (A [, i], Min_Vols [i])). –

+0

Спасибо, А. Вебб, я внес изменения, как показано. –

+0

Мой реальный код действует отличным от приведенного выше примера и генерирует следующую ошибку при запуске: 'sapply (1: ncol (Vols.xts), function (i) pmax (Vols.xts [, i], Min_Vols [i ])) 'whch дал: ' Ошибка в массиве (r, dim = d, dimnames = if (! (is.null (n1 <- names (x [[1L]])) &: длина 'dimnames' [1] не равно размеру массива. В конечном счете, чтобы исправить это, мне пришлось преобразовать объект xts с помощью 'as.matrix (Vols.xts [, i])', а затем преобразовать его. Это была проблема, с которой я столкнулся. см., что @ Joshua-Ulrich показывает это ниже. Я не знаю, почему эта ошибка не возникает в простой версии AB в нашем примере кода. –

ответ

2

Вы можете использовать sapply накладывать свои ограничения по столбцам

B<-sapply(1:ncol(A),function(i) pmax(A[,i],Min_Vols[i])) 
xts(B,index(A.xts)) 

#>     [,1] [,2] [,3] 
#> 2015-08-28 0.1000000 0.2 0.3 
#> 2015-08-29 0.2422549 0.2 0.3 
#> 2015-08-30 0.1154827 0.2 0.3 
#> 2015-08-31 0.1000000 0.2 0.3 
#> 2015-09-01 0.1806302 0.2 0.3 
#> 2015-09-02 0.1813182 0.2 0.3 
1

Вы иметь пара вариантов. Вы можете создать матрицу для передачи pmax:

MinVolMatrix <- matrix(Min_Vols, nrow(A), ncol(A), byrow=TRUE) 
B <- as.xts(pmax(as.matrix(A.xts), MinVolMatrix)) 

Вы можете использовать apply (обратите внимание, что вы должны перенести результат, из-за того, как apply строит свой выход):

B <- as.xts(t(apply(A.xts, 1, pmax, Min_Vols))) 
+0

Вы можете упростить и не создавать новую матрицу с помощью 'B <- matrix (pmax (Min_Vols, t (A)), byrow = TRUE, ncol = 3) ' – WaltS