【问题标题】:Why is xts implemented as a matrix rather than a data frame?为什么 xts 实现为矩阵而不是数据框?
【发布时间】:2012-01-14 14:50:24
【问题描述】:

我在this 线程中找到了一些关于 xts 字段表示的信息,但我仍然不清楚为什么 xts 是索引 + 矩阵。为什么不是索引+数据框?在使用因子和数字列时,这不是更灵活吗?

一旦我在 xts 中加载了数据,大部分工作就是对时间序列的完整集或子集执行数值运算。为此,索引工作得很好,但我不得不通过像data.frame(data.matrix(myxts)) 这样的调用来提取因子和数值列。

此外,我发现使用 $ 表示法比使用矩阵索引更方便,尽管这确实是一个不同的问题。例如:

lm(myxts$Res ~ myxts$ThisVar + myxts$ThatVar)

更容易写
lm(myxts[, "Res"] ~ myxts[, "ThisVar"] + myxts[, "ThatVar"]).

【问题讨论】:

    标签: r xts


    【解决方案1】:

    xts 使用矩阵而不是 data.frame 因为:

    1. 它是 zoo 的子类,这就是 zoo 对象的结构,并且
    2. 矩阵对象的性能比 data.frames 好得多。

    您的第二个问题可以通过使用lmdata= 参数来解决,或者更一般地,使用with

    with(myxts, lm(Res ~ ThisVar + ThatVar))
    

    【讨论】:

    • 这回答了我的问题,但是 data.matrix() 调用处理数字的成本是多少?它不会破坏在 xts 中使用字符矩阵与数据框以获得更好性能的目的吗?
    • 我在挠头。矩阵(任何类型的)中永远不会有因子变量,因为矩阵对象会删除除名称和维度之外的所有属性。我相信您错过了 Joshua 提出的观点:当使用 with 访问或传递时,您不需要将 data.framedata.matrix 包裹在 xts 对象周围以将其数值转换为 lm作为lm 的数据参数。
    • 另外zoo 被设计为增强的ts 类(在R 的核心),它又基于矩阵。请参阅动物园设计小插图:cran.r-project.org/web/packages/zoo/vignettes/zoo-design.pdf。请注意,动物园确实支持$。例如library(zoo); z <- zoo(cbind(a = 1:3, b = 4:6)); z$a 。顺便说一句,矩阵和数据帧之间的性能差异非常显着。
    • @RobertKubrick:我不确定。我们没有花很多时间优化 xts 以进行时间序列估计。我所指的性能体现在能够非常快速地操纵具有数千万或数亿个元素的 xts 对象。
    • 罗伯特,成本不是转化,成本是元素的访问。矩阵的性能明显优于 data.frames,这在 r-devel 上多年来一直备受争议。
    猜你喜欢
    • 1970-01-01
    • 2014-10-13
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多