Расчет VaR с полным отсутствующим столбцом

Мне нужно рассчитать VaR доходности акций. Из этого поста: Используя функцию rollapply для расчета VaR с использованием 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", но есть ли способ сохранить отсутствующие столбцы и получить вывод "NA" для "HAM6" вместо удаления столбца "HAM6"? Я пробовал большинство методов, доступных для обработки пропущенных значений, но не смог найти подходящего решения. Буду признателен за любую оказанную помощь.

2 ответа

Решение

Использование 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

В дополнение к решению @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
Другие вопросы по тегам