我正在寻找R中滚动/滑动窗口函数方面的一些性能提升.这是一个非常常见的任务,可用于任何有序的观测数据集.我想分享一些我的发现,也许有人能够提供反馈,使其更快.
重要的是我专注于案例align="right"
和自适应滚动窗口,因此width
是一个向量(与我们的观察向量相同的长度).如果我们有width
标量,那么已经有非常好的函数zoo
和TTR
包非常难以击败(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)
我们希望在x
带有可变滚动窗口的矢量上应用滚动函数width
.
set.seed(1)
width = sample(2:4,length(x),TRUE)
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,我们将不得不滚动功能适应sample
的c(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)
任何指标都可用于产生自width
变量作为自适应移动平均线的不同变体或任何其他函数.
寻找最佳表现.
我试图在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) 我导入的数据包含7个变量:Y
和X1
,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) 我有一个矩阵,其中每一行都是一个分布的样本.我想对使用的分布进行滚动比较,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
在循环中填充(编辑:这个工作,但它仍然很慢).
我想估计大约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的解决方案也是值得赞赏的.
我需要对每日股票收益进行滚动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下载
有谁可以帮我解决和理解这个问题?
想象一下,我有一个数字列表(即 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.frame或data.table 中是否有针对庞大数据集的快速解决方案?我的数据集相当大,有 10+M 行。
我正在尝试计算在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.任何帮助将非常感激..
我需要在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数据集上执行上述计算?
我正在尝试计算移动窗口的一些统计数据,并在动物园包中使用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 ×10
rollapply ×10
zoo ×3
data.table ×2
count ×1
covariance ×1
dplyr ×1
mapply ×1
optimization ×1
rollover ×1
sparklyr ×1
xts ×1