R:解释NAs的波动性函数

R:解释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,

我正在寻求帮助,使波动率函数与我的数据帧一起工作。在下面的函数中,我只是尝试获取每种证券的价格每日日志回报(我数据中的每一列都是不同证券的价格随时间的变化),然后计算一个年化的vol

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感谢您的帮助-这对我的数据很有效。