Я пытаюсь использовать функцию pchip (Piecewise Cubic Hermite Interpolating Polynomial) в R, чтобы расширить сокращенную таблицу продолжительности жизни, чтобы заполнить одну в возрасте от 5 до 89 лет.
Я взял 1- (1-5qx) ^ (1/5) в качестве начального значения вероятности смерти для данной возрастной группы (x + 2,5) и интерполировал вероятности смерти для каждого года 1qx, используя функцию pchip. А затем пересчитал 5qx 'через интерполированный 1qx и сравнил их с исходным 5qx, чтобы увидеть, меньше ли разница между ними, чем указанный допуск (10E-6). Конечно, в первом вычислении указанный допуск не может быть соблюден, поэтому он требует итерации.
Итак, моя проблема: как обновить начальное значение для проведения последней итерации?
Я пробовал несколько методов, таких как прямая замена 5qx на 5qx 'и итерация дихотомии, но они не работали, и результаты не показали сходимости.
library(pracma)
x<-c(seq(5,89,5))
qx<-data.frame(age=x,qx=0)
qx$qx<-c(0.004932256,0.003830182,0.005361885,0.007037384,
0.008048729,0.009432151,0.012446146,0.018325698,0.028762825,0.046290573,
0.074888731,0.120306557,0.190086799,0.291948621,0.429340330,0.593503019,
0.752210246)
qx_inti<-data.frame(age=seq(7.5,87.5,5),qx=0) ## initial value
qx_com<-data.frame(age=seq(5,89,1),qx=0)## store interpolated 1qx
## store the recalculated 5qx' by interpolated 1qx
qx_abr<-data.frame(age=seq(5,85,5),qx=0)
for (i in 1:nrow(qx_inti)){
qx_inti$qx[i]=1-(1-qx$qx[i])^(1/5)
}
repeat {
fp<-pchipfun(xi=qx_inti$age,yi=qx_inti$qx)
qx_com$qx<-fp(seq(5,89,1))
qx_com$px=1-qx_com$qx
for (i in 1:nrow(qx_abr)){
product=1
for (j in (5*i-4):(5*i)){
product=product*qx_com$px[j]
}
qx_abr$qx[i]=1-product
}
if (max(abs(qx_abr$qx-qx$qx))<10e-6){
break
}
##updating qx_inti is needed
}
Я ожидаю, что подробный метод обновления начального значения будет соответствовать указанному допуску.