Применить функцию к нескольким объектам и сохранить результаты в таблице в R

#r #function #apply #subject

#r #функция #применить #объект

Вопрос:

Я собираюсь использовать пакет Chainladder и применить его функцию mackchainladder()

У меня есть данные со многими треугольниками накопительных платежей в Excel, отформатированные следующим образом:

 
ID  A    DY1    DY2     DY3     DY4     DY5     DY6     DY7     DY8     DY9     DY10
27  1   1526    2860    3575    3544    3700    3714    3714    3681    3669    3595
27  2   1717    3619    3706    3687    3547    3511    4306    4235    4231    
27  3   5042    9957    12912   14249   15801   15659   15766   15811       
27  4   8399    15946   19155   20120   20645   20357   20517           
27  5   6494    11274   13220   13907   14383   14435               
27  6   7340    13426   16916   18420   18605                   
27  7   11004   20474   26251   28964                       
27  8   13107   23065   26150                           
27  9   17250   23922                               
27  10  18833                                   
35  1   90751   130298  147618  159509  165517  169048  170988  171730  171854  172295
35  2   105370  152668  174635  189384  196637  200010  202436  203752  204294  
35  3   123692  181088  207566  225943  235993  243255  245759  247297      
35  4   142717  206614  236415  255642  265007  269450  272050          
35  5   167997  235772  267384  286297  294015  297560              
35  6   169744  237253  270713  288991  299322                  
35  7   204752  279957  317459  342275                      
35  8   231249  318056  359736                          
35  9   257927  358768                              
35  10  300881                                  

  

Вы можете найти данные и примеры пакета цепочечной лестницы здесь:

http://code.google.com/p/chainladder/wiki/Examples

пример вывода chainladder

библиотека (ChainLadder)
M <- MackChainLadder(RAA, est.sigma=»Mack»)
M

MackChainLadder(Triangle = RAA, est.sigma = «Mack»)

 
     Latest Dev.To.Date Ultimate   IBNR Mack.S.E    CV
1981 18,834       1.000   18,834      0        0   NaN
1982 16,704       0.991   16,858    154      206 1.339
1983 23,466       0.974   24,083    617      623 1.010
1984 27,067       0.943   28,703  1,636      747 0.457
1985 26,180       0.905   28,927  2,747    1,469 0.535
1986 15,852       0.813   19,501  3,649    2,002 0.549
1987 12,314       0.694   17,749  5,435    2,209 0.406
1988 13,112       0.546   24,019 10,907    5,358 0.491
1989  5,395       0.336   16,045 10,650    6,333 0.595
1990  2,063       0.112   18,402 16,339   24,566 1.503

               Totals
Latest:    160,987.00
Ultimate:  213,122.23
IBNR:       52,135.23
Mack S.E.:  26,909.01
CV:              0.52

  

У меня есть тысячи идентификаторов (компаний).

Я хочу применить метод R Chain-Ladder (mackchainladder) к каждому треугольнику и получить IBNR и SD для IBNR. Однако я не знаю, как применить цепную лестницу к каждой из этих компаний, и как получить результаты в таблице, выглядит примерно так:

 
ID  IBNR  Mack_S.E.
11  11111  2222
24  33333  4444 (I made up those numbers)
  

Могу ли я использовать gapply()? Тогда как я могу создать таблицу для своих результатов? Я новичок в R, любые комментарии приветствуются.

Ответ №1:

Итак, вот ваши данные в форме с возможностью копирования / вставки, которую я назвал dd

 dd<-structure(list(ID = c(27L, 27L, 27L, 27L, 27L, 27L, 27L, 27L, 
27L, 27L, 35L, 35L, 35L, 35L, 35L, 35L, 35L, 35L, 35L, 35L), 
    A = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 
    4L, 5L, 6L, 7L, 8L, 9L, 10L), DY1 = c(1526L, 1717L, 5042L, 
    8399L, 6494L, 7340L, 11004L, 13107L, 17250L, 18833L, 90751L, 
    105370L, 123692L, 142717L, 167997L, 169744L, 204752L, 231249L, 
    257927L, 300881L), DY2 = c(2860L, 3619L, 9957L, 15946L, 11274L, 
    13426L, 20474L, 23065L, 23922L, NA, 130298L, 152668L, 181088L, 
    206614L, 235772L, 237253L, 279957L, 318056L, 358768L, NA), 
    DY3 = c(3575L, 3706L, 12912L, 19155L, 13220L, 16916L, 26251L, 
    26150L, NA, NA, 147618L, 174635L, 207566L, 236415L, 267384L, 
    270713L, 317459L, 359736L, NA, NA), DY4 = c(3544L, 3687L, 
    14249L, 20120L, 13907L, 18420L, 28964L, NA, NA, NA, 159509L, 
    189384L, 225943L, 255642L, 286297L, 288991L, 342275L, NA, 
    NA, NA), DY5 = c(3700L, 3547L, 15801L, 20645L, 14383L, 18605L, 
    NA, NA, NA, NA, 165517L, 196637L, 235993L, 265007L, 294015L, 
    299322L, NA, NA, NA, NA), DY6 = c(3714L, 3511L, 15659L, 20357L, 
    14435L, NA, NA, NA, NA, NA, 169048L, 200010L, 243255L, 269450L, 
    297560L, NA, NA, NA, NA, NA), DY7 = c(3714L, 4306L, 15766L, 
    20517L, NA, NA, NA, NA, NA, NA, 170988L, 202436L, 245759L, 
    272050L, NA, NA, NA, NA, NA, NA), DY8 = c(3681L, 4235L, 15811L, 
    NA, NA, NA, NA, NA, NA, NA, 171730L, 203752L, 247297L, NA, 
    NA, NA, NA, NA, NA, NA), DY9 = c(3669L, 4231L, NA, NA, NA, 
    NA, NA, NA, NA, NA, 171854L, 204294L, NA, NA, NA, NA, NA, 
    NA, NA, NA), DY10 = c(3595L, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, 172295L, NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("ID", 
"A", "DY1", "DY2", "DY3", "DY4", "DY5", "DY6", "DY7", "DY8", 
"DY9", "DY10"), class = "data.frame", row.names = c(NA, -20L))
  

Тогда мы действительно можем просто разделить data.frame на фрагменты на основе идентификаторов, а затем применить функцию к каждому подмножеству.

 library('ChainLadder')

#helper function
dstack<-function(x) do.call(rbind, Map(function(id, dd) 
    cbind.data.frame(id=id, data.frame(as.list(dd))), names(x), x))

dstack(lapply(lapply(lapply(split(dd[,-(1:2)], dd$ID), MackChainLadder), summary), 
    function(x) setNames(x$Totals[c("IBNR:","Mack S.E.:"),],c("IBNR","Mack S.E."))))
  

Здесь мы разделяем данные (исключая первые два столбца) и выполняем MacChainLadder для каждого подмножества. Затем мы выполняем сводку по каждому из этих объектов (для вычисления статистики), а затем, наконец, извлекаем статистику. Затем я использую dstack для стекирования значений обратно в data.frame и объединения в ID для каждой из компаний. С помощью этого примера данных я получил результат

    id      IBNR Mack.S.E.
27 27  35588.59  8839.536
35 35 481647.16 17130.185