2017-04-07 42 views
0

我有一个R数据帧,我需要为它的每一列计算多个滚动时间窗口的自相关。 我用下面的溶液R数据帧滚动自相关函数

myacf=function(x,lag){ 
return(acf(x, na.action=na.pass,lag.max=lag)[lag]) 
} 

for(i in 2:dim(dfres)[1]){ 
    print(i) 
    col=rollapply(as.numeric(dfres[,i]),width=oneday,FUN=myacf,lag=oneday) 
} 

其中dfres是矩阵(I排除第一列,因为它包含的时间戳),以及rollapply是从封装动物园。 我得到以下错误:plot.window中的错误(需要有限的'ylim'值)。 无论如何,我不需要重复,但只是在所选延迟中的自相关值。有人能帮我吗?

+0

你能在 “他们没有工作” 细说。为了让我们就此问题提供建议,请使用[最低可重现的示例]更新您的帖子(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)帮帮我。 – OdeToMyFiddle

+0

我用一个例子编辑了原文。 – lapally

回答

0

随着lapply可以在导致 acf系列所选滞后值的每一列操作rollapply功能。然后我们使用Reduce来结合上述步骤的结果。

我已经使用PerformanceAnalytics包的数据集edhec这个演示。您 可以相应地更改width参数。

library("PerformanceAnalytics") 

#load test dataset 
data(edhec,package="PerformanceAnalytics") 

#select subset with fewer columns 
edhec_sub = edhec[,1:5] 

fn_lag_ACF = function(lagValue = x) { 


#for width as 1 year calculate acf for input lagValue for each column 

acfList = lapply(edhec_sub,function(x) { 


TS = rollapply(x, width = 12, 
FUN = function(z) acf(z,na.action=na.pass,lag.max= lagValue,plot=FALSE)$acf[lagValue], 
       by.column = FALSE, align = "right") 
colnames(TS) = colnames(x)    

return(TS) 

}) 

#combine acf output for all columns from above step 
acfMerge = Reduce(function(x,y) merge.xts(x,y), acfList) 

return(acfMerge) 
} 

#test with lagValue = 2 
lag2DF = fn_lag_ACF(lagValue = 2) 

输出:

head(lag2DF,15) 
#   Convertible.Arbitrage CTA.Global Distressed.Securities Emerging.Markets 
#1997-01-31     NA   NA     NA    NA 
#1997-02-28     NA   NA     NA    NA 
#1997-03-31     NA   NA     NA    NA 
#1997-04-30     NA   NA     NA    NA 
#1997-05-31     NA   NA     NA    NA 
#1997-06-30     NA   NA     NA    NA 
#1997-07-31     NA   NA     NA    NA 
#1997-08-31     NA   NA     NA    NA 
#1997-09-30     NA   NA     NA    NA 
#1997-10-31     NA   NA     NA    NA 
#1997-11-30     NA   NA     NA    NA 
#1997-12-31    0.5560540 -0.3010264   0.02908761  0.3305791 
#1998-01-31    0.5055951 -0.4245876   0.04278214  0.1761287 
#1998-02-28    0.5195872 -0.4298767   0.01375580  0.1605579 
#1998-03-31    0.5070003 -0.4656213   -0.04519778  0.2061610 
#   Equity.Market.Neutral 
#1997-01-31     NA 
#1997-02-28     NA 
#1997-03-31     NA 
#1997-04-30     NA 
#1997-05-31     NA 
#1997-06-30     NA 
#1997-07-31     NA 
#1997-08-31     NA 
#1997-09-30     NA 
#1997-10-31     NA 
#1997-11-30     NA 
#1997-12-31   -0.11842164 
#1998-01-31   -0.05986578 
#1998-02-28   -0.09663855 
#1998-03-31   -0.09680819