将不规则时间序列转换为常规时间序列时遇到问题。下面是一个简化的例子:
require(zoo)
t <- as.character(c(1981,1984,1985))
d <- c(1,3,6)
dt <- data.frame(d,t)
t <- as.Date(t,"%Y")
z <- zoo(d,t)
plot(z)
ts.d <- as.ts(as.zooreg(z,freq=1)) # create a regular ts object
ts.d # regular time series
我想创建一个常规时间序列ts.d,看起来像这个c(1981,NA,NA,1984,1985)。
令人惊奇的是,我第一次运行它:它有效!但是当我想再次运行它或重复它(as.ts()行)它会停止工作并且我获得了很长的时间序列:
ts.d # regular time series
Time Series:
Start = 4299
End = 5760
Frequency = 1
[1] 1 NA NA NA NA NA NA NA NA NA NA NA NA NA
[15] NA NA NA NA NA NA NA NA
等
出了什么问题?
答案 0 :(得分:7)
正如已经指出的那样as.Date(as.character(t), "%Y")
是不正确的,因为它没有给出所需的月份和日期。如果我们想将年份转换为"Date"
课程,我们可以使用动物园as.Date(as.yearmon(t))
执行此操作as.yearmon
;然而,那么我们会有另外的问题,即不同的年份有不同的天数,所以没有办法定期使用日期来表示年份。
我们真的不想要日期。我们只想在多年的时间里工作,它简化为:
> z <- zoo(c(1, 3, 6), c(1981, 1984, 1985))
>
> as.ts(z)
Time Series:
Start = 1981
End = 1985
Frequency = 1
[1] 1 NA NA 3 6
或者如果我们想要安全,我们可以做到这一点,这将迫使它成为年度,即使输入偶然有一个较低的频率:frequency(z) <- 1; as.ts(z)
或只是定义原始的动物园系列有一个频率从一开始就是1:
> z <- zoo(c(1, 3, 6), c(1981, 1984, 1985), frequency = 1)
> as.ts(z)
Time Series:
Start = 1981
End = 1985
Frequency = 1
[1] 1 NA NA 3 6
通过此示例,它没有什么区别,但在这种情况下z <- zoo(c(1, 3, 6), c(1981, 1983, 1985), frequency = 1)
,需要使用显式frequency
来阻止其频率为0.5
。
答案 1 :(得分:3)
这不是一个错误。您的时间序列中有4年的1,461天。它在我第一次运行时对我不起作用。 as.Date(t,"%Y")
不知道用于创建日期的月/日,因此它使用今天的月/日。这不能用于可重复的分析。试试这个:
t <- c(1981,1984,1985)
d <- c(1,3,6)
z <- zoo(d,t)
z <- merge(z,zoo(,c(1981,1982,1983,1984,1985)))
ts.d <- as.ts(z)
哪个收益率:
> ts.d
Time Series:
Start = 1981
End = 1985
Frequency = 1
[1] 1 NA NA 3 6