在 R 中使用 ts() 函数

Using the ts() function in R

我开始进行时间序列数据分析,有人告诉我使用 R 中的 ts() 数据函数。但是,我的时间序列数据并没有遵循直接趋势。

例如,在线教程解释了如果您有每月、每季度或每年的趋势,如何创建时间序列。 但是,我记录的时间是0、5、11、15、20、30和50。

我想知道是否有人可以就如何解决这个问题提出任何建议? 非常感谢:)

下面的代码使用了一个内置于 R 中的名为 AirPassengers 的数据框,而它是一个 ts(),当对其进行变异以使其能够很好地使用 GGPlot2 绘图时。我相信这个数据集是 12 年的月度数据(144 行),但我们将其作为时间序列获取。

library(ggplot2)
library(reshape2)

dff <- melt(AirPassengers)
ggplot(data = dff, aes(x = 1:length(dff[[1]]), y = dff$value)) + geom_line() + labs(x = "Time", y = "Value")

请关注

class(AirPassengers)
dff <- melt(AirPassengers)
class(dff)

其中 ts() 变为 data.frame。

关键问题是 ts 系列是规则间隔的,而你的不是,但是有许多方法可以获得规则间隔的 ts class 系列:

  1. 使用 zoo 包(可以直接表示此类序列)将原始表示形式保持为不规则间隔的时间序列,或者在转换为 zoo 之后使用 as.ts 将其转换为有规律的可能有很多 NA 的间隔序列。

  2. 忽略时间,只使用 1, 2, 3, ... 的时间。在那种情况下,该系列是规则间隔的,因此我们可以使用 ts.

  3. 使用间隔中的最后一个值或平均值将数据离散化为规则间隔的间隔。在那种情况下,该系列是规则间隔的,因此我们可以使用 ts.

  4. 对数据进行样条拟合,并从中选取规则间隔的点,给出可以用 ts 表示的规则间隔序列。

如果序列存在自然周期性,那么您可能需要修改序列表示为 ts 的方式,以反映其频率,但由于问题未提供这方面的信息,我们将在此处忽略它。

另外,根据具体的应用程序,可能会有一些包具有可以使用的特定于应用程序的方法。参见 https://cran.r-project.org/web/views/

例如,

# create some test data
set.seed(123)
m <- matrix(rnorm(35), 7)
tt <- c(0, 5, 11, 15, 20, 30, 50)

# 1. zoo series
library(zoo)
z <- zoo(m, tt)

ts1 <- as.ts(z)  # make regularly spaced ts series but with many NAs

# 2. ignore times
ts2 <- ts(m)

# 3. discretize to regularly spaced grid - z is from #1
zd <- aggregate(z, 20 * ceiling(tt/20), tail, 1)
ts3 <- as.ts(zd)

# 4.  spline 
Ls <- apply(m, 2, spline, x = tt)   # list of splines, one per column
zs <- zoo(sapply(Ls, "[[", "y"), Ls[[1]]$x)  # as single zoo object
ts4 <- unname(as.ts(zs))