Вот подход с использованием 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")