我需要计算股票收益的滚动VaR。从这篇文章:Using rollapply function for VaR calculation using R,我了解完全缺失案例的列会出错。但由于各公司的股票收益的起始日期和结束日期不同,因此当数据从长格式转换为宽格式时,会产生缺失值。可以仅使用没有缺失值的行来进行估计,但这会导致严重的数据丢失。因此,有没有办法使用具有完整缺失值的列执行计算,并且对于缺失的列,获得输出“NA”。这就是我所做的:
library(PerformanceAnalytics)
data(managers)
VaR(managers, p=.95, method="modified")
它执行了所需的计算,但当我尝试使用前60行且“HAM6”列完全丢失时
managers2<-managers[1:60,]
VaR(managers2, p=.95, method="modified")
我收到以下错误:
Error in dimnames(cd) <- list(as.character(index(x)), colnames(x)) :
'dimnames' applied to non-array
我理解错误是由于缺少'HAM6'列,但有没有办法保留缺少的列并获得'HAM6'的输出'NA'而不是删除'HAM6'列?我已经尝试了大多数可用于处理缺失值的方法,但找不到任何合适的解决方案。非常感谢任何帮助。
答案 0 :(得分:1)
使用apply(managers,2,...)
检查整个列是否为NA
,如下所示:
apply(managers2,2,function(x){
if(!all(is.na(x))){
return(as.numeric(VaR(x, p=.95, method="modified")))
} else {
return(NA)
}
})
结果:
VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.00354267287759942
HAM1 HAM2 HAM3 HAM4 HAM5 HAM6 EDHEC LS EQ SP500 TR US 10Y TR US 3m TR
-0.03212244 -0.03698665 -0.04403660 -0.08093557 -0.12635656 NA -0.02275816 -0.06886077 -0.02510378 NA
警告引用US 3m TR
。这就是NA
答案 1 :(得分:0)
除了@ Floo0的解决方案之外,作为此问题的解决方法,缺失值可以通过相应期间的平均回报来估算。 有关详细信息,请参阅(http://www.r-bloggers.com/missing-data-imputation/)
require(PerformanceAnalytics)
data(managers)
managers.df=as.data.frame(managers)
dateidx = as.Date(index(managers))
#Compute mean Return for each period
MeanReturn_PerPeriod=rowMeans(managers.df,na.rm=TRUE)
#Create copy of dataset for new values
managers.df.new=managers.df
#Impute NA Values by average return for rest of the data
for(x in 1:ncol(managers.df.new)) {
managers.df.new[,x][is.na(managers.df.new[,x])]=MeanReturn_PerPeriod[is.na(managers.df.new[,x])]
}
managers_imputed=xts(managers.df.new,order.by=dateidx)
#Test VaR calculation
managers2<-managers_imputed[1:60,]
VaR(managers2, p=.95, method="modified")
#VaR calculation produces unreliable result (inverse risk) for column: 10 : -0.00354267287759942
# HAM1 HAM2 HAM3 HAM4 HAM5 HAM6 EDHEC LS EQ SP500 TR US 10Y TR
#VaR -0.03212244 -0.03491864 -0.0440366 -0.08093557 -0.02880137 -0.02696782 -0.02130781 -0.06886077 -0.02510378
# US 3m TR
#VaR NA