使用 tempdisagg 在 R 中的面板数据中进行低频到高频转换
Low to high frequency conversion in panel data in R using tempdisagg
我有包含四个变量的每日面板数据:日期、cusip(id 标识符)、PD(违约概率)和价格。 PD 仅在一月、四月、七月和十月的第一天按季度提供。我想使用 tempdisagg
包中的 Chow-Lin 频率转换为 PD 生成每日数据。我知道如何在时间序列上应用 td()
函数,但我没有找到面板数据框的示例。这是我的代码和样本数据,使用 devtools
包中的 reproduce()
,因此只包含几个样本日而不是整个季度。 运行 td()
报错:
Error in td(PD ~ price, conversion = "first", method = "chow-lin-fixed", fixed.rho
= 0.5) : In numeric mode, 'to' must be an integer number.
我知道价格和PD都是mydata
的高频日指标,所以我想我需要在PD
或类似的东西上使用to.quarterly()
函数。
library(dplyr)
library(zoo)
library(tempdisagg)
library(tsbox)
mydata <- structure(list(date = structure(c(13516, 13516, 13517, 13517,13518, 13518, 13521, 13605, 13605, 13606), class = "Date"), cusip = c("31677310","66585910", "31677310", "66585910", "31677310", "66585910", "31677310","66585910", "31677310", "66585910"), PD = c(0.076891, 0.096,NA, NA, NA, NA, NA, 0.094341, 0.08867, NA), price = c(40.98, 61.31,40.99, 60.77, 40.18, 59.97, 39.92, 59.96, 38.6, 60.69)), row.names = c(6L,13L, 36L, 43L, 66L, 73L, 96L, 1843L, 1866L, 1873L), class = "data.frame")
mydata <- mydata%>%
group_by(cusip) %>%
arrange(cusip,date) %>%
mutate(PDdaily = td(PD ~ price, conversion = "first",method = "chow-lin-fixed", fixed.rho = 0.5))
你的例子还不够。对于每个分解,我们至少需要 3 个低频值才能执行回归。
这是一个替代示例,具有 3 对低频和高频系列:
library(tidyverse)
library(tempdisagg)
library(tsbox)
mydata <- ts_c(
low_freq = ts_frequency(fdeaths, "year"),
high_freq = mdeaths
) %>%
ts_tbl() %>%
ts_wide() %>%
crossing(id = 1:3) %>%
arrange(id)
对数据框中的数据多次应用 td
会很麻烦。
将数据提取到两个列表中更容易,一个是低频序列,一个是高频序列:
list_lf <- group_split(ts_na_omit(select(mydata, time, value = low_freq, id)), id, keep = FALSE)
list_hf <- group_split(select(mydata, time, value = high_freq, id), id, keep = FALSE)
现在您可以使用 Map()
或 map2()
将函数应用于每对元素:
ans <- map2(list_lf, list_hf, ~ predict(td(.x ~ .y)))
将分类数据转换回数据框:
bind_rows(ans, .id = "id")
#> # A tibble: 216 x 3
#> id time value
#> <chr> <date> <dbl>
#> 1 1 1974-01-01 59.2
#> 2 1 1974-02-01 54.2
#> 3 1 1974-03-01 54.4
#> 4 1 1974-04-01 54.4
#> 5 1 1974-05-01 47.3
#> 6 1 1974-06-01 42.8
#> 7 1 1974-07-01 43.3
#> 8 1 1974-08-01 40.6
#> 9 1 1974-09-01 42.0
#> 10 1 1974-10-01 47.3
#> # … with 206 more rows
由 reprex package (v0.3.0)
于 2020-06-03 创建
我有包含四个变量的每日面板数据:日期、cusip(id 标识符)、PD(违约概率)和价格。 PD 仅在一月、四月、七月和十月的第一天按季度提供。我想使用 tempdisagg
包中的 Chow-Lin 频率转换为 PD 生成每日数据。我知道如何在时间序列上应用 td()
函数,但我没有找到面板数据框的示例。这是我的代码和样本数据,使用 devtools
包中的 reproduce()
,因此只包含几个样本日而不是整个季度。 运行 td()
报错:
Error in td(PD ~ price, conversion = "first", method = "chow-lin-fixed", fixed.rho = 0.5) : In numeric mode, 'to' must be an integer number.
我知道价格和PD都是mydata
的高频日指标,所以我想我需要在PD
或类似的东西上使用to.quarterly()
函数。
library(dplyr)
library(zoo)
library(tempdisagg)
library(tsbox)
mydata <- structure(list(date = structure(c(13516, 13516, 13517, 13517,13518, 13518, 13521, 13605, 13605, 13606), class = "Date"), cusip = c("31677310","66585910", "31677310", "66585910", "31677310", "66585910", "31677310","66585910", "31677310", "66585910"), PD = c(0.076891, 0.096,NA, NA, NA, NA, NA, 0.094341, 0.08867, NA), price = c(40.98, 61.31,40.99, 60.77, 40.18, 59.97, 39.92, 59.96, 38.6, 60.69)), row.names = c(6L,13L, 36L, 43L, 66L, 73L, 96L, 1843L, 1866L, 1873L), class = "data.frame")
mydata <- mydata%>%
group_by(cusip) %>%
arrange(cusip,date) %>%
mutate(PDdaily = td(PD ~ price, conversion = "first",method = "chow-lin-fixed", fixed.rho = 0.5))
你的例子还不够。对于每个分解,我们至少需要 3 个低频值才能执行回归。 这是一个替代示例,具有 3 对低频和高频系列:
library(tidyverse)
library(tempdisagg)
library(tsbox)
mydata <- ts_c(
low_freq = ts_frequency(fdeaths, "year"),
high_freq = mdeaths
) %>%
ts_tbl() %>%
ts_wide() %>%
crossing(id = 1:3) %>%
arrange(id)
对数据框中的数据多次应用 td
会很麻烦。
将数据提取到两个列表中更容易,一个是低频序列,一个是高频序列:
list_lf <- group_split(ts_na_omit(select(mydata, time, value = low_freq, id)), id, keep = FALSE)
list_hf <- group_split(select(mydata, time, value = high_freq, id), id, keep = FALSE)
现在您可以使用 Map()
或 map2()
将函数应用于每对元素:
ans <- map2(list_lf, list_hf, ~ predict(td(.x ~ .y)))
将分类数据转换回数据框:
bind_rows(ans, .id = "id")
#> # A tibble: 216 x 3
#> id time value
#> <chr> <date> <dbl>
#> 1 1 1974-01-01 59.2
#> 2 1 1974-02-01 54.2
#> 3 1 1974-03-01 54.4
#> 4 1 1974-04-01 54.4
#> 5 1 1974-05-01 47.3
#> 6 1 1974-06-01 42.8
#> 7 1 1974-07-01 43.3
#> 8 1 1974-08-01 40.6
#> 9 1 1974-09-01 42.0
#> 10 1 1974-10-01 47.3
#> # … with 206 more rows
由 reprex package (v0.3.0)
于 2020-06-03 创建