【问题标题】:na.approx and na.locf not behaving properlyna.approx 和 na.locf 行为不正常
【发布时间】:2021-09-16 01:14:21
【问题描述】:

我正在尝试计算不同国家/地区时间序列的估算值。这段代码之前运行良好,但现在估算的值都错了......我无法弄清楚问题所在,我已经尝试了所有我能想到的。

我们的规则是:

  • 时间序列末尾缺失的值将被赋予该序列中最后一个已知值。
  • 时间序列开头缺失的值将被赋予该序列中的第一个已知值。
  • 如果时间序列中间缺少值,则使用线性外推法。
# load library for imputation
library(zoo)

# expand table to show NAs
output_table_imp = expand(output_table, transport_mode, year, country_code)
output_table_imp = full_join(output_table_imp, output_table)

# add imputated values
output_table_imp <- output_table_imp %>%
  group_by(transport_mode, country_code) %>%
  mutate(fatalities_imp= na.approx(fatalities,na.rm=FALSE)) %>%   # linear interpolation
  mutate(fatalities_imp= na.locf.default(fatalities_imp,na.rm=FALSE)) %>% # missing values at the end of a time series (copy last non-NA value)
  mutate(fatalities_imp= na.locf(fatalities_imp,fromLast=TRUE, na.rm=FALSE)) %>% # missing values at the start of a time series (copy first non-NA value)

我的数据框由几列组成:transport_mode、country_code、year、fatities。我不确定如何在这里分享我的数据?这是一张包含 3600 个观测值的大表……

这些是原始数字:

这些是估算值。您可以立即看到 CY、IE 和 LT 存在问题。

数据框如下所示:

【问题讨论】:

    标签: imputation na.approx


    【解决方案1】:

    您的代码看起来有点过于复杂。不知道动物园的详细信息 - 但很确定你也可以让它工作。

    使用 imputeTS 包,您可以获取整个 data. frame(它假定每列是一个单独的时间序列),并且该包对每个系列执行插补。 (不幸的是你的代码没有数据,但我想这将是你的 output_table_imp data.frame 扩展后)

    就像这样:

    library("imputeTS")
    na_interpolation(output_table_imp, option = "linear")
    

    我们也不必在开始和结束时对 NA 处理进行更改,因为您的要求是 na_interpolation 函数中的默认值。

    这些是您的要求:

    • 时间序列末尾缺少的值将被赋予该序列中最后一个已知值。

    • 时间序列开头缺失的值将被赋予该序列中的第一个已知值。

    这里是一个玩具示例:

    # Test time series with NAs at start, middle, end
    test <- c(NA,NA,1,2,3,NA,NA,6,7,8,NA,NA)
    
    # Perform linear interpolation
    na_interpolation(test, option = "linear")
    
    #Results
    > 1 1 1 2 3 4 5 6 7 8 8 8
    

    所以看,这工作得很好。

    也可以完美地与 data.frame 配合使用(如前所述,一列被解释为时间序列):

    # Create three time series and combine them into 1 data.frame
    ts1 <- c(NA,NA,1,2,3,NA,NA,6,7,8,NA,NA)
    ts2 <- c(NA,1,1,2,3,NA,3,6,7,8,NA,NA)
    ts3 <- c(NA,3,1,2,3,NA,3,6,7,8,NA,NA)
    df <- data.frame(ts1,ts2,ts3)
    
    na_interpolation(df, option = "linear")
    

    【讨论】:

    • 感谢您的建议。我添加了一张图片来显示数据框的样子。它的形状不像一个实际的时间序列......但我想我可以使用 imputeTS 包,我会在本周晚些时候试一试
    猜你喜欢
    • 2019-02-23
    • 2017-05-19
    • 2021-02-22
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多