0

我正在做一些周期性分析。

我有变量 X,如果处于收缩状态则为真,否则为假

X
##[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

……

我把它变成了 0 和 1

X2<-as.ts(X*1)

然后我有一个日期序列。

td
## [1] "2000-01-31" "2000-02-29" "2000-03-31" "2000-04-30" "2000-05-31" "2000-06-30"

……

然后我使用 'zoo' 以X2td 顺序索引。

library(zoo)
na_ts = zoo(x=X2, order.by=td) 

现在是我的问题。我想确定值更改的日期,并计算该系列保持为 1 和 0 的时间。

所以想要的结果:

start      end          type       duration
2000-01-31 - 2001-05-31 contraction 17 months
2001-06-30 - 2004-05-31  expansion .... 

有人会帮我吗?提前谢谢了。

4

2 回答 2

1

您可以使用运行长度编码X将时间序列拆分为具有相同值的连续元素:

# Reproducible example
X <- c(F, F, F, T, T, F)
td <- c( "2000-01-31", "2000-02-29", "2000-03-31", "2000-04-30", "2000-05-31", "2000-06-30")
library(zoo)
na_ts = zoo(x=X, order.by=td)

# Split with run-length encoding
runlens <- rle(X)
(ts.spl <- split(na_ts, rep(seq_along(runlens$lengths), times=runlens$lengths)))
# $`1`
# 2000-01-31 2000-02-29 2000-03-31 
#      FALSE      FALSE      FALSE 
# 
# $`2`
# 2000-04-30 2000-05-31 
#       TRUE       TRUE 
# 
# $`3`
# 2000-06-30 
#      FALSE 

现在您可以从列表中存储的每个时间序列中提取您想要的任何信息ts.spl。例如:

dat <- data.frame(start = sapply(ts.spl, start),
                  end = sapply(ts.spl, end),
                  val = ifelse(runlens$values, "contraction", "expansion"))
dat$days <- as.numeric(as.Date(dat$end) - as.Date(dat$start), units="days")
dat
#        start        end         val days
# 1 2000-01-31 2000-03-31   expansion   60
# 2 2000-04-30 2000-05-31 contraction   31
# 3 2000-06-30 2000-06-30   expansion    0

这种方法是 split-apply-combine 的一个例子,我们根据数据的某些属性拆分原始数据,应用一个函数来提取每个片段的感兴趣信息,然后将它们组合在一起。

于 2015-02-12T18:25:31.500 回答
0

这是我稍作修改后的代码。谢谢乔西伯!我们通常在周期性分析中处理月度数据,因为按天计算是不准确的。此外,经济可能处于衰退/扩张状态,因此不会出现零。

na_ts = zoo(x=X, order.by=td)

# Split with run-length encoding

runlens <- rle(X)
(ts.spl <- split(na_ts, rep(seq_along(runlens$lengths), times=runlens$lengths)))

dat <- data.frame(start = sapply(ts.spl, start),
                  end = sapply(ts.spl, end),
                  val = ifelse(runlens$values, "contraction", "expansion"))
dat$months<- runlens$lengths
dat
于 2015-02-12T22:10:08.657 回答