матрица данных вероятности, основанная на изменении портфеля за период - PullRequest
0 голосов
/ 02 октября 2018

У меня есть фрейм данных с большими панельными данными, подобный этому

Date        Firms   Portfolio
2007-02-01    A      1
2007-02-01    B      1
2007-02-01    C      2
2007-02-01    D      2
2007-02-01    E      3
2007-02-01    F      3

2007-03-01    C      1
2007-03-01    B      1
2007-03-01    A      2
2007-03-01    F      2
2007-03-01    E      3
2007-03-01    D      3

Здесь каждый период имеет фиксированное количество портфелей (три в приведенном выше примере).Теперь я хочу создать логическую матрицу вероятности, подобную этой.

            port1   port2   port3
port1        0.5    0.5      0
port2        0.5    0       0.5
port3        0      0.5     0.5

, если вы рассматриваете портфель 1 периода 1, комбинация была A и B. Но в периоде 2 портфель 1 имеет B и C, что означает 50% акций (только B) остаются в портфеле 1 в следующем периоде.остальные 50% акций портфеля 1 поступают в портфель 2, поскольку акции А находятся в портфеле 2 в период 2007-03-01.Портфель 3 имеет E и D во втором периоде (2007-03-01), что означает, что нет никаких акций, поступающих из портфеля 1. Таким образом, мы назначаем ячейку port1-port3. Аналогичным образом я хотел бы назначить вероятности в двух других столбцах портфелей.,

Теперь, если этот процесс будет продолжаться в течение 100 периодов, у нас будет 99 таких матриц.Но мне нужна одна матрица, которая представляет средние значения этих 99 матриц.

1 Ответ

0 голосов
/ 02 октября 2018

Вот подход с использованием dplyr и tidyr:

library(dplyr); library(tidyr)
a <- data %>%

  # First get long-format listing of all Date-Firms shifts
  arrange(Date, Firms) %>%
  group_by(Firms) %>% 
  mutate(to = lead(Portfolio)) %>%
  rename(from = Portfolio) %>%
  ungroup() %>%

  # What share of that month's moves with that to & from?
  group_by(Date, from, to) %>%
  tally() %>%
  mutate(share = n / sum(n)) %>%
  ungroup() 

В таблице a будут храниться все матрицы вероятностей в «длинном» формате, где каждая существующая комбинация Date,to и from получите строку.Чтобы получить среднее значение по всем матрицам (каждая из которых представляет собой все строки a, разделяющие одну дату), мы можем взять среднее значение для всех комбинаций "из / в".

a_summary <- a %>%
  group_by(from, to) %>%
  summarize(avg = mean(share, na.rm = T)) %>%
  ungroup() %>%
  spread(from, avg, fill = 0)

> a_summary
# A tibble: 4 x 4
     to   `1`   `2`   `3`
  <int> <dbl> <dbl> <dbl>
1     1   0.5  0.75   0  
2     2   0.5  0      0.5
3     3   0    0.5    0.5
4    NA   1    1      1  

Примерданные (добавлен третий период):

data <- read.table(header = T, text = "
  Date        Firms   Portfolio
  2007-02-01    A      1
  2007-02-01    B      1
  2007-02-01    C      2
  2007-02-01    D      2
  2007-02-01    E      3
  2007-02-01    F      3

  2007-03-01    C      1
  2007-03-01    B      1
  2007-03-01    A      2
  2007-03-01    F      2
  2007-03-01    E      3
  2007-03-01    D      3

  2007-04-01    A      1
  2007-04-01    B      1
  2007-04-01    C      2
  2007-04-01    D      2
  2007-04-01    E      3
  2007-04-01    F      1")
...