2014-08-29 60 views
4

,我有以下的數據幀:與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功能的,但這隻會獲得所有列的累計收益率。

任何想法?

回答

5
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))

+0

我正在嘗試使用'na.omit'方法,但這個非常好。 (+1) – 2014-08-29 19:14:05

+0

如何將其移植到C代碼? RunSum的[xts源代碼中的一些基礎知識,處理主要的NAs](https://github.com/R-Finance/xts/search?utf8=%E2%9C%93&q=firstNonNA)。有興趣在C編寫runProd。任何指導@JoshuaUlrich? – 2014-11-17 12:36:11