滞后在 R 数据帧上无法正常工作

问题描述 投票:0回答:4

我正在使用 Base R 4.2.1,并且有一个奇怪的问题,即滞后于列。

我的数据框有两列,一列表示时间,另一列表示债券收益率

df_bond <- data. Frame(t  = seq(0, 10, 1),
                      y_t = seq(.1, 0, -.01)
                     )
> df_bond
    t  y_t
1   0 0.10
2   1 0.09
3   2 0.08
4   3 0.07
5   4 0.06
6   5 0.05
7   6 0.04
8   7 0.03
9   8 0.02
10  9 0.01
11 10 0.00

然后我添加一列价格,它就像一个魅力:

> df_bond$p_t <- 100 / (1 + df_bond$y_t)^(10 - df_bond$t)
> df_bond
    t  y_t       p_t
1   0 0.10  38.55433
2   1 0.09  46.04278
3   2 0.08  54.02689
4   3 0.07  62.27497
5   4 0.06  70.49605
6   5 0.05  78.35262
7   6 0.04  85.48042
8   7 0.03  91.51417
9   8 0.02  96.11688
10  9 0.01  99.00990
11 10 0.00 100.00000

但是如果我现在添加一列用于返回,我会得到一些奇怪的东西:

> df_bond$r_prior_yr <- df_bond$p_t / lag(df_bond$p_t, 1)
> df_bond
    t  y_t       p_t r_prior_yr
1   0 0.10  38.55433          1
2   1 0.09  46.04278          1
3   2 0.08  54.02689          1
4   3 0.07  62.27497          1
5   4 0.06  70.49605          1
6   5 0.05  78.35262          1
7   6 0.04  85.48042          1
8   7 0.03  91.51417          1
9   8 0.02  96.11688          1
10  9 0.01  99.00990          1
11 10 0.00 100.00000          1

在没有赋值的情况下进行除法表明它正在选取时间序列属性,但我无法解释为什么比率始终为 1。

> df_bond$p_t / lag(df_bond$p_t, 1)
 [1] 1 1 1 1 1 1 1 1 1 1 1
attr(,"tsp")
[1]  0 10  1
r dataframe lag
4个回答
3
投票

尝试使用

dplyr::lag

df_bond <- data.frame(t  = seq(0, 10, 1),
                       y_t = seq(.1, 0, -.01)
)
df_bond$p_t <- 100 / (1 + df_bond$y_t)^(10 - df_bond$t)
df_bond$r_prior_yr <- df_bond$p_t / dplyr::lag(df_bond$p_t, 1)
df_bond
#>     t  y_t       p_t r_prior_yr
#> 1   0 0.10  38.55433         NA
#> 2   1 0.09  46.04278   1.194231
#> 3   2 0.08  54.02689   1.173406
#> 4   3 0.07  62.27497   1.152666
#> 5   4 0.06  70.49605   1.132013
#> 6   5 0.05  78.35262   1.111447
#> 7   6 0.04  85.48042   1.090971
#> 8   7 0.03  91.51417   1.070586
#> 9   8 0.02  96.11688   1.050295
#> 10  9 0.01  99.00990   1.030099
#> 11 10 0.00 100.00000   1.010000

1
投票

使用 dplyr 中的滞后函数应该会得到您正在寻找的结果。默认情况下,我怀疑这是 stats::lag 导致您的问题。

   df_bond <- data.frame(t  = seq(0, 10, 1),
                           y_t = seq(.1, 0, -.01))
    df_bond$p_t <- 100 / (1 + df_bond$y_t)^(10 - df_bond$t)
    df_bond$r_prior_yr <- df_bond$p_t / dplyr::lag(df_bond$p_t, 1)

1
投票

stats::lag
必须在时间序列中使用才能给出预期结果。因此,修改您的代码如下: 这个不需要
dplyr

注意:

dplyr::lag
掩盖了基本
stats::lag
函数,因此,如果您要使用此解决方案,并加载 dplyr,则必须使用完全限定的
stats::lag
而不是
lag

df_bond <- data.frame(t = ts(seq(0, 10, 1)),
                      y_t = ts(seq(.1, 0, -.01)))

df_bond$p_t <- 100 / (1 + df_bond$y_t)^(10 - df_bond$t)

df_bond[2:nrow(df_bond),"r_prior_yr"] <- df_bond$p_t / lag(df_bond$p_t, 1)

df_bond
#>     t  y_t       p_t r_prior_yr
#> 1   0 0.10  38.55433         NA
#> 2   1 0.09  46.04278  0.8373589
#> 3   2 0.08  54.02689  0.8522197
#> 4   3 0.07  62.27497  0.8675538
#> 5   4 0.06  70.49605  0.8833824
#> 6   5 0.05  78.35262  0.8997281
#> 7   6 0.04  85.48042  0.9166148
#> 8   7 0.03  91.51417  0.9340676
#> 9   8 0.02  96.11688  0.9521134
#> 10  9 0.01  99.00990  0.9707805
#> 11 10 0.00 100.00000  0.9900990

1
投票

计算p_t,转换为zoo,使用zoo的diff和arith = FALSE来获取比率并转换回来。如果动物园对象没问题,那么最后一行可以省略。

library(zoo)

df_bond |>
  transform(p_t = 100 / (1 + y_t)^(10 - t)) |>
  read.zoo() |>
  transform(r_prior_year = diff(p_t, arith = FALSE, na.pad = TRUE)) |>
  fortify.zoo(name = "t")

给予:

    t  y_t       p_t r_prior_year
1   0 0.10  38.55433           NA
2   1 0.09  46.04278     1.194231
3   2 0.08  54.02689     1.173406
4   3 0.07  62.27497     1.152666
5   4 0.06  70.49605     1.132013
6   5 0.05  78.35262     1.111447
7   6 0.04  85.48042     1.090971
8   7 0.03  91.51417     1.070586
9   8 0.02  96.11688     1.050295
10  9 0.01  99.00990     1.030099
11 10 0.00 100.00000     1.010000
© www.soinside.com 2019 - 2024. All rights reserved.