Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按照R中的阈值计算价格变化_R - Fatal编程技术网

按照R中的阈值计算价格变化

按照R中的阈值计算价格变化,r,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从数据的第1行开始,即,计算数据[1:nrow(数据),]的变化,然后在变化结果数组中找到小于5%阈值

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

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
    从数据的
    第1行开始,即,计算
    数据[1:nrow(数据),]
    的变化,然后在
    变化
    结果数组中找到小于
    5%阈值的第一个值
    
  • 如果未找到任何内容,则函数
    calVariation
    应再次运行,但应从下一行数据开始,即计算
    data[2:nrow(data),]
  • 如果发现第
    n行
    处的变化小于阈值
    5%
    ,则将原始数据的列从
    第1行
    保存到
    第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()
  }

}

path您的实际错误在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
if(any(vari错误{:缺少需要TRUE/FALSE的值\n“ 数据_p[rowid:nrow(data_p),]中出错:下标超出范围
将来诊断难以调试的错误时,建议使用tryCatch,重写calVariation()

calVariation 1){

vari请使用
dput()
共享您的数据,以便其他人可以提供帮助。请参阅此处的更多信息:
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)
}