Skip to content
Snippets Groups Projects
Commit 478c5a44 authored by Reinhold Kainhofer's avatar Reinhold Kainhofer
Browse files

- Implement Tarif and Contract as an R6 class

- Basic set up of Tarif and Contract. Probs are working, cash flows are the next thing.
- Move ValuationTable classes to ValuationTables.R
- Add lots of helper functions for valuation tables
- Refine function to plot life tables
- Add functions to extract cohort/period life tables (given YOB or period) from generic life tables
parent ab7900b6
No related branches found
No related tags found
No related merge requests found
.Rproj.user
.Rhistory
.RData
.~lock.*#
library("lifecontingencies");
# (virtual) base class for valuation tables, contains only the name / ID
InsuranceTarif=setRefClass(
"InsuranceContract",
slots=c(
name="character",
tarif="character",
desc="character",
YOB="numeric",
YOB2="numeric",
age="numeric",
age2="numeric",
contractLength="numeric",
mortalityTable="valuationTable",
mortalityTable2="valuationTable",
interest="numeric",
# cashflows="data.frame",
# deathPayments="list",
# survivalPayments="list",
# costCashflows="data.frame",
cashflows="data.frame",
probabilities="data.frame",
library(R6);
library("lifecontingencies")
# base class for Insurance Tarifs (holding contrat-independent values and
# providing methods to calculate cash flows, premiums, etc.). Objects of this
# class do NOT contain contract-specific values like age, death probabilities,
# premiums, reserves, etc.
InsuranceTarif = R6Class(
"InsuranceTarif",
public = list(
name = "Insurance Contract Type",
tarif = "Generic Tarif",
desc = "Description of the contract",
states = c("Lebend", "Tot"),
mortalityTable = NA,
interest=0,
initialize = function (name=NA, mortalityTable=NA, interest=NA,...) {
if (!missing(name)) self$name = name;
if (!missing(mortalityTable)) self$mortalityTable = mortalityTable;
if (!missing(interest)) self$interest = interest;
cat(paste0("Initializing Insurance Tarif ", self$name, "...\n"))
},
getTransitionProbabilities = function (age, ..., YOB=2000) {
ages = ages(self$mortalityTable, YOB=YOB);
q = deathProbabilities(self$mortalityTable, YOB=YOB);
if (age>0) {
ages = ages[-age:-1];
q = q[-age:-1];
}
p = 1-q;
len = length(p);
df=data.frame(p, q, rep(0,len), rep(1,len), row.names=ages)
df
},
getCashFlowsState = function (age, ..., policyPeriod=inf, deferral=0, maxAge=150) {
cf = list()
# TODO
},
getCashFlowsTransition = function (age, ..., policyPeriod=inf, deferral=0, maxAge=150) {
# TODO
}
)
);
TestTarif = InsuranceTarif$new(name="Testtarif", mortalityTable=AVOe2005R.male)
str(TestTarif)
TestTarif$getTransitionProbabilities(YOB=1980, age=30)
InsuranceContract = R6Class(
"InsuranceContract",
public = list(
tarif = NA,
YOB = NA,
age = NA,
policyPeriod = inf,
deferral = 0,
unterjährigkeit="numeric",
unterjährigkeitsapproximation="numeric",
cache.uj="list"
transitionProbabilities = NA,
cashFlowsState = NA,
cashFlowsTransition = NA,
# cashFlowsState = list(c(0), c(0)),
# cashFlowsTransition = list(matrix(c(0,1,0,1), 2, 2, byrow=TRUE)),
initialize = function (tarif, age, policyPeriod=inf, ..., deferral=0, YOB=1975) {
if (!missing(tarif)) self$tarif = tarif;
if (!missing(age)) self$age = age;
if (!missing(YOB)) self$YOB = YOB;
if (!missing(deferral)) self$deferral = deferral;
if (!missing(policyPeriod)) self$policyPeriod = policyPeriod;
self$determineTransitionProbabilities();
self$determineCashFlows();
},
),
prototype=list(
name="Insurance Contract Type",
tarif="Tariff",
desc="Description of the contract",
YOB=1977,
# YOB2=1977,
age=35,
# age2=35,
contractLength=Inf,
mortalityTable=AVOe2005R.unisex,
# mortalityTable2=AVOe2005R.unisex,
determineTransitionProbabilities = function() {
self$transitionProbabilities = self$tarif$getTransitionProbabilities(self$age, self$YOB);
},
interest=0,
determineCashFlows = function() {
self$cashFlowsState = self$tarif$getCashFlowsState(age=self$age, YOB=self$YOB, policyPeriod=self$policyPeriod, deferral=self$deferral, maxAge=self$age+length(self$transitionProbabilities));
self$cashFlowsTransition = self$tarif$getCashFlowsState(age=self$age, YOB=self$YOB, policyPeriod=self$policyPeriod, deferral=self$deferral, maxAge=self$age+length(self$transitionProbabilities));
}
deathPayments=list(),
survivalPayments=list(),
costCashflows=data.frame(),
cashflows=data.frame(),
probabilities=data.frame(),
unterjährigkeit=1,
unterjährigkeitsapproximation=1
)
);
setGeneric("setYOB", function(scale, ...) standardGeneric("setYOB"));
setMethod("setYOB", "InsuranceScale",
function (scale, ..., YOB=1975) {
scale@YOB=YOB;
scale
}
)
setGeneric("getTransitionProbabilities", function(scale, ...) standardGeneric("getTransitionProbabilities"));
setMethod("getTransitionProbabilities", "InsuranceScale",
function (scale, ...) {
q = deathProbabilities(scale@mortalityTable, scale@YOB);
p = 1-q;
len = length(p);
df=data.frame(p, q, rep(0,len), rep(1,len), row.names=ages(scale@mortalityTable, scale@YOB))
}
)
setGeneric("calculateTransitionProbabilities", function(scale, ...) standardGeneric("calculateTransitionProbabilities"));
setMethod("calculateTransitionProbabilities", "InsuranceScale",
function (scale, ...) {
scale@transitionProbabilities = getTransitionProbabilities(scale, ...);
scale
}
)
TestTarif = InsuranceScale(name="Testtarif", YOB=1980, age=30)
#TestTarif = setYOB(TestTarif, YOB=1980)
getTransitionProbabilities(TestTarif)
t=AVOe2005R.unisex
t@ages
t@deathProbs
qqq
qqq["1",]
mort=deathProbabilities(AVOe2005R.male, YOB=1977); mort
mort=deathProbabilities(AVOe2005R.unisex, YOB=1977); mort
q=mort
p=1-mort; p
len=length(p); len
qqq=data.frame(q=t@deathProbs, row.names=t@ages); qqq
df=data.frame("A-A"=p, "A-t"=q, "t-A"=rep(0, len), "t-t"=rep(1, len), row.names=t@ages)
df
# createCostStructure=function(age=35,contractLength=inf,
# alphaVS,
# alphaBP,
......
library("lifecontingencies");
library(ggplot2);
# (virtual) base class for valuation tables, contains only the name / ID
valuationTable=setClass(
"valuationTable",
slots=list(name="character", baseYear="numeric"),
prototype=list(name="Actuarial Valuation Table", baseYear=2000),
contains="VIRTUAL"
);
# A period life table, giving death probabilities for each age, up to
# maximum age omega. Optionally apply selection factors to the probabilities
valuationTable.period=setClass(
"valuationTable.period",
slots=list(ages="numeric", deathProbs="numeric"),
prototype=list(ages=eval(0:120), deathProbs=rep(1,120)),
contains="valuationTable"
);
# A cohort life table, obtained by age-shifting from a given base table (PODs
# for a base YOB)
valuationTable.ageShift=setClass(
"valuationTable.ageShift",
slots=list(ageShifts="data.frame"),
prototype=list(ageShifts=data.frame(YOB=c(), shifts=c())),
contains="valuationTable.period"
);
# A cohort life table, obtained by a trend projection from a given base table
# (PODs for a given observation year). Typically, the trend is obtained by
# the Lee-Carter method or some other trend estimation.
# The dampingFunction can be used to modify the cumulative years (e.g. G(tau+x) instead of tau+x)
# If trend2 is given, the G(tau+x) gives the weight of the first trend, 1-G(tau+x) the weight of the second trend
valuationTable.trendProjection=setClass(
"valuationTable.trendProjection",
slots=list(baseYear="numeric", trend="numeric", dampingFunction="function", trend2="numeric"),
prototype=list(baseYear=1980, trend=rep(0,120), dampingFunction=identity, trend2=0),
contains="valuationTable.period"
);
# A cohort life table, obtained by an improvment factor projection
# from a given base table (PODs for a given observation year).
valuationTable.improvementFactors=setClass(
"valuationTable.improvementFactors",
slots=list(baseYear="numeric", improvement="numeric"),
prototype=list(baseYear=2012, improvement=rep(0,120)),
contains="valuationTable.period"
);
# A cohort life table described by actual observations (data frame of PODs
# per year and age)
valuationTable.observed=setClass(
"valuationTable.observed",
slots=list(data="data.frame"),
prototype=list(data=data.frame()),
contains="valuationTable"
);
# A cohort life table obtained by joining two cohort life tables, each of which
# applies only to certain observation years (e.g. for the past use the observed
# PODs, and project them to the future with the trend projection)
valuationTable.joined=setClass(
"valuationTable.joined",
slots=list(
table1="valuationTable", yearRange1="numeric",
table2="valuationTable", yearRange2="numeric"),
contains="valuationTable"
);
# A cohort life table obtained by mixing two life tables with the given weights
valuationTable.mixed=setClass(
"valuationTable.mixed",
slots=c(table1="valuationTable", table2="valuationTable", weight1="numeric", weight2="numeric"),
prototype=list(weight1=1/2, weight2=1/2),
contains="valuationTable"
);
setGeneric("getOmega", function(object) standardGeneric("getOmega"));
setMethod("getOmega", "valuationTable.period",
function (object) {
max(object@ages,na.rm=TRUE);
})
setGeneric("deathProbabilities", function(object, ..., YOB=1975) standardGeneric("deathProbabilities"));
setMethod("deathProbabilities", "valuationTable.period",
function(object, ..., YOB=1975) {
object@deathProbs;
})
setMethod("deathProbabilities","valuationTable.ageShift",
function (object, ..., YOB=1975) {
qx=object@deathProbs;
shift.index=match(YOB, object@shifts, 0);
if (shift.index) {}
# TODO
qx
})
setMethod("deathProbabilities","valuationTable.trendProjection",
function (object, ..., YOB=1975) {
qx=object@deathProbs;
if (is.null(object@trend2) || length(object@trend2)<=1) {
ages=0:(length(qx)-1);
damping=sapply(ages, function (age) { object@dampingFunction(YOB+age-object@baseYear) });
# print(data.frame(age=0:(length(qx)-1), trend=object@trend, exponent=-object@trend*damping, damping=damping, baseqx=qx, qx=exp(-object@trend*damping)*qx)[66:90,]);
exp(-object@trend*damping)*qx;
} else {
# dampingFunction interpolates between the two trends:
weights=sapply(YOB+0:(length(qx)-1), object@dampingFunction);
qx*exp(-(object@trend*(1-weights) + object@trend2*(weights))*(YOB+0:(length(qx)-1)-object@baseYear))
}
})
# data.frame(x=0:121, qx=deathProbabilities(AVOe2005R.unisex, YOB=1948));
setMethod("deathProbabilities","valuationTable.improvementFactors",
function (object, ..., YOB=1975) {
qx=object@deathProbs;
(1-object@improvement)^(YOB+0:(length(qx)-1)-object@baseYear)*qx
})
setMethod("deathProbabilities","valuationTable.mixed",
function (object, ..., YOB=1975) {
qx1=deathProbabilities(object@table1, ..., YOB);
qx2=deathProbabilities(object@table2, ..., YOB);
(object@weight1*qx1 + object@weight2*qx2)/(object@weight1 + object@weight2)
})
setGeneric("lifeTable", function(object, ...) standardGeneric("lifeTable"));
setMethod("lifeTable","valuationTable",
function (object, ...) {
qx=deathProbabilities(object, ...);
if (qx[[length(qx)]]!=1) { qx=c(qx, 1, 1); }
probs2lifetable(qx, type="qx")
})
setGeneric("baseYear", function(object, ...) standardGeneric("baseYear"));
setMethod("baseYear","valuationTable",
function (object, ...) {
object@baseYear
})
setMethod("baseYear","valuationTable.mixed",
function (object, ...) {
baseYear(object@table1)
})
setGeneric("baseTable", function(object, ...) standardGeneric("baseTable"));
setMethod("baseTable","valuationTable",
function (object, ...) {
c()
})
setMethod("baseTable","valuationTable.period",
function (object, ...) {
object@deathProbs
})
makeQxDataFrame = function(...) {
data=list(...);
names(data) = lapply(data, function(t) t@name);
data = lapply(data, function(t) cbind(x=t@ages, y=t@deathProbs))
list.names = names(data)
lns <- sapply(data, nrow)
data <- as.data.frame(do.call("rbind", data))
data$group <- rep(list.names, lns)
data
}
plotValuationTables = function(..., title = "") {
data = makeQxDataFrame(...);
pl = ggplot(data, aes(x = x, y = y, colour = data$group)) +
theme_bw() +
theme(
plot.title = element_text(size=18, face="bold"),
legend.title = element_text(size=14, face="bold.italic")
) +
geom_line() +
scale_y_log10(#breaks = trans_breaks('log10', function(x) 10^x),
#labels = trans_format('log10', math_format(10^.x)),
#minor_breaks = log(c(sapply(x, function(x) seq(0, x, x/10))), 10)
) +
xlab("Alter") + ylab("q_x") + labs(colour="Sterbetafel");
if (title != "") {
pl = pl + ggtitle("Österreichische Volkssterbetafeln Männer seit 1870");
}
pl
}
library("lifecontingencies");
library(ggplot2);
# (virtual) base class for valuation tables, contains only the name / ID
valuationTable=setClass(
"valuationTable",
slots=list(name="character"),
prototype=list(name="Actuarial Valuation Table"),
slots=list(name="character", baseYear="numeric"),
prototype=list(name="Actuarial Valuation Table", baseYear=2000),
contains="VIRTUAL"
);
......@@ -67,6 +68,13 @@ valuationTable.joined=setClass(
table2="valuationTable", yearRange2="numeric"),
contains="valuationTable"
);
# A cohort life table obtained by mixing two life tables with the given weights
valuationTable.mixed=setClass(
"valuationTable.mixed",
slots=c(table1="valuationTable", table2="valuationTable", weight1="numeric", weight2="numeric"),
prototype=list(weight1=1/2, weight2=1/2),
contains="valuationTable"
);
......@@ -76,6 +84,13 @@ setMethod("getOmega", "valuationTable.period",
max(object@ages,na.rm=TRUE);
})
setGeneric("ages", function(object, ...) standardGeneric("ages"));
setMethod("ages", "valuationTable.period",
function (object, ...) {
object@ages;
})
setGeneric("deathProbabilities", function(object, ..., YOB=1975) standardGeneric("deathProbabilities"));
setMethod("deathProbabilities", "valuationTable.period",
function(object, ..., YOB=1975) {
......@@ -86,27 +101,83 @@ setMethod("deathProbabilities","valuationTable.ageShift",
qx=object@deathProbs;
shift.index=match(YOB, object@shifts, 0);
if (shift.index) {}
# shift=
# TODO
qx
})
setMethod("deathProbabilities","valuationTable.trendProjection",
function (object, ..., YOB=1975) {
cat("deathProbabilities for valuationTable.trendProjection, YOB=", YOB, "\n")
qx=object@deathProbs;
if (length(object@trend2)<=1) {
exp(-object@trend*object@dampingFunction(YOB+0:(length(qx)-1)-object@baseYear))*qx
#exp(-object@trend*object@dampingFunction(YOB+0:(length(qx)-1)-object@baseYear))
#qx
if (is.null(object@trend2) || length(object@trend2)<=1) {
ages=0:(length(qx)-1);
damping=sapply(ages, function (age) { object@dampingFunction(YOB+age-object@baseYear) });
# print(data.frame(age=0:(length(qx)-1), trend=object@trend, exponent=-object@trend*damping, damping=damping, baseqx=qx, qx=exp(-object@trend*damping)*qx)[66:90,]);
exp(-object@trend*damping)*qx;
} else {
# dampingFunction interpolates between the two trends:
weights=sapply(YOB+0:(length(qx)-1), object@dampingFunction);
qx*exp(-(object@trend*(1-weights) + object@trend2*(weights))*(YOB+0:(length(qx)-1)-object@baseYear))
}
})
# data.frame(x=0:121, qx=deathProbabilities(AVOe2005R.unisex, YOB=1948));
setMethod("deathProbabilities","valuationTable.improvementFactors",
function (object, ..., YOB=1975) {
qx=object@deathProbs;
(1-object@improvement)^(YOB+0:(length(qx)-1)-object@baseYear)*qx
})
setMethod("deathProbabilities","valuationTable.mixed",
function (object, ..., YOB=1975) {
qx1=deathProbabilities(object@table1, ..., YOB);
qx2=deathProbabilities(object@table2, ..., YOB);
(object@weight1*qx1 + object@weight2*qx2)/(object@weight1 + object@weight2)
})
setGeneric("periodDeathProbabilities", function(object, ...) standardGeneric("periodDeathProbabilities"));
setMethod("periodDeathProbabilities", "valuationTable.period",
function(object, ...) {
object@deathProbs;
})
setMethod("periodDeathProbabilities","valuationTable.ageShift",
function (object, ..., Period=1975) {
# TODO
qx=object@deathProbs;
shift.index=match(YOB, object@shifts, 0);
if (shift.index) {}
# TODO
qx
})
setMethod("periodDeathProbabilities","valuationTable.trendProjection",
function (object, ..., Period=1975) {
qx=object@deathProbs;
if (is.null(object@trend2) || length(object@trend2)<=1) {
ages=0:(length(qx)-1);
damping=object@dampingFunction(Period-object@baseYear);
# print(data.frame(age=0:(length(qx)-1), trend=object@trend, exponent=-object@trend*damping, damping=damping, baseqx=qx, qx=exp(-object@trend*damping)*qx)[66:90,]);
exp(-object@trend*damping)*qx;
} else {
# TODO
# dampingFunction interpolates between the two trends:
weights=sapply(YOB+0:(length(qx)-1), object@dampingFunction);
qx*exp(-(object@trend*(1-weights) + object@trend2*(weights))*(YOB+0:(length(qx)-1)-object@baseYear))
}
})
# data.frame(x=0:121, qx=deathProbabilities(AVOe2005R.unisex, YOB=1948));
setMethod("periodDeathProbabilities","valuationTable.improvementFactors",
function (object, ..., Period=1975) {
qx=object@deathProbs;
(1-object@improvement)^(Period-object@baseYear)*qx
})
setMethod("periodDeathProbabilities","valuationTable.mixed",
function (object, ..., Period=1975) {
qx1=periodDeathProbabilities(object@table1, ..., Period=Period);
qx2=periodDeathProbabilities(object@table2, ..., Period=Period);
(object@weight1*qx1 + object@weight2*qx2)/(object@weight1 + object@weight2)
})
setGeneric("lifeTable", function(object, ...) standardGeneric("lifeTable"));
setMethod("lifeTable","valuationTable",
function (object, ...) {
......@@ -116,3 +187,107 @@ setMethod("lifeTable","valuationTable",
})
setGeneric("baseYear", function(object, ...) standardGeneric("baseYear"));
setMethod("baseYear","valuationTable",
function (object, ...) {
object@baseYear
})
setMethod("baseYear","valuationTable.mixed",
function (object, ...) {
baseYear(object@table1)
})
setGeneric("baseTable", function(object, ...) standardGeneric("baseTable"));
setMethod("baseTable","valuationTable",
function (object, ...) {
c()
})
setMethod("baseTable","valuationTable.period",
function (object, ...) {
object@deathProbs
})
setGeneric("getPeriodTable", function(object, Period, ...) standardGeneric("getPeriodTable"));
setMethod("getPeriodTable","valuationTable",
function (object, Period, ...) {
valuationTable.period(
name = paste(object@name, ", Period ", Period),
baseYear = Period,
ages = ages(object),
deathProbs = periodDeathProbabilities(object, Period=Period)
)
})
setGeneric("getCohortTable", function(object, Period, ...) standardGeneric("getCohortTable"));
setMethod("getCohortTable","valuationTable",
function (object, YOB, ...) {
valuationTable.period(
name = paste(object@name, ", YOB ", YOB),
baseYear = YOB,
ages=ages(object),
deathProbs=deathProbabilities(object, YOB=YOB)
);
})
makeQxDataFrame = function(..., YOB=1972, Period=NA) {
data=list(...);
names(data) = lapply(data, function(t) t@name);
if (missing(Period)) {
cat("Year of birth: ", YOB, "\n");
data = lapply(data, function(t) cbind(x=t@ages, y=deathProbabilities(t, YOB=YOB)))
} else {
cat("Period: ", Period,"\n");
data = lapply(data, function(t) cbind(x=t@ages, y=periodDeathProbabilities(t, Period=Period)))
}
list.names = names(data)
lns <- sapply(data, nrow)
data <- as.data.frame(do.call("rbind", data))
data$group <- rep(list.names, lns)
data
}
plotValuationTables = function(..., title = "", legend.position=c(0.9,0.1), legend.key.width = unit(25, "mm")) {
data = makeQxDataFrame(...);
pl = ggplot(data, aes(x = x, y = y, colour = data$group)) +
theme_bw() +
theme(
plot.title = element_text(size=18, face="bold"),
legend.title = element_text(size=14, face="bold.italic"),
# legend in bottom right corner of the plot
legend.justification=c(1,0), legend.position=legend.position,
# No box around legend entries
legend.key = element_blank(),
legend.key.width = legend.key.width,
legend.background = element_rect(colour="gray50", linetype="solid")
) +
geom_line() +
scale_y_log10(
name=expression(paste("Sterbewahrscheinlichkeit ", q[x])),
breaks = scales::trans_breaks('log10', function(x) 10^x),
labels = scales::trans_format('log10', scales::math_format(10^.x))
#minor_breaks = log(c(sapply(x, function(x) seq(0, x, x/10))), 10)
) +
scale_x_continuous(
name="Alter",
#breaks = function (limits) scales::trans_breaks('', function(x) 10^x),
breaks = function (limits) seq(max(min(limits),0),max(limits),5),
minor_breaks = function (limits) seq(max(round(min(limits)),0),round(max(limits)),1),
#labels = scales::trans_format('log10', scales::math_format(10^.x))
) +
annotation_logticks(sides="lr") +
xlab("Alter") + labs(colour="Sterbetafel");
if (title != "") {
pl = pl + ggtitle(title);
}
pl# + coord_flip()
}
plotValuationTables(mort.AT.census.1869.male, mort.AT.census.1869.female, mort.AT.census.2011.male, mort.AT.census.2011.female, AVOe2005R.male, AVOe2005R.female, YOB=1972,title="Vergleich österreichische Sterbetafeln")
plotValuationTables(mort.AT.census.2001.male, AVOe2005R.male, YOB=1972, title="Vergleich österreichische Sterbetafeln")
plotValuationTables(getCohortTable(AVOe2005R.male, YOB=1972), getCohortTable(AVOe2005R.male, YOB=2016), title="Vergleich österreichische Sterbetafeln")
......@@ -218,3 +218,6 @@ AVOe2005R.unisex.group.av=AVOe2005R_gen.av("AVÖ 2005R unisex group (age-shifted
###############################################################################
t=AVOe2005R.male;
deathProbabilities(t, YOB=2001)
......@@ -109,3 +109,31 @@ ggplot(mort.AT.census.ALL.maleA, aes(x = x, y = y, colour = mort.AT.census.ALL.m
plotValuationTables(mort.AT.census.1869.male, mort.AT.census.1869.female, mort.AT.census.2011.male, mort.AT.census.2011.female, title="Vergleich österreichische Sterbetafeln")
plotValuationTables(
#mort.AT.census.1869.male,
##mort.AT.census.1880.male,
#mort.AT.census.1890.male,
#mort.AT.census.1900.male,
#mort.AT.census.1910.male,
#mort.AT.census.1931.male,
#mort.AT.census.1951.male,
#mort.AT.census.1961.male,
#mort.AT.census.1971.male,
#mort.AT.census.1981.male,
#mort.AT.census.1991.male,
#mort.AT.census.2001.male,
#mort.AT.census.2011.male,
mort.AT.census.1869.female,
mort.AT.census.1880.female,
mort.AT.census.1890.female,
mort.AT.census.1900.female,
mort.AT.census.1910.female,
mort.AT.census.1931.female,
mort.AT.census.1951.female,
mort.AT.census.1961.female,
mort.AT.census.1971.female,
mort.AT.census.1981.female,
mort.AT.census.1991.female,
mort.AT.census.2001.female,
mort.AT.census.2011.female, title="Vergleich österreichische Sterbetafeln", legend.position=c(1,0))
\ No newline at end of file
......@@ -86,6 +86,6 @@ DAV2004R.male=valuationTable.trendProjection(
DAV2004R.female=valuationTable.trendProjection(
name="DAV 2004R female",
ages=DAV2004R.exakt.data$age, baseYear=2000,
deathProbs=DAV2004R.exakt.data$qy2000,
deathProbs=DAV2004R.exakt.data $qy2000,
trend=DAV2004R.exakt.data$trendF
);
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment