Использование функции rollapply для расчета VaR с использованием R
Я сделал следующее для расчета Value at Risk (VaR) в течение 20-периодного скользящего окна:
require(PerformanceAnalytics); require(zoo)
data(edhec)
class(edhec) # [1] "xts" "zoo"
class(edhec$CTAGlobal) # "NULL"
var1<-rollapply(edhec,width=20,FUN=function(edhec) VaR(R=edhec,p=.95,method="modified"),by.column=TRUE)
Он выдает желаемый результат, а затем я попробовал то же самое на других данных:
data(managers)
class(managers) # [1] "xts" "zoo"
class(managers$HAM4) # [1] "xts" "zoo"
var2<-rollapply(managers,width=20,FUN=function(managers) VaR(R=managers,p=.95,method="modified"),by.column=TRUE)
Но я получаю следующую ошибку:
Error in dimnames(cd) <- list(as.character(index(x)), colnames(x)) :
'dimnames' applied to non-array
Может кто-нибудь подскажите, пожалуйста, почему такая разница и как исправить эту ошибку?
1 ответ
Есть столбцы, которые полностью отсутствуют в первых нескольких (3) width=20
окна, следовательно ошибка
data(managers)
class(managers) # [1] "xts" "zoo"
class(managers$HAM4) # [1] "xts" "zoo"
var2<-rollapply(managers,width=20,FUN=function(x) VaR(R=x,p=.95,method="modified"),by.column=TRUE)
С traceback
, вы можете проверить возможные источники ошибок, заметьте шаг 12, na.omit(x)
, увидеть ?na.omit
traceback()
#17: as.matrix.xts(x)
#16: as.matrix(x)
#15: as.vector(as.matrix(x), mode = mode)
#14: as.vector.zoo(x, mode)
#13: as.vector(x, mode)
#12: as.vector(na.omit(R[, column]))
#11: VaR.CornishFisher(R = R, p = p)
#10: VaR(R = managers, p = 0.95, method = "modified") at #1
#9: FUN(.subset_xts(data, (i - width + 1):i, j), ...)
#8: FUN(newX[, i], ...)
#7: apply(ind, 1, function(i) FUN(.subset_xts(data, (i - width +
# 1):i, j), ...))
#6: FUN(1:10[[5L]], ...)
#5: lapply(X = X, FUN = FUN, ...)
#4: sapply(1:NCOL(data), function(j) apply(ind, 1, function(i) FUN(.subset_xts(data,
# (i - width + 1):i, j), ...)))
#3: xts(sapply(1:NCOL(data), function(j) apply(ind, 1, function(i) FUN(.subset_xts(data,
# (i - width + 1):i, j), ...))), tt, if (by == 1) attr(data,
# "frequency"))
#2: rollapply.xts(managers, width = 20, FUN = function(managers) VaR(R = managers,
# p = 0.95, method = "modified"), by.column = TRUE)
#1: rollapply(managers, width = 20, FUN = function(managers) VaR(R = managers,
# p = 0.95, method = "modified"), by.column = TRUE)
#
Для вашего первого окна наблюдений (фактически около 60) столбцы HAM5,HAM6 полностью отсутствуют, что приводит к пустым данным на шаге 12. выше
head(managers,20)
#Empty data since NA columns are omitted see step 12 above.
na.omit(head(managers,20))
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#>
Там нет пропущенных значений в edhec
данные, следовательно, не было никаких проблем
any(is.na(edhec))
any(is.na(managers))
Более простой способ - сохранить строки, в которых нет пропущенных значений, и вычислить статистику по ним.
managers_sub = managers[complete.cases(managers),]
var3<-rollapply(managers_sub,width=20,FUN=function(x) VaR(R=x,p=.95,method="modified"),by.column=TRUE)
ИЛИ ЖЕ
You could find the index where none of the columns are completely missing and subset accordingly
sapply(colnames(managers),function(x) all(is.na(managers[60:80,x])))