按照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)
}