我有以下时间序列价格数据:
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 1
到Line 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。预先非常感谢。
答案 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)
}