【问题标题】:R ts with missing values缺失值的 R ts
【发布时间】:2014-12-08 22:30:07
【问题描述】:

我有一个从 csv 文件中读取的数据框,其中包含每日观察结果:

Date        Value 
2010-01-04  23.4
2010-01-05  12.7
2010-01-04  20.1
2010-01-07  18.2

问题:缺少数据。 预测包需要一个不包含任何缺失数据的普通 ts 对象,而我的数据集在大多数周末和其他随机点都有缺失数据。

转换为ts 应该不起作用

ts(values, start = c(1997, 1), frequency = 1)

我能想到的唯一解决方案是将每日数据转换为每周数据,但 R 是新事物,可能存在其他更好的解决方案。

【问题讨论】:

  • 这确实是一个统计问题(如何处理时间序列中的缺失值),您还没有提供足够的信息(缺失值与当前值的比率以及缺失的运行长度)。投票迁移到 CrossValidated.com,这样您就可以在返回一个完整的编码问题之前进行一些自己的搜索。
  • 预测包中的许多函数都允许缺失值。
  • @BondedDust 更像是如何使用 R 执行所需的程序来处理丢失的数据

标签: r time-series


【解决方案1】:

一种选择是扩展您的日期索引以包含缺失的观察值,并使用zoo 中的na.approx 通过插值填充缺失值。

allDates <- seq.Date(
  min(values$Date),
  max(values$Date),
  "day")
##
allValues <- merge(
  x=data.frame(Date=allDates),
  y=values,
  all.x=TRUE)
R> head(allValues,7)
        Date      Value
1 2010-01-05 -0.6041787
2 2010-01-06  0.2274668
3 2010-01-07 -1.2751761
4 2010-01-08 -0.8696818
5 2010-01-09         NA
6 2010-01-10         NA
7 2010-01-11 -0.3486378
##
zooValues <- zoo(allValues$Value,allValues$Date)
R> head(zooValues,7)
2010-01-05 2010-01-06 2010-01-07 2010-01-08 2010-01-09 2010-01-10 2010-01-11 
-0.6041787  0.2274668 -1.2751761 -0.8696818         NA         NA -0.3486378 
##
approxValues <- na.approx(zooValues)
R> head(approxValues,7)
2010-01-05 2010-01-06 2010-01-07 2010-01-08 2010-01-09 2010-01-10 2010-01-11 
-0.6041787  0.2274668 -1.2751761 -0.8696818 -0.6960005 -0.5223192 -0.3486378

即使有缺失值,zooValues 仍然是合法的 zoo 对象,例如plot(zooValues) 可以工作(在缺失值处存在不连续性),但如果您计划对数据拟合某种模型,则最好使用 na.approx 替换缺失值。

数据:

library(zoo)
library(lubridate)
##
t0 <- "2010-01-04"
Dates <- as.Date(ymd(t0))+1:120
weekDays <- Dates[!(weekdays(Dates) %in% c("Saturday","Sunday"))]
##
set.seed(123)
values <- data.frame(Date=weekDays,Value=rnorm(length(weekDays)))

【讨论】:

  • 谢谢,我会听从你的指示
【解决方案2】:

您可以使用 imputeTSzooforecast 包,它们都提供了填充缺失数据的方法。 (填补缺失空白的过程也称为插补)

imputeTS

na_interpolation(yourData)
na_seadec(yourdata)
na_kalman(yourdata)
na_ma(yourdata)

动物园

na.approx(yourdata)
na.locf(yourdata)
na.StructTS(yourdata)

预测

na.interp(yourdata)

这些是您可以使用的软件包中的一些功能。

【讨论】:

    【解决方案3】:

    您可能需要汇总,是的 - 重要的是要明智地这样做。如果你只是简单地聚合到周级别,使用类似lubridate 的东西将时间戳映射到周,你肯定会得到 Forecast 可以消耗的东西 - 但它会是具有欺骗性数据的东西,因为有些周的计数会更小因为他们错过了几天。这使得数据集对于预测建模的用处不大,因为您没有给它一个实际发生的模型。

    我的建议是查看 zoo 时间序列包来处理这个问题;它有很多函数可以根据它提供的其他数据计算出缺失/NA 条目的可能值。安装并运行:

    library(zoo)
    ls(pattern = "^na", "package:zoo")
    

    要获取您可能会发现特别相关的功能列表。

    【讨论】:

    【解决方案4】:

    另一种解决方案形式{padr}:

    显式区间

    require(padr)
    require(magrittr)
    df <- data.frame(day = as.Date(c('2016-04-01', '2016-04-03')), y = c(3,4))
    pad(df, interval = "day") %>% fill_by_value(y)
    #>          day y
    #> 1 2016-04-01 3
    #> 2 2016-04-02 0
    #> 3 2016-04-03 4
    

    推断区间

    df <- data.frame(day = as.Date(c('2016-04-01', '2016-04-02', '2016-04-04')), y = c(3,4,6))
    pad(df) %>% fill_by_value(y)
    #> pad applied on the interval: day
    #>          day y
    #> 1 2016-04-01 3
    #> 2 2016-04-02 4
    #> 3 2016-04-03 0
    #> 4 2016-04-04 6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多