Dr Patrick J. Laub
Université Lyon 1
Work
Work
Coffee
Coffee
Lunch
Home
Chat
Work
Work
Coffee
Coffee
Lunch
Home
Bisous
Pause Café
Paperwork
Déjeuner
Il y a un pot
Une petite pinte
Paperwork
Sieste
(Talk)
Work
Work
Coffee
Coffee
Lunch
Home
Chat
1/3
1/3
1/3
1
1
1
1
1
2
5
1
4
3
7
6
1/3
1/3
1/3
1
1
1
1
1
State | Time in State |
---|---|
Coffee | 5 mins |
Work | 2 hours 3 mins |
Lunch | 26 mins |
Coffee | 11 mins |
Work | 1 hour 37 mins |
Chat | 45 mins |
Work | 2 hours 1 mins |
Chain
Discrete Time
Process
Continuous Time
Markov chain State space
Markov process at times
Sojourn times are the random lengths of time spent in each state
2
5
1
4
3
7
6
1/3
1/3
1/3
1
1
1
1
1
Markov process State space
Markov process State space
Markov chain State space
When your problem has "flow chart" Markov structure.
E.g. mortality. Age is a deterministic process, but imagine that the human body goes from physical age \(0, 1, 2, \dots\) at random speed.
("Coxian distribution")
S. Asmussen (2003), Applied Probability and Queues, 2nd Edition, Springer
Can make a phase-type look like a constant value
Closure under addition, minimum, maximum
... and under conditioning
Matrix exponential
Density and tail
Moments
Laplace transform
Guaranteed Minimum Death Benefit
Equity-linked life insurance
High Water Death Benefit
The customer lives for years,
Equity is an exponential jump diffusion,
Bowers et al (1997), Actuarial Mathematics, 2nd Edition
Also, not easy to tell if any parameters produce a valid distribution
void rungekutta(int p, double *avector, double *gvector, double *bvector,
double **cmatrix, double dt, double h, double **T, double *t,
double **ka, double **kg, double **kb, double ***kc)
{
int i, j, k, m;
double eps, h2, sum;
i = dt/h;
h2 = dt/(i+1);
init_matrix(ka, 4, p);
init_matrix(kb, 4, p);
init_3dimmatrix(kc, 4, p, p);
if (kg != NULL)
init_matrix(kg, 4, p);
...
for (i=0; i < p; i++) {
avector[i] += (ka[0][i]+2*ka[1][i]+2*ka[2][i]+ka[3][i])/6;
bvector[i] += (kb[0][i]+2*kb[1][i]+2*kb[2][i]+kb[3][i])/6;
for (j=0; j < p; j++)
cmatrix[i][j] +=(kc[0][i][j]+2*kc[1][i][j]+2*kc[2][i][j]+kc[3][i][j])/6;
}
}
}
This function: 116 lines of C, built-in to Julia
Whole program: 1700 lines of C, 300 lines of Julia
# Run the ODE solver.
u0 = zeros(p*p)
pf = ParameterizedFunction(ode_observations!, fit)
prob = ODEProblem(pf, u0, (0.0, maximum(s.obs)))
sol = solve(prob, OwrenZen5())
https://github.com/Pat-Laub/EMpht.jl
Canonical form 1
using Pkg; Pkg.add("EMpht")
using EMpht
lt = EMpht.parse_settings("life_table.json")[1]
phCF200 = empht(lt, p=200, ph_structure="CanonicalForm1")
Observations:
Derivatives??
Hidden values:
\(B_i\) number of MC's starting in state \(i\)
\(Z_i\) total time spend in state \(i\)
\(N_{ij}\) number of transitions from state \(i\) to \(j\)
Latent values:
\(B_i\) number of MC's starting in state \(i\)
\(Z_i\) total time spend in state \(i\)
\(N_{ij}\) number of transitions from state \(i\) to \(j\)
EM algorithm:
Questions?
https://slides.com/plaub/phase-type-lecture