在 R 中将 xts 强制转换为 ts
Coerce xts to ts in R
我有 xts
10 天数据的时间序列对象。数据以分钟频率采样。因此,对于每一天,我有 1440 个观察值。我需要将 xts
强制转换为 ts
对象,以便我可以使用 example 中使用的 stl
函数。但是,在强制转换时,R 会产生错误 as
ts(min_data,start=start(min_data),end = end(min_data),frequency=10)
Error in ts(min_data, start = start(min_data), end = end(min_data), frequency = 10) :
invalid time series parameters specified
我将频率设置为10,因为我使用的是10天的数据。我不确定它应该是 10 还是 1440。谁能帮我解决这个错误。
MWE 为
library(xts)
timevalues="20150101 0000/20150110 2359"
timesequence<- timeBasedSeq(timevalues)
min_data<-xts(rnorm(14400),timesequence)
ts_data<- ts(min_data,start=start(min_data), end = end(min_data),frequency=10)
更新
尽管我可以按照@Pascal 的建议使用 stl
函数绘制图形,但我仍然缺少图形 x 轴中的时间分量。任何帮助将不胜感激。
library(xts)
library(ggplot2)
library(reshape2)
set.seed(42)
timevalues = "20150101 0000/20150110 2359"
timesequence <- timeBasedSeq(timevalues)
min_data <- xts(rnorm(14400),timesequence)
ts_data <- ts(as.numeric(min_data), frequency = 1440)
out <- stl(ts_data, s.window = "per")
time.series <- as.data.frame(cbind(ts_data, out$time.series))
colnames(time.series) <- c("Data", "Seasonal", "Trend", "Remainder")
time.series$Date <- timesequence
time.series <- melt(time.series, 'Date')
ggplot(time.series, aes(x=Date, y=value)) +
geom_line() +
facet_free(variable~.)
一个仅限 xts 的解决方案,基于我在 .
中的想法
library(xts)
set.seed(42)
timevalues = "20150101 0000/20150110 2359"
timesequence <- timeBasedSeq(timevalues)
min_data <- xts(rnorm(14400),timesequence)
ts_data <- ts(as.numeric(min_data), frequency = 1440)
out <- stl(ts_data, s.window = "per")
ts_out <- merge(min_data, out$time.series)
plot.zoo(ts_out)
我想你要找的是以下内容:
xts2ts <- function(XD) {
maxRow <- nrow(XD)
startYM <- c(.indexyear(XD[1]) + 1900, .indexmon(XD[1]) + 1L)
endYM <- c(.indexyear(XD[maxRow]) + 1900, .indexmon(XD[maxRow]) + 1L)
ts(as.numeric(XD), start = startYM, end = endYM, frequency = 12L)
}
我最近发现了一个名为 "tsbox" 的软件包。
它承诺在时间序列类型之间轻松转换。
(这里有教程:https://cran.r-project.org/web/packages/tsbox/vignettes/tsbox.html)
在这种情况下可能会有用。
举个例子:
library(tsbox)
nowTS <-ts_ts(formerXTS)
或者反过来,如果你想将 ts 转换回 xts 系列
library(tsbox)
nowXTS <-ts_xts(nowTS)
如果你有每月、每季度和每年频率的 xts 数据,它可能会有用(使用包:xts、stats、data.table、zoo)
xts_ts <- function(xts_data) {
freq_list <-
data.table::data.table(
freq = c('month', 'quarter', 'year'),
freq_n = c(12L, 4L, 1L),
freq_format = c('%Y, %m', '%Y, %q', '%Y')
)
d_ferq <- xts::periodicity(xts_data)[["label"]]
freq_n <- freq_list[freq == d_ferq, freq_n]
freq_format <- freq_list[freq == d_ferq, freq_format]
# Put NA if missing date
empty <-
zoo::zoo(order.by = seq.Date(zoo::index(xts_data)[1], zoo::index(xts_data)[nrow(xts_data)], by = d_ferq))
no_misssing <- merge(xts_data, empty)
if (d_ferq == 'quarter') {
start_date <-
format(zoo::as.yearqtr(xts::periodicity(xts_data)[["start"]]), freq_format)
} else {
start_date <-
format(zoo::as.Date(xts::periodicity(xts_data)[["start"]]), freq_format)
}
stats::ts(zoo::coredata(no_misssing),
start = as.integer(strsplit(start_date, split = ',')[[1]]),
frequency = freq_n)
}
我有 xts
10 天数据的时间序列对象。数据以分钟频率采样。因此,对于每一天,我有 1440 个观察值。我需要将 xts
强制转换为 ts
对象,以便我可以使用 example 中使用的 stl
函数。但是,在强制转换时,R 会产生错误 as
ts(min_data,start=start(min_data),end = end(min_data),frequency=10)
Error in ts(min_data, start = start(min_data), end = end(min_data), frequency = 10) :
invalid time series parameters specified
我将频率设置为10,因为我使用的是10天的数据。我不确定它应该是 10 还是 1440。谁能帮我解决这个错误。
MWE 为
library(xts)
timevalues="20150101 0000/20150110 2359"
timesequence<- timeBasedSeq(timevalues)
min_data<-xts(rnorm(14400),timesequence)
ts_data<- ts(min_data,start=start(min_data), end = end(min_data),frequency=10)
更新
尽管我可以按照@Pascal 的建议使用 stl
函数绘制图形,但我仍然缺少图形 x 轴中的时间分量。任何帮助将不胜感激。
library(xts)
library(ggplot2)
library(reshape2)
set.seed(42)
timevalues = "20150101 0000/20150110 2359"
timesequence <- timeBasedSeq(timevalues)
min_data <- xts(rnorm(14400),timesequence)
ts_data <- ts(as.numeric(min_data), frequency = 1440)
out <- stl(ts_data, s.window = "per")
time.series <- as.data.frame(cbind(ts_data, out$time.series))
colnames(time.series) <- c("Data", "Seasonal", "Trend", "Remainder")
time.series$Date <- timesequence
time.series <- melt(time.series, 'Date')
ggplot(time.series, aes(x=Date, y=value)) +
geom_line() +
facet_free(variable~.)
一个仅限 xts 的解决方案,基于我在
library(xts)
set.seed(42)
timevalues = "20150101 0000/20150110 2359"
timesequence <- timeBasedSeq(timevalues)
min_data <- xts(rnorm(14400),timesequence)
ts_data <- ts(as.numeric(min_data), frequency = 1440)
out <- stl(ts_data, s.window = "per")
ts_out <- merge(min_data, out$time.series)
plot.zoo(ts_out)
我想你要找的是以下内容:
xts2ts <- function(XD) {
maxRow <- nrow(XD)
startYM <- c(.indexyear(XD[1]) + 1900, .indexmon(XD[1]) + 1L)
endYM <- c(.indexyear(XD[maxRow]) + 1900, .indexmon(XD[maxRow]) + 1L)
ts(as.numeric(XD), start = startYM, end = endYM, frequency = 12L)
}
我最近发现了一个名为 "tsbox" 的软件包。
它承诺在时间序列类型之间轻松转换。 (这里有教程:https://cran.r-project.org/web/packages/tsbox/vignettes/tsbox.html)
在这种情况下可能会有用。
举个例子:
library(tsbox)
nowTS <-ts_ts(formerXTS)
或者反过来,如果你想将 ts 转换回 xts 系列
library(tsbox)
nowXTS <-ts_xts(nowTS)
如果你有每月、每季度和每年频率的 xts 数据,它可能会有用(使用包:xts、stats、data.table、zoo)
xts_ts <- function(xts_data) {
freq_list <-
data.table::data.table(
freq = c('month', 'quarter', 'year'),
freq_n = c(12L, 4L, 1L),
freq_format = c('%Y, %m', '%Y, %q', '%Y')
)
d_ferq <- xts::periodicity(xts_data)[["label"]]
freq_n <- freq_list[freq == d_ferq, freq_n]
freq_format <- freq_list[freq == d_ferq, freq_format]
# Put NA if missing date
empty <-
zoo::zoo(order.by = seq.Date(zoo::index(xts_data)[1], zoo::index(xts_data)[nrow(xts_data)], by = d_ferq))
no_misssing <- merge(xts_data, empty)
if (d_ferq == 'quarter') {
start_date <-
format(zoo::as.yearqtr(xts::periodicity(xts_data)[["start"]]), freq_format)
} else {
start_date <-
format(zoo::as.Date(xts::periodicity(xts_data)[["start"]]), freq_format)
}
stats::ts(zoo::coredata(no_misssing),
start = as.integer(strsplit(start_date, split = ',')[[1]]),
frequency = freq_n)
}