在 R 中处理时间序列的最佳实践是啥?
Posted
技术标签:
【中文标题】在 R 中处理时间序列的最佳实践是啥?【英文标题】:What is the best practice of handling time series in R?在 R 中处理时间序列的最佳实践是什么? 【发布时间】:2011-02-11 02:30:58 【问题描述】:我正在使用 R 对时间序列进行一些统计分析。我试过谷歌搜索,但我似乎找不到任何明确的答案。有谁知道更多请指点我正确的方向吗?
例子:
假设我想做两个时间序列的线性回归。时间序列包含每日数据,但有时可能会有间隙,因此时间序列不规则。自然,我只想比较两个时间序列都有数据的数据点。这是我目前将 csv 文件读入数据框的方法:
library(zoo)
apples <- read.csv('/Data/apples.csv', as.is=TRUE)
oranges <- read.csv('/Data/oranges.csv', as.is=TRUE)
apples$date <- as.Date(apples$date, "%d/%m/%Y")
oranges$date <- as.Date(oranges$date, "%d/%m/%Y")
zapples <- zoo(apples$close,apples$date)
zoranges <- zoo(oranges$close,oranges$date)
zdata <- merge(zapples, zoranges, all=FALSE)
data <- as.data.frame(zdata)
有没有更巧妙的方法?
另外,我如何对数据进行切片,例如,选择data
中日期在一定时期内的条目?
【问题讨论】:
代码不完全正确,我们没有你的 csv 文件……也许是一些虚拟数据? 我修正了代码中的错别字。但我真的看不出虚拟数据的意义。只需获取任何随机数据并将其放入两列 csv 文件中,一列命名为日期,另一列关闭。 原因是您的问题不会被认为是低质量的,因此响应者可以轻松运行代码,并且多个响应者都使用相同的输入运行它。由于这是您可以在不知道问题答案的情况下自己做的事情,因此通常认为您有责任提供此内容。 是的。但由于我要求最佳实践(我没有任何特殊问题要处理,我只是想知道是否有更直接的方法来实现相同的结果),我真的认为没有必要。任何习惯在 R 中使用时间序列的人都可以了解代码的要点,然后加上他的 0.02 美元。不过还是感谢您的回答。 【参考方案1】:尝试这些方法。这假设日期在第 1 列。 dyn 包可用于将lm
、glm
和许多类似的回归类型函数转换为接受动物园系列的函数。如图所示,写dyn$lm
代替lm
:
library(dyn) # also loads zoo
fmt <- "%d/%m/%Y"
zapples <- read.zoo('apples.csv', header = TRUE, sep = ",", format = fmt)
zoranges <- read.zoo('oranges.csv', header = TRUE, sep = ",", format = fmt)
zdata <- merge(zapples, zoranges)
dyn$lm(..whatever.., zdata)
您不需要all = FALSE
,因为lm
将在其na.action
参数的默认设置下忽略具有NA 的行。
window.zoo
函数可用于对数据进行切片。
根据您想要做什么,您可能还想查看 xts 和 quantmod 包。
【讨论】:
我不知道 dyn 包,确实很好。【参考方案2】:为什么将两个数据框都转换为zoo
,然后合并并转换回数据框?如果你想要一个数据框,只需在 read.csv()
之后运行这一行。
data <- merge(apples, oranges, by = "date")
这是子集化的方法。
subset(data, date < slicemax & date > slicemin)
【讨论】:
以上是关于在 R 中处理时间序列的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章