【问题标题】:rollapply with a function taking a matrix returns "incorrect number of dimensions"rollapply 与采用矩阵的函数返回“不正确的维数”
【发布时间】:2014-01-28 04:08:51
【问题描述】:

我设计了自己的函数SharpeRatio(data)

其中 data 是一个 nx2 矩阵。

该函数对于给定的矩阵 dat 工作正常,但是当我尝试使用 rollapply(dat, 20, SharpeRatio) 时,我收到以下错误:错误在 dat[, 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)
}

【问题讨论】:

  • 那确实是缺少的。

标签: r finance rollapply


【解决方案1】:

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

我们将rollapplymean,看看在每次迭代中传递了什么:

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

【讨论】:

  • 谢谢你的解释,马修。不知道它不需要数组(我有最初为两个输入设计的函数,但后来想通过传递一个数组来绕过它)。在需要输入(以及窗口同时滚动的位置)的功能上执行滚动窗口应用程序的正确方法是什么?
  • @msmf14 你的想法并不离谱。见编辑。如果格洛腾迪克先生输入这个作为答案,我会回滚,你应该接受他的答案。
【解决方案2】:

rollapply 按列工作,除非使用 by.column=FALSE 参数,所以试试这个:

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

【讨论】:

    【解决方案3】:

    由于当前滚动应用采用矩阵返回“不正确的维数”,因为它并不意味着采用矩阵。我自己写的

    rollmatapply <- function(m,by=100,FUN)
    {
      v = vector()  
      for(i in 1:(nrow(m)-by))
      {
        v[i] = do.call(FUN,list(m[i:(by+i-1),]))
      }
      v
    }
    

    【讨论】:

    • 这不是一个好的答案,你应该添加一个为什么写自己是首选的方法
    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 2012-04-14
    • 1970-01-01
    • 2014-10-17
    • 2012-12-14
    • 1970-01-01
    • 2021-05-25
    • 2017-03-20
    相关资源
    最近更新 更多