如果语句R缺失值

时间:2012-10-09 02:36:51

标签: r for-loop if-statement

我试图执行这个函数,但是我的if语句一直出错:if(value [1] [i]< 0){:缺少值需要TRUE / FALSE错误:

Monte_Carlo <- function(trial)
{
    S_T <- S_o*exp((r - q - (1/2)*sigma^2)*period + sigma*rnorm(trial, mean = 0, sd = 1))
    K <- matrix(100, nrow = 1, ncol = 20)   
    value <- K - S_T

    for(i in 1:trial)
    {
        if(value[1][i] < 0)
        {
            value[1][i] = 0;
        }
    }
    return (mean(value)*exp(-r))
}

1 个答案:

答案 0 :(得分:1)

您正在错误地索引矩阵。 value[1]会返回一个值,然后您尝试为ith分配i元素,最多trial

如果您分配到第1行中的i元素(看起来好像您正在尝试这样做),那么它将起作用

Monte_Carlo <- function(trial)
{
  S_T <- S_o*exp((r - q - (1/2)*sigma^2)*period + sigma*rnorm(trial, mean = 0, sd = 1))
  K <- matrix(100, nrow = 1, ncol = 20)   
  value <- K - S_T

  for(i in 1:trial)
  {
    if(value[1, i] < 0)
    {
      value[1,i] = 0;
    }
  }
  return (mean(value)*exp(-r))
}

您可以移除带for的{​​{1}}循环和if语句,该语句已向量化,并将返回元素的最大值和0。

pmax

作为一个好的编程问题,我会将Monte_Carlo <- function(trial) { S_T <- S_o*exp((r - q - (1/2)*sigma^2)*period + sigma*rnorm(trial, mean = 0, sd = 1)) K <- matrix(100, nrow = 1, ncol = trial) value <- K - S_T .value <- pmax(value,0) return (mean(.value)*exp(-r) } rS_oqsigma添加为您的函数的参数,以便它不依赖于全局变量