【问题标题】:Non-comformable arguments in RR中的不一致参数
【发布时间】:2017-06-22 02:21:52
【问题描述】:

我正在重写我在 R 中用 C++ 编写的一种算法,称为有限差分法。我对 R 很陌生,所以我不知道有关向量/矩阵乘法的所有规则。出于某种原因,当我这样做时,我收到了一个不符合要求的参数错误:

ST_u <- matrix(0,M,1)
  ST_l <- matrix(0,M,1)
  for(i in 1:M){
    Z <- matrix(gaussian_box_muller(i),M,1)
    ST_u[i] <- (S0 + delta_S)*exp((r - (sigma*sigma)/(2.0))*T + sigma*sqrt(T)%*%Z)
    ST_l[i] <- (S0 - delta_S)*exp((r - (sigma*sigma)/(2.0))*T + sigma*sqrt(T)%*%Z)
  }

我收到此错误:

Error in sqrt(T) %*% Z : non-conformable arguments

这是我的全部代码:

gaussian_box_muller <- function(n){
  theta <- runif(n, 0, 2 * pi)
  rsq <- rexp(n, 0.5)
  x <- sqrt(rsq) * cos(theta)
  return(x)
}

 d_j <- function(j, S, K, r, v,T) {
  return ((log(S/K) + (r + (-1^(j-1))*0.5*v*v)*T)/(v*(T^0.5)))
}

call_delta <- function(S,K,r,v,T){
  return (S * dnorm(d_j(1, S, K, r, v, T))-K*exp(-r*T) * dnorm(d_j(2, S, K, r, v, T)))
}


Finite_Difference <- function(S0,K,r,sigma,T,M,delta_S){
  ST_u <- matrix(0,M,1)
  ST_l <- matrix(0,M,1)
  for(i in 1:M){
    Z <- matrix(gaussian_box_muller(i),M,1)
    ST_u[i] <- (S0 + delta_S)*exp((r - (sigma*sigma)/(2.0))*T + sigma*sqrt(T)%*%Z)
    ST_l[i] <- (S0 - delta_S)*exp((r - (sigma*sigma)/(2.0))*T + sigma*sqrt(T)%*%Z)
  }

  Delta <- matrix(0,M,1)
  totDelta <- 0
  for(i in 1:M){
    if(ST_u[i] - K > 0 && ST_l[i] - K > 0){
      Delta[i] <- ((ST_u[i] - K) - (ST_l[i] - K))/(2*delta_S)
    }else{
      Delta <- 0
    }
    totDelta = totDelta + exp(-r*T)*Delta[i]
  }
  totDelta <- totDelta * 1/M

  Var <- 0
  for(i in 1:M){
    Var = Var + (Delta[i] - totDelta)^2
  }
  Var = Var*1/M
  cat("The Finite Difference Delta is : ", totDelta)
  call_Delta_a <- call_delta(S,K,r,sigma,T)
  bias <- abs(call_Delta_a - totDelta)
  cat("The bias is: ", bias)
  cat("The Variance of the Finite Difference method is: ", Var)
  MSE <- bias*bias + Var
  cat("The marginal squared error is thus: ", MSE)
}

S0 <- 100.0                     
delta_S <- 0.001    
K <- 100.0          
r <- 0.05                           
sigma <- 0.2                    
T <- 1.0                            
M <- 10 

result1 <- Finite_Difference(S0,K,r,sigma,T,M,delta_S)

我似乎无法找出问题所在,任何建议将不胜感激。

【问题讨论】:

  • 好的,我应该试试'*'吗?
  • 鉴于您的函数非常“循环繁重”,可能值得考虑将您的函数保留为 C++ 代码,并使用library(Rcpp)直接在 R 中调用它

标签: r


【解决方案1】:

在 R 中,%*% 运算符保留用于将两个一致矩阵相乘。作为一种特殊情况,如果向量可以被视为符合矩阵的行或列向量,您还可以使用它将向量乘以矩阵(反之亦然);作为第二种特殊情况,它可以用来将两个向量相乘来计算它们的内积。

但是,它不能做的一件事是执行标量乘法。向量或矩阵的标量乘法总是使用普通的* 运算符。具体来说,在表达式sqrt(T) %*% Z中,第一项sqrt(T)是一个标量,第二项Z是一个矩阵。如果你打算在这里做的是将矩阵Z 乘以标量sqrt(T),那么这应该写成sqrt(T) * Z

当我进行此更改时,您的程序仍然无法运行,因为另一个错误 - 使用了 S 但从未定义过 - 但我不太了解您的算法,无法尝试修复。

该程序中的其他一些与您的原始问题没有直接关系的 cmet:

  1. Finite_Difference 中的第一个循环看起来很可疑:guassian_box_muller(i) 生成一个长度为 i 的向量,因为 i 在循环中从 1M 变化,并将这些向量强制转换为列矩阵长度为M 生成Z 可能没有做你想做的事。它将“重用”循环中的值来填充矩阵。试试这些看看我的意思:

    matrix(gaussian_box_muller(1),10,1)   # all one value
    matrix(gaussian_box_muller(3),10,1)   # cycle of three values
    
  2. 您还可以在许多地方使用循环,在这些地方,R 的向量运算更易于阅读并且(通常)执行速度更快。例如,您对Var 的定义等价于:

    Var <- sum((Delta - totDelta)^2)/M
    

    DeltatotDelta 的定义也可以用这种简化的方式编写。

    我建议在谷歌上搜索“r 中的向量和矩阵运算”或类似的内容并阅读一些教程。尤其是矢量算术是惯用的 R,您需要尽早学习并经常使用它。

  3. 您可能会发现考虑使用rnorm 函数来生成随机高斯函数很有帮助。

R-ing 快乐!

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2013-03-30
    • 2015-07-16
    • 2015-06-10
    相关资源
    最近更新 更多