R中不可合并的参数

时间:2017-06-22 02:21:53

标签: r

我正在重新编写一个算法,我在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)

我似乎无法弄清楚问题,任何建议都会非常感激。

1 个答案:

答案 0 :(得分:3)

在R中, var imageArray = [UIImage]() override func viewDidLoad() { super.viewDidLoad() if let stringImage = self.imageNames { let imageRef = storage.reference(forURL: "gs://gsignme-14416.appspot.com/images/\(stringImage)") imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in if error == nil { self.ImageOne = UIImage(data: data!)! imageArray.append(self.ImageOne) }else { print("Error downloading image:" ) } self.carouselView.reloadData() self.carouselView.type = .rotary if let stringImages = self.imagesTwo { let imageRefs = self.storage.reference(forURL: "gs://gsignme-14416.appspot.com/images/\(stringImages)") imageRefs.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in if error == nil { self.ImageTwo = UIImage(data: data!)! imageArray.append(self.ImageTwo) }else { print("Error downloading image:" ) } self.carouselView.reloadData() self.carouselView.type = .rotary })} if let stringImage3 = self.imagesThree { let imageRef = self.storage.reference(forURL: "gs://gsignme-14416.appspot.com/images/\(stringImage3)") imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in if error == nil { self.ImageThree = UIImage(data: data!)! imageArray.append(self.ImageThree) }else { print("Error downloading image:" ) } self.carouselView.reloadData() self.carouselView.type = .rotary })} if let stringImage4 = self.imagesFour { let imageRef = self.storage.reference(forURL: "gs://gsignme-14416.appspot.com/images/\(stringImage4)") imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in if error == nil { self.ImageFour = UIImage(data: data!)! imageArray.append(self.ImageFour) }else { print("Error downloading image:" ) } self.carouselView.reloadData() self.carouselView.type = .rotary })} if let stringImage5 = self.imagesFive { // AppDelegate.instance().showActivityIndicator() let imageRef = self.storage.reference(forURL: "gs://gsignme-14416.appspot.com/images/\(stringImage5)") imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in if error == nil { // AppDelegate.instance().dismissActivityIndicator() self.ImageFive = UIImage(data: data!)! imageArray.append(self.ImageFive) }else { print("Error downloading image:" ) } self.carouselView.reloadData() self.carouselView.type = .rotary })} }) } func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView { var imageView: UIImageView! if view == nil { imageView = UIImageView(frame: CGRect(x: 20, y: 0, width: 250, height: 270)) // imageView.backgroundColor = UIColor.lightGray imageView.contentMode = .scaleAspectFit imageView.clipsToBounds = true carousel.clipsToBounds = true }else{ imageView = view as! UIImageView } imageView.image = imageArray[index] imageArray.removeAll() return imageView } 运算符保留用于乘以两个适形矩阵。作为一种特殊情况,如果向量可以被视为符合矩阵的行或列向量,您也可以使用它将向量乘以矩阵(反之亦然);作为第二种特殊情况,它可以用来乘以两个向量来计算它们的内积。

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

当我进行此更改时,由于另一个错误 - sqrt(T) * Z被使用但从未定义过,您的程序仍然无效 - 但我不太了解您的算法以尝试修复。< / p>

该计划的其他一些评论与您原来的问题没有直接关系:

  1. S中的第一个循环看起来很可疑:Finite_Difference生成一个长度为guassian_box_muller(i)的向量,ii的循环中变化到1,并将这些向量强制转换为长度为M的列矩阵以生成M可能无法执行您想要的操作。它将“重用”循环中的值以填充矩阵。试试这些看看我的意思:

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

    Var

    并且Var <- sum((Delta - totDelta)^2)/M Delta的定义也可以用这种简化的方式编写。

    我建议谷歌搜索“r中的矢量和矩阵运算”或类似的东西并阅读一些教程。矢量算术特别是惯用R,你需要尽早学习并经常使用它。

  3. 您可能会发现考虑totDelta函数生成随机高斯是有帮助的。

  4. 快乐的R-ing!