标签: rollapply

自适应移动平均 - R中的最佳性能

我正在寻找R中滚动/滑动窗口函数方面的一些性能提升.这是一个非常常见的任务,可用于任何有序的观测数据集.我想分享一些我的发现,也许有人能够提供反馈,使其更快.
重要的是我专注于案例align="right"和自适应滚动窗口,因此width是一个向量(与我们的观察向量相同的长度).如果我们有width标量,那么已经有非常好的函数zooTTR包非常难以击败(4年后:它比我预期的要容易),因为其中一些甚至使用Fortran(但仍然是用户定义的)使用下面提到的FUN可以更快wapply.
RcppRoll由于其出色的性能,包值得值得一提,但到目前为止还没有能够回答这个问题的功能.如果有人可以扩展它以回答这个问题,那将会很棒.

考虑一下我们有以下数据:

x = c(120,105,118,140,142,141,135,152,154,138,125,132,131,120)
plot(x, type="l")
Run Code Online (Sandbox Code Playgroud)

大块make_x的情节

我们希望在x带有可变滚动窗口的矢量上应用滚动函数width.

set.seed(1)
width = sample(2:4,length(x),TRUE)
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,我们将不得不滚动功能适应samplec(2,3,4).
我们将应用mean功能,预期结果:

r = f(x, width, FUN = mean)
print(r)
##  [1]       NA       NA 114.3333 120.7500 141.0000 135.2500 139.5000
##  [8] 142.6667 147.0000 146.0000 131.5000 128.5000 131.5000 127.6667
plot(x, type="l")
lines(r, col="red")
Run Code Online (Sandbox Code Playgroud)

大块make_results的情节

任何指标都可用于产生自width变量作为自适应移动平均线的不同变体或任何其他函数.

寻找最佳表现.

r zoo mapply rollapply data.table

16
推荐指数
3
解决办法
5555
查看次数

如何更有效地计算滚动协方差

我试图在R中计算一组数据(我的x变量的每一列)和另一个(y变量)之间的滚动协方差.我想我可以使用其中一个应用函数,但是找不到如何滚动两个同时设置输入.这是我尝试过的:

 set.seed(1)
 x<-matrix(rnorm(500),nrow=100,ncol=5)
 y<-rnorm(100)
 rollapply(x,width=5,FUN= function(x) {cov(x,y)})
 z<-cbind(x,y)
 rollapply(z,width=5, FUN=function(x){cov(z,z[,6])})
Run Code Online (Sandbox Code Playgroud)

但没有人做我想做的事.我找到的一个解决方案是使用for循环,但想知道我是否可以在R中更高效:

dResult<-matrix(nrow=96,ncol=5)
for(iLine in 1:96){
    for(iCol in 1:5){
        dResult[iLine,iCol]=cov(x[iLine:(iLine+4),iCol],y[iLine:(iLine+4)])
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我预期的结果:

head(dResult)


           [,1]       [,2]        [,3]        [,4]        [,5]
[1,]  0.32056460 0.05281386 -1.13283586 -0.01741274 -0.01464430
[2,] -0.03246014 0.78631603 -0.34309778  0.29919297 -0.22243572
[3,] -0.16239479 0.56372428 -0.27476604  0.39007645  0.05461355
[4,] -0.56764687 0.09847672  0.11204244  0.78044096 -0.01980684
[5,] -0.43081539 0.01904417  0.01282632  0.35550327  0.31062580
[6,] -0.28890607 0.03967327  0.58307743  0.15055881  0.60704533
Run Code Online (Sandbox Code Playgroud)

r covariance rollapply

11
推荐指数
2
解决办法
1347
查看次数

使用roll apply在R中滚动回归

我导入的数据包含7个变量:YX1,X2,X3,X4,X5,X6.我尝试应用该rollapply函数,zoo以便在样本内运行滚动回归,窗口为262 obs.(一年中的工作日).

         date             Y            X1            X2
1     10/1/07 -0.0080321720  4.690734e-03  3.333770e-03
2     10/2/07  0.0000000000 -2.818413e-03  5.418223e-03
3     10/3/07  0.0023158650 -4.178744e-03 -3.821100e-04
4     10/4/07 -0.0057491710 -5.071030e-03 -8.321550e-04
5     10/5/07  0.0073570500  3.065045e-03  5.179574e-03
6     10/8/07  0.0127708010 -7.278513e-03  1.145395e-03
7     10/9/07  0.0032661980  9.692267e-03  6.514035e-03
8    10/10/07  0.0013824430  1.161780e-04  2.676416e-03
9    10/11/07  0.0026607550  1.113179e-02  8.825719e-03
10   10/12/07 -0.0046362600 -2.453561e-03 -6.584070e-03
11   10/15/07 -0.0023757680 -7.829081e-03 -3.070540e-03
12 …
Run Code Online (Sandbox Code Playgroud)

r rollapply rolling-computation

8
推荐指数
2
解决办法
2万
查看次数

有效地执行行式分布测试

我有一个矩阵,其中每一行都是一个分布的样本.我想对使用的分布进行滚动比较,ks.test并在每种情况下保存测试统计.从概念上实现这个概念的最简单方法是使用循环:

set.seed(1942)
mt <- rbind(rnorm(5), rnorm(5), rnorm(5), rnorm(5))

results <- matrix(as.numeric(rep(NA, nrow(mt))))

for (i in 2 : nrow(mt)) {

  results[i] <- ks.test(x = mt[i - 1, ], y = mt[i, ])$statistic

}
Run Code Online (Sandbox Code Playgroud)

但是,我的实际数据有大约400列和大约300,000行,我有很多例子.所以我希望这很快.Kolmogorov-Smirnov测试并不是所有数学上复杂的测试,所以如果答案是"实现它Rcpp",我会勉强接受,但我会感到有些惊讶 - 在一对上进行计算已经非常快了在R.

方法我已经尝试但无法工作:dplyr使用rowwise/do/lag,zoo使用rollapply(这是我用来生成分布),并data.table在循环中填充(编辑:这个工作,但它仍然很慢).

optimization r rollapply

8
推荐指数
1
解决办法
581
查看次数

使用sparklyr对大数据进行rollapply

我想估计大约2250万个观测数据集的滚动风险值,因此我想使用sparklyr进行快速计算.这是我做的(使用示例数据库):

library(PerformanceAnalytics)
library(reshape2)
library(dplyr)

data(managers)
data <- zerofill(managers)
data<-as.data.frame(data)
class(data)
data$date=row.names(data)
lmanagers<-melt(data, id.vars=c('date'))
Run Code Online (Sandbox Code Playgroud)

现在我估计使用dplyr和PerformanceAnalytics包的VaR:

library(zoo) # for rollapply()
var <- lmanagers %>% group_by(variable) %>% arrange(variable,date) %>% 
  mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T))
Run Code Online (Sandbox Code Playgroud)

这很好用.现在我这样做是为了使用sparklyr:

library(sparklyr)
sc <- spark_connect(master = "local")
lmanagers_sp <- copy_to(sc,lmanagers)
src_tbls(sc)

var_sp <- lmanagers_sp %>% group_by(variable) %>% arrange(variable,date) %>% 
  mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T)) %>% 
  collect
Run Code Online (Sandbox Code Playgroud)

但是这会产生以下错误:

Error: Unknown input type: pairlist
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我哪里出错,什么是正确的代码?或者任何其他更快地估算滚动VaR的解决方案也是值得赞赏的.

r performanceanalytics dplyr rollapply sparklyr

7
推荐指数
1
解决办法
615
查看次数

使用R估计风险滚动值(VaR)

我需要对每日股票收益进行滚动VaR估计.起初我做了以下事情:

library(PerformanceAnalytics)
data(edhec)
sample<-edhec[,1:5]
var605<-rollapply(as.zoo(sample),width=60,FUN=function(x) VaR(R=x,p=.95,method="modified",invert=T),by.column=TRUE,fill=NA)
Run Code Online (Sandbox Code Playgroud)

它执行计算并返回一个zoo对象,但给出了一系列警告,如下所示:

VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.00030977098532231 
Run Code Online (Sandbox Code Playgroud)

然后,我尝试了同样的数据样本,如下所示:

library(foreign)
sample2 <- read.dta("sample2.dta")
sample2.xts <- xts(sample2[,-1],order.by=as.Date(sample2$datadate,format= "%Y-%m-%d"))
any(is.na(sample2.xts))
var605<-rollapply(as.zoo(sample2.xts),width=60,FUN=function(x) VaR(R=x,p=.95,method="modified",invert=T),by.column=TRUE,fill=NA)
Run Code Online (Sandbox Code Playgroud)

但是不会返回任何动物园对象并给出以下警告和错误:

VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.0077322590200255
Error in if (eval(tmp < 0)) { : missing value where TRUE/FALSE needed
Called from: top level
Run Code Online (Sandbox Code Playgroud)

从之前的文章(使用rollapply函数进行使用R的VaR计算)我理解,如果缺少完整的滚动窗口,则无法执行滚动估计,但在我的数据(sample2.dta)中没有缺失值.

sample2.dta可以从https://drive.google.com/file/d/0B8usDJAPeV85WDdDQTFEbGQwaUU/edit?usp=sharing下载

有谁可以帮我解决和理解这个问题?

r computational-finance performanceanalytics rollapply

6
推荐指数
1
解决办法
2702
查看次数

计算比当前数字低的数字

想象一下,我有一个数字列表(即 data.table/data.frame 中的数字列)。

1
5
5
10
11
12
Run Code Online (Sandbox Code Playgroud)

对于列表中的每个数字,想要计算有多少个唯一数字低于该特定数字 + 5。

大写的解释,第一个数字=1,搜索范围是1+5=6,所以三个数字在范围内,小于或等于:c(1,5,5),然后count unique是2。这都是假设我们有附加条件,该数字不仅必须小于 current_number + 5,而且其在列表中的索引必须 >= current_number 的索引。

在这种情况下,结果将是:

2
2
2
3
2
1
Run Code Online (Sandbox Code Playgroud)

注意:data.framedata.table 中是否有针对庞大数据集的快速解决方案?我的数据集相当大,有 10+M 行。

r rollover count rollapply data.table

6
推荐指数
2
解决办法
170
查看次数

R - ave rollapply错误:k <= n不为TRUE

我正在尝试计算在R中按多个维度分组的滚动均值.我将通过以下方式在SQL中执行的操作:

AVG(value) OVER 
   (PARTITION BY dim1, dim2 ORDER BY date 
       RANGE BETWEEN 5 PRECEDING AND CURRENT ROW)
Run Code Online (Sandbox Code Playgroud)

如果我只选择几个维度,以下似乎可行:

s <- ave(df$value, 
     list(df$dim1, df$dim2), 
     FUN= function(x) rollapply(x, 5, mean, align='right'))
Run Code Online (Sandbox Code Playgroud)

但是当我选择完整的维度集时会出现以下错误:

Error: k <= n is not TRUE 
Run Code Online (Sandbox Code Playgroud)

我跑的时候遇到同样的错误:

rollapply(c(1:2), 3, mean, align='right')
Run Code Online (Sandbox Code Playgroud)

所以我想问题是一些尺寸组合没有足够的值来计算平均值.

我怎么能克服它?我很好,因为这些组合有一个NA.任何帮助将非常感激..

r rollapply

5
推荐指数
1
解决办法
4118
查看次数

更快速地替代功能'rollapply'

我需要在xts数据上运行滚动窗口函数,该数据包含大约7,000行和11,000列.我做了以下事情:

require(PerformanceAnalytics)
ssd60<-rollapply(wddxts,width=60,FUN=function(x) SemiDeviation(x),by.column=TRUE)
Run Code Online (Sandbox Code Playgroud)

我等了12个小时,但计算没有完成.但是,当我尝试使用小数据集时,如下所示:

sample<-wddxts[,1:5]
ssd60<-rollapply(sample,width=60,FUN=function(x) SemiDeviation(x),by.column=TRUE)
Run Code Online (Sandbox Code Playgroud)

计算在60秒内完成.我在配备Intel i5-2450M CPU,Windows 7操作系统和12 GB RAM的计算机上运行它们.

任何人都可以建议我,如果有更快的方法在大型xts数据集上执行上述计算?

r zoo xts performanceanalytics rollapply

5
推荐指数
1
解决办法
1731
查看次数

rollapply中的对齐和偏移

我正在尝试计算移动窗口的一些统计数据,并在动物园包中使用rollapply.我的问题是如何让rollapply将该函数应用于前面的n个观察值而不是当前观察值和前面的n-1个观察值,因为右对齐似乎可以.

require(zoo)
z <- data.frame(x1=11:111, x2=111:211, x3=as.Date(31:131))#generate data
output<-data.frame(dates=z$x3,
                   rollapply(z[,1:2],by.column=TRUE, 5, max, fill=NA, align='right'))
Run Code Online (Sandbox Code Playgroud)

我有一个预感,这是由回答?rollapply"如果width是一个普通的数字向量,它的元素被认为是与align一起解释的宽度,而如果width是一个列表,它的组件被视为偏移.在上面的例子中,如果宽度为1,然后宽度为每个第s点再循环.如果width是列表,则其组件表示整数偏移,使得列表的第i个分量引用位置i + width [[i]]的时间点".但是我不知道R代码意味着什么,没有提供任何例子.

r zoo rollapply

5
推荐指数
1
解决办法
3658
查看次数