我正在使用 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
尝试使用
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
使用 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)
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
计算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