Преобразование низких частот в высокие в панельных данных в R с использованием tempdisagg - PullRequest
0 голосов
/ 28 мая 2020

У меня есть ежедневные панельные данные с четырьмя переменными: дата, cusip (идентификатор идентификатора), PD (вероятность дефолта) и цена. PD доступен только ежеквартально в первый день января, апреля, июля и октября. Я хочу сгенерировать ежедневные данные для частичного разряда, используя преобразование частоты Chow-Lin из пакета tempdisagg. Я знаю, как применить функцию td() к временным рядам, но я не нашел примеров с фреймами данных панели. Вот мой код и образцы данных с использованием reproduce() из пакета devtools, поэтому включены только несколько дней выборки вместо полного квартала. Запуск td() сообщает об ошибке:

Ошибка в td (PD ~ price, conversion = "first", method = "chow-lin-fixed", fixed.rho = 0.5): In numeri Режим c, 'to' должно быть целым числом.

Я знаю, что и цена, и PD являются часто встречающимися ежедневными индикаторами в mydata, поэтому, думаю, мне нужно использовать to.quarterly() функция PD или что-то подобное.

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))

1 Ответ

1 голос
/ 04 июня 2020

Твоего примера недостаточно. Для каждой дезагрегации нам нужно как минимум 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

Создано 2020-06-03 пакетом REPEX (v0.3.0)

...