2015-05-22 81 views
0

我正在尋找獲取波動函數以使用我的數據框的幫助。在下面的函數中,我只是試圖獲取每種證券的價格每日對數回報(我的數據中的每個列都是隨着時間的推移而出現的不同證券價格),然後計算每年的價格。R:解釋NAs的波動函數

volcalc= function (x) { 
    returns=log(x)-log(lag(x)) 
    vol=sd(returns)*sqrt(252) 
    return(vol) 
} 

然後我用下面的函數運行它,但它返回一個只有NAs的1 * ncol數值向量。

testlag=apply(dataexample,2,volcalc) 

我的數據框有來港嘉豪(它包括在整個時間段的所有資產,即使他們不在身邊的時候),和一個明確的問題是,我的功能被忽略了來港。但是當我試圖將各種na.rm = TRUE添加到該函數時,它根本不起作用。

下面是一個示例數據集,其中列x和y是不同的證券,每行代表一天。

structure(list(x = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
NA, NA), y = c(3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, NA, NA, NA, NA 
)), .Names = c("x", "y"), row.names = c(NA, 12L), class = "data.frame") 

我的問題是:如何既包含在NAS的功能或重寫功能解決這個問題以不同的方式?感謝您的幫助!

回答

0

我們可以!is.na(x)刪除「NA」的元素,但lag(x)將返回NA爲第一要素,這可以通過在sd

volcalc= function (x) { 
    x <- x[!is.na(x)] 
    returns=log(x)-log(lag(x)) 
    vol=sd(returns, na.rm=TRUE)*sqrt(252) 
    return(vol) 
} 

apply(dataexample, 2, volcalc) 
# x  y 
#3.012588 1.030484 
+1

感謝您的幫助 - 這對我的數據非常有效。 –

2

另一種使用na.rm=TRUE是讓你的數據被刪除並且在應用'volcalc'函數之前,通過運行動物園包中的'na.locf'函數(最後一次觀察結果),用所有最近的非NA值替換所有NA。在任何情況下都必須改變原始函數,因爲使用'lag'函數至少引入一個Akrun提到的NA(延遲爲1)。

df.noNA <- na.locf(df) # df: original df with NAs 
apply(df.noNA, 2, volcalc) # using Akrun’s corrected volcalc function 
#  x  y 
#3.155899 1.592084 

你更喜歡哪個選項取決於NAS系統上的數據中的比例,您認爲「真正的」波動性恢復將是不同的價值觀是什麼非常多。