pensionTable.R 8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
#' @include mortalityTable.R
NULL


#' Class pensionTable
#'
#' Class \code{pensionTable} is the (virtual) base class for all pensions
#' tables. It contains the name and some general values applying to all
#' types of tables. In particular, it holds individual tables for each of the
#' transition probabilities. Possible states are:
Reinhold Kainhofer's avatar
Reinhold Kainhofer committed
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#' \itemize{
#'     \item active: healty, no pension, typically paying some kin of premium
#'     \item incapacity: disablity pension, in most cases permanent, not working, early pension
#'     \item retirement: old age pension, usually starting with a fixed age
#'     \item dead \itemize{
#'       \item Widow/widower pension
#'     }
#' }
#' Correspondingly, the following transition probabilities can be given:\describe{
#'     \item{qxaa}{death probability of actives (active -> dead)}
#'     \item{ix}{invalidity probability (active -> incapacity)}
#'     \item{qix}{death probability of invalid (invalid -> dead)}
#'     \item{rx}{reactivation probability (incapacity -> active)}
#'     \item{apx}{retirement probability (active -> retirement), typically 1 for a fixed age}
#'     \item{apx}{retirement probability of invalids (invalid -> retirement), typically 0 or 1 for a fixed age}
#'     \item{qpx}{death probability of retired (retired -> dead)}
#'     \item{hx}{probability of a widow at moment of death (dead -> widow), y(x) age difference}
#'     \item{qxw}{death probability of widows/widowers}
#'     \item{qgx}{death probability of total group (irrespective of state)}
#' }
31 32 33
#'
#' @slot qx     Death probability table of actives (derived from mortalityTable)
#' @slot ix     Invalidity probability of actives (derived from mortalityTable)
34
#' @slot qix    Death probability table of invalids (derived from mortalityTable)
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
#' @slot rx     Reactivation probability of invalids (derived from mortalityTable)
#' @slot apx    Retirement probability of actives (derived from mortalityTable)
#' @slot apix   Retirement probability of invalids (derived from mortalityTable)
#' @slot qpx    Death probability of old age pensioners (derived from mortalityTable)
#' @slot hx     Probability of a widow at the moment of death (derived from mortalityTable)
#' @slot qwy    Death probability of widow(er)s (derived from mortality Table)
#' @slot yx     Age difference of the widow to the deceased
#' @slot qgx    Death probability of whole group (derived from mortalityTable), irrespective of state
#'
#' @export pensionTable
#' @exportClass pensionTable
pensionTable = setClass(
    "pensionTable",
    slots = list(
        qx    = "mortalityTable",
        ix    = "mortalityTable",
        qix   = "mortalityTable",
        rx    = "mortalityTable",
        apx   = "mortalityTable",
        apix  = "mortalityTable",
        qpx   = "mortalityTable",
        hx    = "mortalityTable",
        qwy   = "mortalityTable",
        yx    = "mortalityTable",
        qgx   = "mortalityTable"
    ),
    contains = "mortalityTable"
)

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
pensionTableProbArrange = function(x, q, i, qi, r, ap, api, qp, h, qw, yx, qg, as.data.frame = TRUE) {
    if (as.data.frame) {
        data.frame(x, q, i, qi, r, ap, api, qp, h, qw, yx, qg)
    } else {
        states = c("a", "i", "p", "d")
        transProb = array(0, dim = c(4,4, length(x)), dimnames = list(states, states, x))

        transProb["a", "a", ] = (1 - i - q) * (1 - ap);
        transProb["a", "i", ] = i;
        transProb["a", "p", ] = (1 - q - i ) * ap;
        transProb["a", "d", ] = q;

        transProb["i", "a", ] = r;
        transProb["i", "i", ] = (1 - qi - r) * (1 - api);
        transProb["i", "p", ] = (1 - qi - r) * api;
        transProb["i", "d", ] = qi;

        transProb["p", "p", ] = 1 - qp;
        transProb["p", "d", ] = qp;

        transProb["d", "d", ] = 1;

        list(transitionProbabilities = transProb, widows = data.frame(x, h, qw, yx))
    }
}

#' Return all transition probabilities of the pension table (generational probabilities)
91 92 93 94
#'
#' @param object A pension table object (instance of a \code{\linkS4class{pensionTable}} class)
#' @param ... Currently unused
#' @param YOB Year of birth
Reinhold Kainhofer's avatar
Reinhold Kainhofer committed
95
#' @param as.data.frame Whether the return value should be a data.frame or an array containing transition matrices
96 97
#'
#' @examples
Reinhold Kainhofer's avatar
Reinhold Kainhofer committed
98
#' pensionTables.load("Austria_*")
99
#' # transitionProbabilities(EttlPagler.male)
100 101
#'
#' @exportMethod transitionProbabilities
102
setGeneric("transitionProbabilities", function(object, ...) standardGeneric("transitionProbabilities"));
103

104
#' @describeIn transitionProbabilities Return all transition probabilities of the pension table for the generation YOB
105
setMethod("transitionProbabilities", "pensionTable",
106
          function(object, YOB = 1982, ..., as.data.frame = TRUE) {
107
              na.zero = function(x) { x[is.na(x)] = 0; x }
108
              x   = ages(object@qx);
109 110
              q   = deathProbabilities(object@qx, ..., YOB = YOB);
              i   = deathProbabilities(object@ix, ..., YOB = YOB);
111 112 113
              qi  = deathProbabilities(object@qix, ..., YOB = YOB);
              r   = deathProbabilities(object@rx, ..., YOB = YOB);
              ap  = deathProbabilities(object@apx, ..., YOB = YOB);
114
              api = deathProbabilities(object@apix, ..., YOB = YOB);
115 116 117 118 119 120
              qp  = deathProbabilities(object@qpx, ..., YOB = YOB);
              h   = deathProbabilities(object@hx, ..., YOB = YOB);
              qw  = deathProbabilities(object@qwy, ..., YOB = YOB);
              yx  = deathProbabilities(object@yx, ..., YOB = YOB);
              qg  = deathProbabilities(object@qgx, ..., YOB = YOB);
              pensionTableProbArrange(x, q, i, qi, r, ap, api, qp, h, qw, yx, qg, as.data.frame = as.data.frame)
121 122
          })

123
#' Return all period transition probabilities of the pension table
124 125
#'
#' @param object A pension table object (instance of a \code{\linkS4class{pensionTable}} class)
126
#' @param Period Observation year
127
#' @param ... Currently unused
128
#' @param as.data.frame Whether the return value should be a data.frame or an array containing transition matrices
129 130
#'
#' @examples
Reinhold Kainhofer's avatar
Reinhold Kainhofer committed
131
#' pensionTables.load("Austria_*")
132
#' # periodTransitionProbabilities(EttlPagler.male, Period = 2017)
133
#'
134 135
#' @exportMethod periodTransitionProbabilities
setGeneric("periodTransitionProbabilities", function(object, ...) standardGeneric("periodTransitionProbabilities"));
136 137


138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
#' @describeIn periodTransitionProbabilities Return all transition probabilities of the pension table for the period Period
setMethod("periodTransitionProbabilities", "pensionTable",
          function(object, Period = 2017, ..., as.data.frame = TRUE) {
              na.zero = function(x) { x[is.na(x)] = 0; x }
              x   = ages(object@qx);
              q   = na.zero(periodDeathProbabilities(object@qx, ..., Period = Period));
              i   = na.zero(periodDeathProbabilities(object@ix, ..., Period = Period));
              qi  = periodDeathProbabilities(object@qix, ..., Period = Period);
              r   = periodDeathProbabilities(object@rx, ..., Period = Period);
              ap  = periodDeathProbabilities(object@apx, ..., Period = Period);
              api = periodDeathProbabilities(object@apix, ..., Period = Period);
              qp  = periodDeathProbabilities(object@qpx, ..., Period = Period);
              h   = periodDeathProbabilities(object@hx, ..., Period = Period);
              qw  = periodDeathProbabilities(object@qwy, ..., Period = Period);
              yx  = periodDeathProbabilities(object@yx, ..., Period = Period);
              qg  = periodDeathProbabilities(object@qgx, ..., Period = Period);
              pensionTableProbArrange(x, q, i, qi, r, ap, api, qp, h, qw, yx, qg, as.data.frame = as.data.frame)
          })
156

157

158
if (FALSE) {
159
    pensionTables.load("Austria_AVOe2008P")
160 161 162 163
    transitionProbabilities(AVOe2008P.male, YOB = 1977, as.data.frame = FALSE)
    epP = transitionProbabilities(EttlPagler.male, YOB = 1982)
#    avoe08p =
        transitionProbabilities(AVOe2008P.male, YOB = 1977, as.data.frame = TRUE)
164 165 166 167
avoe08p.period = periodTransitionProbabilities(AVOe2008P.male, Period = 2007, as.data.frame = TRUE)

pensionTables.list(package = "MortalityTablesPrivate")
pensionTables.load("Austria_AVOe1999P")
168
}