Совокупная доходность с NA в R

У меня есть следующий фрейм данных:

df <- data.frame(Return1=c(NA, NA, .03, .04, .05),
             Return2=c(.25, .33, NA, .045, .90),
             Return3=c(.04, .073, .08, .04, .01))


  Return1 Return2 Return3
1      NA   0.250   0.040
2      NA   0.330   0.073
3    0.03      NA   0.080
4    0.04   0.045   0.040
5    0.05   0.900   0.010

Я хотел бы вычислить совокупную доходность, но в кадре данных отсутствуют значения. Я использовал:

cumprod(df+1)-1

Получение в результате

  Return1 Return2   Return3
1      NA  0.2500 0.0400000
2      NA  0.6625 0.1159200
3      NA      NA 0.2051936
4      NA      NA 0.2534013
5      NA      NA 0.2659354

Проблема здесь в том, что если есть NA, последующие строки будут иметь в качестве результата NA. Есть ли способ вычислить совокупную доходность без влияния NA на остальные строки ниже?

Я хотел бы получить в результате:

  Return1 Return2   Return3
1      NA  0.2500 0.0400000
2      NA  0.6625 0.1159200
3    0.03     NA  0.2051936
4 0.07120  0.7373 0.2534013
5 0.12476  2.3008 0.2659354

Я знаю функцию в пакете PerformanceAnalytics под названием Return.cumulative, но она будет получать только совокупный доход по всем столбцам.

Любые идеи?


person rwn1v    schedule 29.08.2014    source источник


Ответы (1)


cumpfun <- function(x){
  x[!is.na(x)] <- cumprod(x[!is.na(x)]+1)-1
  x
}
sapply(df,cumpfun)

#      Return1   Return2   Return3
# [1,]      NA 0.2500000 0.0400000
# [2,]      NA 0.6625000 0.1159200
# [3,] 0.03000        NA 0.2051936
# [4,] 0.07120 0.7373125 0.2534013
# [5,] 0.12476 2.3008937 0.2659354

Обратите внимание, что sapply возвращает матрицу. Если вам нужен фрейм данных, вы можете использовать что-то вроде as.data.frame(lapply(df, cumpfun))

person lebatsnok    schedule 29.08.2014
comment
Я пытался использовать метод na.omit, но этот очень хорош. (+1) - person Rich Scriven; 29.08.2014
comment
Как можно было бы перенести это на код C? Некоторые основы исходного кода xts для обработки runSum. NA. Заинтересованы в написании runProd на C. Любое руководство @JoshuaUlrich? - person Daniel Krizian; 17.11.2014