2014-01-28 2 views
2

Я разработал свою собственную функцию под названием SharpeRatio(data)rollapply с функцией принимает матрицу возвращает «неправильное число измерений»

где данные матрица NX2.

Функция работает нормально для данной матрицы .dat, однако, когда я пытаюсь использовать rollapply(dat, 20, SharpeRatio) я получаю следующее сообщение об ошибке: Ошибка в Дат [1]: неправильное количество измерений

Ниже приводится функция определение:

SharpeRatio <- function(dat){ 
    Returns = dat[,1] 
    RiskFree = dat[,2] 

    ER = (Returns - RiskFree)/100 
    Volatility = sd(Returns/100) 
    return((exp(mean(log(1+ER))) - 1)/Volatility) 
} 
+0

Действительно, что это то, что тогда не хватает. – msmf14

ответ

5

rollapply работы по колонке, если by.column=FALSE аргумент не используется так, попробуйте это:

rollapply(dat, 20, SharpeRatio, by.column = FALSE) 
7

rollapply применяет функцию к прокатки краев массива. Но это происходит по столбцу. То есть, он не представляет массив для вашей функции, но представляет векторы N раз (N = 2 в вашем случае).

Вот пример:

(m <- matrix(1:10, ncol=2)) 
##  [,1] [,2] 
## [1,] 1 6 
## [2,] 2 7 
## [3,] 3 8 
## [4,] 4 9 
## [5,] 5 10 

Мы rollapply в mean, и посмотреть, что получает передаются в на каждой итерации:

y <- rollapply(m, width=2, FUN=function(x) {print(x); mean(x)}) 
## [1] 1 2 
## [1] 2 3 
## [1] 3 4 
## [1] 4 5 
## [1] 6 7 
## [1] 7 8 
## [1] 8 9 
## [1] 9 10 

Нет матрицы не передаются функции, только отдельные векторы , rollapply затем упаковывает результат в качестве массива в правильной форме:

y 
##  [,1] [,2] 
## [1,] 1.5 6.5 
## [2,] 2.5 7.5 
## [3,] 3.5 8.5 
## [4,] 4.5 9.5 

Исправления находится в комментарии г-Гротендик, передать by.column=FALSE в rollapply:

z <- rollapply(m, width=2, by.column=FALSE, FUN=function(x) {print(x); colMeans(x)}) 
##  [,1] [,2] 
## [1,] 1 6 
## [2,] 2 7 
##  [,1] [,2] 
## [1,] 2 7 
## [2,] 3 8 
##  [,1] [,2] 
## [1,] 3 8 
## [2,] 4 9 
##  [,1] [,2] 
## [1,] 4 9 
## [2,] 5 10 

Здесь матрицы двух строк каждых передаются функции. Результат такой же, как и выше:

z 
##  [,1] [,2] 
## [1,] 1.5 6.5 
## [2,] 2.5 7.5 
## [3,] 3.5 8.5 
## [4,] 4.5 9.5 
+1

Спасибо за объяснение, Мэтью. Не знал, что он не принимает массивы (у меня была функция, изначально рассчитанная на два входа, но потом подумала обойти ее, передав массив). Каким будет подходящий способ сделать приложение с кадрированным окном для функции, которая требует ввода (и где окна одновременно работают)? – msmf14

+2

@ msmf14 Ваша идея не вне базы. См. Редактирование. Если г-н Гротендик примет это в качестве ответа, я откажусь, и вы должны принять его ответ. –