【问题标题】:Lag time series with new rows具有新行的滞后时间序列
【发布时间】:2018-04-04 12:20:02
【问题描述】:

我想领先/落后变量,但我不想丢分。

例如: x(xts 对象):

2017-06-30  1    
2017-07-31  2
2017-08-31  3
2017-09-30  4
2017-10-31  5
2017-11-30  6
2017-12-31  7
2018-01-31  8
2018-02-28  9
2018-03-31  10

当我这样做时

lag(x,2)

我明白了:

2017-06-30  NA
2017-07-31  NA
2017-08-31  1
2017-09-30  2
2017-10-31  3
2017-11-30  4
2017-12-31  5
2018-01-31  6
2018-02-28  7
2018-03-31  8

我在 2018 年 4 月 30 日输了 9 场,在 2018 年 5 月 31 日输了 10 场。有没有办法保留它们?我知道查找其他日期(2018-04-30 和 2018-05-31)是个问题,但也许有办法自动完成。

【问题讨论】:

  • 但这违背了滞后的定义,不是吗?您希望这些 na 值改为什么?
  • 不,因为我使用滞后变量,所以我可以将它用于预测。因此,在这种情况下,我可以使用取决于 x 的模型进行提前两个月的预测。

标签: r xts lag


【解决方案1】:

有点冗长,但这确实有效。这需要dplyrmagrittr

# Original data frame
df <- data.frame(date = seq(as.Date("2017-07-01"), length=10, by="1 month") - 1, n = 1:10)

#          date  n
# 1  2017-06-30  1
# 2  2017-07-31  2
# 3  2017-08-31  3
# 4  2017-09-30  4
# 5  2017-10-31  5
# 6  2017-11-30  6
# 7  2017-12-31  7
# 8  2018-01-31  8
# 9  2018-02-28  9
# 10 2018-03-31 10

接下来,我定义滞后长度:

# Length of lag
lag_length <- 2

在这里,我创建要添加的额外行:

# Extra rows to add
extra <- data.frame(date = (seq(tail(df$date, 1) + 1, length = lag_length + 1, by = "1 month") - 1)[-1], n = NA)

最后,我将它们绑定到原始数​​据框并滞后变量n

# Bind extra rows and lag 'n' by 'lag_length'
df %<>%
  bind_rows(extra) %>% 
  mutate(n = lag(n, lag_length))

# New data frame
#          date  n
# 1  2017-06-30 NA
# 2  2017-07-31 NA
# 3  2017-08-31  1
# 4  2017-09-30  2
# 5  2017-10-31  3
# 6  2017-11-30  4
# 7  2017-12-31  5
# 8  2018-01-31  6
# 9  2018-02-28  7
# 10 2018-03-31  8
# 11 2018-04-30  9
# 12 2018-05-31 10

【讨论】:

    【解决方案2】:

    我假设您想用NAs 填充您的值,而您之前的值会扩展到新的日期,而这些日期又是接下来几个月的最后几天。

    如果是这样,这个使用lubridate的函数就是这样做的:

    dpad <- function(x,n){
      require(lubridate)
    
      d <- as.character(ymd(x[nrow(x),1]) + 1  + months(1:n) -1)
    
      return(cbind(c(x[,1],d),c(rep(NA,n),x[,2])))
    
    }
    

    在这种情况下,x 应为 2 列对象,具有第一列日期和第二列值。 n 指定追加到开头的NA 的数量:

    dpad(x, 2)
    
    # [,1]            [,2]
    # [1,] "2017-06-30" NA  
    # [2,] "2017-07-31" NA  
    # [3,] "2017-08-31" "1" 
    # [4,] "2017-09-30" "2" 
    # [5,] "2017-10-31" "3" 
    # [6,] "2017-11-30" "4" 
    # [7,] "2017-12-31" "5" 
    # [8,] "2018-01-31" "6" 
    # [9,] "2018-02-28" "7" 
    # [10,] "2018-03-31" "8" 
    # [11,] "2018-04-30" "9" 
    # [12,] "2018-05-31" "10"
    

    【讨论】:

    • 你现在有自动扩展日期序列的方法吗?这是一个月的最后一天,但我想让它更通用。
    • @mbt 我猜你需要一些条件......要么总是最后一天,要么是最后两个日期之间的差异,或者你将其指定为参数。它在你的数据中如何?编辑:或者你只是使用年月
    • 现在总是最后一天,但正如我所写的,如果它适用于所有情况会很好。
    • @mbt 正如我所说,您只能使用年月组合,这样可以概括它。但是当你谈到其他情况时,你能举个例子吗?
    • 仅使用年月组合会导致丢失有关日期的信息。在其他情况下,我的意思是例如每月的第一天或每月的第 15 天。我想知道 R 中是否有一个函数可以按顺序识别模式并可以继续它,就像在 Excel 中一样。
    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 2021-07-06
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多