- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 xts
对象,我希望创建列的加权总和(并且经常这样做)。到目前为止,最简单的方法是矩阵乘法,但是结果失去了很好的 xts
素质。
通过创建一个新 xts
很容易将它们添加回来。对象——但它既缓慢又乏味。
例如:
dd <- xts(matrix(rnorm(200), ncol=2), Sys.Date() + 1:100)
w_sum <- dd %*% c(-1, 1)
> tail(w_sum)
[,1]
[95,] 0.1758262
[96,] -0.3310975
[97,] -0.1204836
[98,] -1.2242001
[99,] -1.7333222
[100,] 1.1216603
w_sumx <- xts(dd %*% c(-1, 1), index(dd))
xts
减法真的很快。有没有办法利用
xts
的快速内部结构来做到这一点? ?
f1 <- function() xts(dd %*% c(-1, 1), index(dd))
f2 <- function() dd[,2] - dd[,1]
> microbenchmark::microbenchmark(f1(), f2(), times = 1000)
Unit: microseconds
expr min lq mean median uq max neval cld
f1() 83.7 97.3 114.1294 104.65 115.00 6688.4 1000 b
f2() 26.3 34.0 40.6202 38.85 45.15 155.4 1000 a
最佳答案
存在一些简单的替代方案。显然你可以重写 Rcpp
中的方法正如建议的那样,但更简单的替代方法是在执行矩阵正则乘法后覆盖属性。
dd_new <- dd %*% c(-1, 1)
att <- attributes(dd)
att$dim <- dim(dd_new)
attributes(dd_new) <- att
这不如纯矩阵乘法快,但比对时间序列本身进行子集化快 10 - 13 倍。
microbenchmark::microbenchmark(xts = dd[, 1] - dd[, 2],
matmult = dd %*% c(1, -1),
xtsmatmult = xts(dd %*% c(1, -1), index(dd)),
"%.%" = dd %.% c(1, -1),
"%-%" = dd %-% c(1, -1),
times = 1e5)
Unit: milliseconds
expr min lq mean median uq max neval
xts 0.0396 0.0685 0.11200 0.0998 0.1170 15.40 1e+05
matmult 0.0008 0.0021 0.00352 0.0028 0.0040 7.71 1e+05
xtsmatmult 0.0853 0.1380 0.22900 0.2100 0.2300 117.00 1e+05
%.% 0.0025 0.0055 0.00905 0.0076 0.0099 8.97 1e+05
%-% 0.0096 0.0183 0.03030 0.0268 0.0318 101.00 1e+05
在上面
%.%
是一个准系统函数,只剩下矩阵乘法和覆盖属性,而
%-%
添加了一些简单的输入检查,以确保尺寸是可接受的,并使用
S3
类样式,以简化概括。
compiler::cmpfun
函数已用于对函数进行字节编译(类似于包函数)。在这种情况下,效果是微不足道的。
`%.%` <- compiler::cmpfun(function(x, z){
x2 <- x %*% z
att <- attributes(x)
att$dim <- dim(x2)
attributes(x2) <- att
x2
})
`%-%` <- function(x, z)
UseMethod('%-%')
`%-%.xts` <- compiler::cmpfun(function(x, z){
##
if(!is.xts(x))
stop('x must be an xts object')
if(!is.numeric(z) || !(n <- length(z)) == ncol(x) || n == 0)
stop('z must be an index vector')
x2 <- x %*% z
att <- attributes(x)
att$dim <- dim(x2)
attributes(x2) <- att
x2
})
关于r - 矩阵乘法而不会丢失 xts 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60237830/
我如何使用 apply 系列函数,比如 apply.daily到多元 XTS? 例如: 时间,a,b ... 2012-02-11 16:21:24 4.7258 7.7258 2012-02-11
我有一个 xts 对象列表,这些对象具有共同的索引和列名。 我想按索引进行 rbind 并对列进行平均: dts = seq.POSIXt(from = Sys.time() - days(2), t
我正在使用 xts 时间序列在 R 中工作。 我有什么: 具有不等间隔时间步长的时间序列数据集。 我想得到什么: 具有等距时间步长的时间序列,其值对应于与时间步长重叠的原始值的比例(请参见下面的示例)
this = structure(c(-0.012, -0.028, -0.044, -0.033, -0.039, -0.042), .Dim = c(3L, 2L), .Dimnames
在 xts 对象中是否有一种方法可以执行与下面相同的操作,但对于具有多天盘中数据的 xts 对象?下面的工作就像一个时钟,但一天的数据。如果我从 22 日到 26 日通过 xts,它不会。似乎不可能一
library(xts) set.seed(1) x = xts( cbind(a=1:10,b=20:11) , Sys.Date()+1:10 ) y = xts( runif(10) , Sys
con = gzcon(url('http://www.systematicportfolio.com/sit.gz', 'rb')) source(con) close(con) load.pack
我有一个 list 。列表由 5 个 xts 对象组成。每个对象由 5 个 xts 系列组成。每个系列包含 183 个观察值。我想从所有这些系列中提取一个公共(public)系列。我要减去的系列名为
在将 rowSums 传递给 xts 对象时,是否可以保留 xts 对象的索引? 目前,我将结果重新转换为 xts 对象,但是如果 rowSums 能够简单地返回它的内容,这似乎并没有那么快已通过。
首先让我说一下,我看了一下 ?xts,意识到这是一个与时区相关的问题,似乎已经解决了,但我不明白为什么 它正在发生。所以:我有一个简单的价格数据数据框。当我将它转换为 xts 对象时,xts 对象的第
当我尝试执行以下工作时发生错误: # generate random integrals # data <- xts(floor(runif(100, 1,101)),as.Date("1973-02
这是输出: library(tseries) # for adf.test function adf.test(data) Augmented Dickey-Fuller Test data: da
如何删除 xts 图右上角的日期范围?例如,在下面 xts 图的右上角,我想删除文本“2007-01-02/2007-06-30”。 library(xts) data(sample_matrix)
我有一个不规则的时间序列并且正在使用 xts的 endpoints 获取我的时间序列的每小时索引。 endpoints(data, on="hours") 我正在使用它以这种方式计算每小时 perio
申请 split函数到 xts对象来自 weeks将行分组为每周块。组中的默认天数是 Monday至 Sunday .想要群里的天数来自Sunday怎么办?至 Saturday ? library(x
我在删除 xts 对象中的重复行时遇到问题。我有一个 R 脚本,它将下载货币的刻度财务数据并将其转换为 OHLC 格式的 xts 对象。该脚本还会每 15 分钟提取一次新数据。新数据从今天的第一笔交易
我真的很难在这里找到解决方案。如果您查看最后一行代码,您会明白我想在下次开盘时买入并在 5 天后卖出 (x = 5)。 问题是 xts 索引正在计算周末。因此,例如,您会在 7 月 12 日星期五获得
我有 3 个 xts 对象,它们的标记都是“日期”对象: > a a 1995-01-03 1.76 1995-01-04 1.69
我正在尝试按天比较不同的时间序列。 目前典型的 XTS 对象如下所示: > vwap.crs QUANTITY QUANTITY.1 2014-03-03 13
我在列表中有一些数据,如下所示: > y $ABMD.Rank ABMD.Rank $ATVI.Rank ATVI.Rank $ADBE.Rank ADBE.Rank $
我是一名优秀的程序员,十分优秀!