我正在使用 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
非常感謝任何幫助。
真誠的,并提前非常感謝
托馬斯飛利浦
uj5u.com熱心網友回復:
嘗試使用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
uj5u.com熱心網友回復:
使用 dplyr 的 lag 函式應該會得到您正在尋找的結果。默認情況下,我懷疑這是 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)
uj5u.com熱心網友回復:
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
uj5u.com熱心網友回復:
計算 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/521647.html
標籤:r数据框落后
上一篇:更改R中可反應表中的搜索欄文本
下一篇:通過向量串列R的名稱創建組變數
