2016-07-11 11 views
1

Я пытаюсь вычислить значение CAGR, определенное как (Окончание/начало)^(1/количество лет) -1.Расчет составного возврата по ID в R

У меня есть df, который имеет столбцы «Stock», «date», «Annual.Growth.Rate». Чтобы быстро заметить: я пытался сделать это с помощью функции задержки, однако я не смог изменить рекурсивную формулу в начале каждой акции. Это будет иметь больше смысла в отношении dput:

structure(list(Stock = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
    date = structure(c(6L, 2L, 3L, 4L, 5L, 1L, 12L, 8L, 9L, 10L, 
    11L, 7L), .Label = c("3/28/16", "3/29/12", "3/29/13", "3/29/14", 
    "3/29/15", "3/30/11", "6/28/16", "6/29/12", "6/29/13", "6/29/14", 
    "6/29/15", "6/30/11"), class = "factor"), Annual.Growth.Rate = c(0.1, 
    0.2, 0.1, 0.1, 0.1, 0.1, 0.3, 0.2, 0.14, 0.14, 0.14, 0.14 
    ), Growth = c(110, 132, 145.2, 159.72, 175.692, 193.2612, 
    130, 156, 177.84, 202.7376, 231.120864, 263.477785), CAGR = c(0.098479605, 
    0.098479605, 0.098479605, 0.098479605, 0.098479605, 0.098479605, 
    0.125, 0.125, 0.125, 0.125, 0.125, 0.125)), .Names = c("Stock", 
"date", "Annual.Growth.Rate", "Growth.on.100", "CAGR"), class = "data.frame", row.names = c(NA, 
-12L)) 

Это ожидаемый результат. Раньше существовал запас, дата и рост). Рост на 100 не является «отставанием» от предыдущего. Поскольку первая доступная дата умножается на заданный стартер, в этом случае 100, (1 + .1) * 100, а затем следующее значение роста - это будущая величина (110) * следующего темпа роста. Я могу понять, как сделать CAGR, используя dplyr, но я действительно застрял на росте на 100.

ответ

1

Вы можете использовать cumprod в мутате. Также начальное значение 100 произвольно. Это все продукт. Вы можете рассчитать оставшуюся часть продукта, а затем умножить на стартер.

starter <- 100 
my.data <- data.frame(stock=c('a','a','a','b','b','b'), growth = c(.1,.2,.1,.1,.1,.1), date = c(1,2,3,1,2,3)) #example Data 
my.data 
my.data %>% 
    group_by(stock) %>% 
    mutate(growth.unit = order_by(date,cumprod(1+growth)), 
     growth = growth.unit*starter) -> new.data