根据R

时间:2018-07-22 02:06:39

标签: r

我有以下时间序列价格数据:

18/01/2008  7.4811
22/01/2008  7.5267
31/01/2008  7.8289
01/02/2008  7.82
...
30/10/2008  7.81
31/10/2008  7.75

我构建了一个函数calVariation来计算奖赏的变化为:variation = log(data/data[1,1])

  • calVariation从数据的Line 1开始,即计算data[1:nrow(data),]的变化,然后在variation结果数组中找到小于阈值的第一个值5%中的。
  • 如果未找到任何内容,则函数calVariation应该再次运行,但应从数据的下一行开始,即计算data[2:nrow(data),]的变化
  • 如果发现第n行的变化小于阈值5%,它将把原始数据的列从Line 1Line n保存到一列矩阵mat的元素。现在,原始数据将减少为data[n:nrow(data),],并成为calVariation的输入,以便在下一步中进行计算。

以下是我的代码。

pathway <- 'C:/'
decimal <- ","
threshold <- -0.05
database <- as.matrix(read.csv(paste(pathway,"Data_origin.csv",sep=""), header = FALSE, sep = ";", dec = decimal))

data_p <- as.matrix(database[,2])
data_p <- as.matrix(as.numeric(data_p))
rownames(data_p) <- database[,1]

calVariation <- function(mData, threshold){ 
  if(nrow(mData) > 1) {  
    vari <- log(mData/mData[1,1])

    if (any(vari < threshold) == FALSE) { # Not found any value < -5
      mData <- as.matrix(mData[2:nrow(mData),])
      mData <- calVariation(mData, threshold)
    }

    else { # Found value < -5
      threshold_id <- min(which(vari < threshold))
      mData <- as.matrix(mData[1:threshold_id, ])
    }
  } else (
    mData <- NULL
  ) 

  return(mData)
}


data <- data_p
mat <- NULL
rowid <- 0

while (nrow(data) > 1 && is.null(data) == FALSE) {
  temp <- matrix(NA, nrow(data_p), 2)
  data <- calVariation(data, threshold)

  if (is.null(data) == FALSE) {
    temp[1:nrow(data), 1] <- rownames(data) 
    temp[1:nrow(data), 2] <- data 
    rowid <- rowid + nrow(data)     
    mat <- cbind(mat, temp)
    data <- as.matrix(data_p[rowid:nrow(data_p),])    
  } else {
    break()
  }

}

它返回以下错误:Error in if (any(vari < threshold) == FALSE) { : missing value where TRUE/FALSE needed。我猜想当vari变成NA时会发生此错误,但是我尝试使用类似is.na的函数来解决此问题,但是并没有解决。

可以找到测试的原始数据here。预先非常感谢。

1 个答案:

答案 0 :(得分:0)

您的实际错误在while块中

Error in if (any(vari < threshold) == FALSE) {: missing value where TRUE/FALSE  needed\n"
Error in data_p[rowid:nrow(data_p), ] : subscript out of bounds

将来在诊断难以调试的错误时,建议使用tryCatch,重写calVariation()

calVariation <- function(mData, threshold){ 


tryCatch( {if(nrow(mData) > 1) {  
vari <- log(mData/mData[1,1])


if ( any(vari < threshold) == FALSE) { # Not found any value < -5
  mData <- as.matrix(mData[2:nrow(mData),])
  mData <- calVariation(mData, threshold)
}

else { # Found value < -5
  threshold_id <- min(which(vari < threshold))
  mData <- as.matrix(mData[1:threshold_id, ])
}
} else {
mData <- NULL
} },error = function(err) {

# print the error
print(paste("error:  ",err))

} )
  return(mData)
}