【问题标题】:Create multiple lagged variables using a zoo object使用 zoo 对象创建多个滞后变量
【发布时间】:2019-06-27 17:21:30
【问题描述】:

我需要动态创建 'n' 个变量,原始变量的滞后从 1 到 'n'。像这样的东西:- 原始变量

DatePeriod, value
2/01/2018,6
3/01/2018,4
4/01/2018,0
5/01/2018,2
6/01/2018,4
7/01/2018,1
8/01/2018,6
9/01/2018,2
10/01/2018,7

Lagged 1 variable
2/01/2018,NA
3/01/2018,6
4/01/2018,4
5/01/2018,0
6/01/2018,2
7/01/2018,4
8/01/2018,1
9/01/2018,6
10/01/2018,2
11/01/2018,7

Lagged 2 variable
2/01/2018,NA
3/01/2018,NA
4/01/2018,6
5/01/2018,4
6/01/2018,0
7/01/2018,2
8/01/2018,4
9/01/2018,1
10/01/2018,6
11/01/2018,2
12/01/2018,7

Lagged 3 variable
2/01/2018,NA
3/01/2018,NA
4/01/2018,NA
5/01/2018,6
6/01/2018,4
7/01/2018,0
8/01/2018,2
9/01/2018,4
10/01/2018,1
11/01/2018,6
12/01/2018,2
13/01/2018,7

等等

我尝试使用 shift 功能和其他各种功能。其中大多数对我有用,滞后变量在原始变量的最后一个日期完成。也就是说,滞后变量的长度与原始变量的长度相同。

我正在寻找的新滞后变量将被“kth”滞后下移,数据系列将被“k”元素(包括索引)扩展。

我需要这个的原因是能够使用回归系数和样本内周期之外的相应滞后变量值来计算因变量的值

y1 <- Lag(ciresL1_usage_1601_1612, shift = 1)
head(y1)
2016-01-02 2016-01-03 2016-01-04 2016-01-05 2016-01-06 2016-01-07 
        NA  -5171.051  -6079.887  -3687.227  -3229.453  -2110.368 

y2 <- Lag(ciresL1_usage_1601_1612, shift = 2)
head(y2)
2016-01-02 2016-01-03 2016-01-04 2016-01-05 2016-01-06 2016-01-07 
        NA         NA  -5171.051  -6079.887  -3687.227  -3229.453 
tail(y2)
2016-12-26 2016-12-27 2016-12-28 2016-12-29 2016-12-30 2016-12-31 
 -2316.039  -2671.185  -4100.793  -2043.020  -1147.798   1111.674 

tail(ciresL1_usage_1601_1612)
2016-12-26 2016-12-27 2016-12-28 2016-12-29 2016-12-30 2016-12-31 
 -4100.793  -2043.020  -1147.798   1111.674   3498.729   2438.739 

有没有办法相对容易地做到这一点。我知道我可以通过循环并在新向量中添加“k”行并将数据重新加载到这个新向量中来适当地移动新向量中的数据值,但我不想使用该方法,除非我必须.我有信心一定有比这更好的方法!

顺便说一下,对象是一个以每日日期为索引的动物园对象。

最好的问候

迪帕克

【问题讨论】:

    标签: r


    【解决方案1】:

    将输入的 zoo 对象转换为 zooreg,然后像这样使用lag.zooreg

    library(zoo)
    
    # test input
    z <- zoo(1:10, as.Date("2008-01-01") + 0:9)
    
    zr <- as.zooreg(z)
    lag(zr, -(0:3))
    

    给予:

               lag0 lag-1 lag-2 lag-3
    2008-01-01    1    NA    NA    NA
    2008-01-02    2     1    NA    NA
    2008-01-03    3     2     1    NA
    2008-01-04    4     3     2     1
    2008-01-05    5     4     3     2
    2008-01-06    6     5     4     3
    2008-01-07    7     6     5     4
    2008-01-08    8     7     6     5
    2008-01-09    9     8     7     6
    2008-01-10   10     9     8     7
    2008-01-11   NA    10     9     8
    2008-01-12   NA    NA    10     9
    2008-01-13   NA    NA    NA    10
    

    【讨论】:

    • 为什么我会收到这个错误 n 必须是一个非负整数标量,而不是长度为 4 的整数。
    • 您可能加载了冲突的包。重新启动一个新的 R 会话(确保 .Rdata 未加载)并在答案中输入代码。
    • HI
    • 嗨 >- 我发现此代码“lag(as.zooreg(ciresL1_usage_1610_1703), -(0:7))”不适用于“tidyverse”或“dplyr”。将这两个分开,它就可以工作。我的理解是上述两个包都使数据操作变得更好更快,那么为什么这不适用于更好的包呢? “分离它们,运行上述命令,然后重新附加它们”是唯一的解决方法还是有更好的解决方案?
    • tidyverse 包不能很好地与其他包一起使用。例如,他们以与基础 R 冲突的方式重新定义延迟和过滤,而 zoo 尊重 R 的工作方式。同样,它们通常更快也不是真的,当然,它们可能在某些情况下更快。在某些情况下,它们的速度要慢得多。要解决任何冲突,请更改库语句的顺序或使用显式限定,例如dplyr::mutate 这样就不需要 library(dplyr)。你仍然可以使用library(magrittr) 获取管道,因为据我所知它并不冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多