在 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 系列:
使用 zoo 包(可以直接表示此类序列)将原始表示形式保持为不规则间隔的时间序列,或者在转换为 zoo 之后使用 as.ts
将其转换为有规律的可能有很多 NA 的间隔序列。
忽略时间,只使用 1, 2, 3, ... 的时间。在那种情况下,该系列是规则间隔的,因此我们可以使用 ts.
使用间隔中的最后一个值或平均值将数据离散化为规则间隔的间隔。在那种情况下,该系列是规则间隔的,因此我们可以使用 ts.
对数据进行样条拟合,并从中选取规则间隔的点,给出可以用 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))
我开始进行时间序列数据分析,有人告诉我使用 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 系列:
使用 zoo 包(可以直接表示此类序列)将原始表示形式保持为不规则间隔的时间序列,或者在转换为 zoo 之后使用
as.ts
将其转换为有规律的可能有很多 NA 的间隔序列。忽略时间,只使用 1, 2, 3, ... 的时间。在那种情况下,该系列是规则间隔的,因此我们可以使用 ts.
使用间隔中的最后一个值或平均值将数据离散化为规则间隔的间隔。在那种情况下,该系列是规则间隔的,因此我们可以使用 ts.
对数据进行样条拟合,并从中选取规则间隔的点,给出可以用 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))