【问题标题】:frequency of a time series with NA (R software)NA 时间序列的频率(R 软件)
【发布时间】:2021-05-12 21:09:44
【问题描述】:

我想在 R 中使用时间序列,但我一开始就卡住了,因为我的频率有问题。我有 30 年的月度数据(开始日期 = 1988,结束日期 = 2018),但有时会有漏洞:我有几个月或几年没有数据。 我宁愿不进行插值或调解以填补漏洞,而只是使用 na.omit 省略空的月份/年份。问题是我将有一些年份有 12 个月,而另一些则有更少的月份。 我的问题是..我现在如何确定和使用我的频率?

这里是两年的例子:

YEAR    MONTH   Temp    Salt
1988    1   NA  NA
1988    2   NA  NA
1988    3   NA  NA
1988    4   NA  NA
1988    5   NA  NA
1988    6   NA  NA
1988    7   16.45388889 37.4064537
1988    8   17.48898148 37.89002778
1988    9   NA  NA
1988    10  NA  NA
1988    11  15.8050463  38.08833333
1988    12  NA  NA
1989    1   NA  NA
1989    2   10.74912037 38.2787037
1989    3   NA  NA
1989    4   NA  NA
1989    5   NA  NA
1989    6   14.52092593 37.71060185
1989    7   16.84342593 37.32300926
1989    8   17.97930556 37.82277778
1989    9   NA  NA
1989    10  NA  NA
1989    11  16.23837963 38.00009259
1989    12  13.6325463  37.97509259

任何建议都会很有用!
非常感谢!

【问题讨论】:

  • 欢迎使用 stackoverflow。为了获得适当的支持,您应该提供一个最小的可重现示例:stackoverflow.com/help/minimal-reproducible-example>

标签: r time-series frequency na


【解决方案1】:

zoo 包中的 zooreg 类适用于这种类型的情况,即您具有基本规律但某些值可能不存在。

假设最后在 Note 中输入,这将产生一个频率为 12 的 zooreg 序列。这是一个频率为 12 但没有所有值的时间序列。将 text = Lines 替换为您的文件名,例如“myfile.dat”从文件中读取。请注意,yearmon 类将时间存储为一年加上 0 表示一月,1/12 表示二月,2/12 表示三月,等等。

library(zoo)

to_ym <- function(y, m) as.yearmon(paste(y, m, sep = "-"))

z <- read.zoo(text = Lines, header = TRUE, index = 1:2, FUN = to_ym, regular = TRUE)
z <- na.omit(z)
frequency(z)
## [1] 12

这个问题不清楚你到底有什么(一个文件?一个数据框?)但是如果你有一个 data.frame DF 从中读取它。 to_ym 来自上方。

DF <- read.table(text = Lines, header = TRUE)
z <- read.zoo(DF, index = 1:2, FUN = to_ym, regular = TRUE)
z <- na.omit(z)

要恢复 NA,只需将其转换为 ts 系列:

z_na <- as.zooreg(as.ts(z))

此外,如果您决定填写 NA,则可以使用几个例程,包括 na.spline、na.approx、na.StructTS(卡尔曼滤波器)和 na.locf。

我们现在可以像这样使用 z:

as.integer(time(z)) # year
cycle(time(z)) # month (1 = Jan, 2 = Feb, ...)
start(z) # starting time of series
end(z) # ending time of series

plot(z)

plot(scale(z), screen = 1, col = 1:2)
legend("bottomleft", leg = names(z), col = 1:2, lty = 1)

library(ggplot2)

autoplot(z)
autoplot(z) + facet_free()
autoplot(z, facet = NULL)
autoplot(scale(z), facet = NULL)

注意

Lines <- "
YEAR    MONTH   Temp    Salt
1988    1   NA  NA
1988    2   NA  NA
1988    3   NA  NA
1988    4   NA  NA
1988    5   NA  NA
1988    6   NA  NA
1988    7   16.45388889 37.4064537
1988    8   17.48898148 37.89002778
1988    9   NA  NA
1988    10  NA  NA
1988    11  15.8050463  38.08833333
1988    12  NA  NA
1989    1   NA  NA
1989    2   10.74912037 38.2787037
1989    3   NA  NA
1989    4   NA  NA
1989    5   NA  NA
1989    6   14.52092593 37.71060185
1989    7   16.84342593 37.32300926
1989    8   17.97930556 37.82277778
1989    9   NA  NA
1989    10  NA  NA
1989    11  16.23837963 38.00009259
1989    12  13.6325463  37.97509259"

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 2018-06-24
    • 2018-08-05
    • 2013-11-13
    • 2021-04-02
    • 2021-04-02
    • 1970-01-01
    • 2014-11-28
    • 2017-07-05
    相关资源
    最近更新 更多