R:解释NAs的波动性函数
我正在寻求帮助,使波动率函数与我的数据帧一起工作。在下面的函数中,我只是尝试获取每种证券的价格每日日志回报(我数据中的每一列都是不同证券的价格随时间的变化),然后计算一个年化的volR:解释NAs的波动性函数,r,dataframe,time-series,na,R,Dataframe,Time Series,Na,我正在寻求帮助,使波动率函数与我的数据帧一起工作。在下面的函数中,我只是尝试获取每种证券的价格每日日志回报(我数据中的每一列都是不同证券的价格随时间的变化),然后计算一个年化的vol volcalc= function (x) { returns=log(x)-log(lag(x)) vol=sd(returns)*sqrt(252) return(vol) } 然后我使用下面的函数运行它,但它只返回NAs的1*ncol数值向量 testlag=apply(dataexample,
volcalc= function (x) {
returns=log(x)-log(lag(x))
vol=sd(returns)*sqrt(252)
return(vol)
}
然后我使用下面的函数运行它,但它只返回NAs的1*ncol数值向量
testlag=apply(dataexample,2,volcalc)
我的数据帧有大量的NAs(它包括整个时间段内的所有资产,即使它们当时不存在),一个明显的问题是我的功能忽略了NAs。但是,当我尝试向函数添加各种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合并到函数中,或者通过重写函数以不同的方式解决此问题?谢谢你的帮助 我们可以使用
删除'NA'元素!is.na(x)
,但是lag(x)
将返回na
作为第一个元素,可以使用sd
中的na.rm=TRUE
删除该元素
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
volcalc=函数(x){
x另一种方法是保留数据,并通过运行“NA.locf”功能(上一次观察结转)将所有NA替换为最接近的先前非NA值在应用“volcalc”函数之前,必须先从zoo软件包中删除。在任何情况下,都必须更改原始函数,因为使用“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
df.noNA感谢您的帮助-这对我的数据很有效。