Hey!
I have a project that involves estimating parameters for a Lee_Carter model (mx = exp(ax + bx *kt)). The aim is to predict future values of Life expectancy at birth (e0) without having the Kt parameter, my instructor told me I could use the optimx package to minimize e0_estimated - e0_expert (that I have values for), I first started to look for an equation for e0_estmated starting from the generic Lee_Carter Model which is why I've computed various conversions.
Whenever I run the optimization process using optimx, I keep getting an error message that says:
"Error in optimx.check(par, optcfg$ufn, optcfg$ugr, optcfg$uhess, lower, : Cannot evaluate function at initial parameters."
here's a shortened version of the code I'm working with
# Shortened matrices ax et bx
ax <- c(-4.3198094, -5.8995814, -6.1240039, -7.0870399, -7.0525417)
bx <- c(0.04522097, 0.02488256, 0.02452534, -3.2110186, -3.0955417)
data <- data.frame(
DATE = as.Date(c("2019-01-01", "2020-01-01", "2021-01-01", "2022-01-01", "2023-01-01")),
LE = matrix(c(77.76000, 77.05507, 76.34821, 75.64329, 74.93836), ncol = 1)
)
e0_expert <- data$LE
# Convert mx to qx
convert1 <- function(mx, qx, ax, bx, kt) {
mx <- exp(ax + kt * bx)
qx <- (2 * mx) / (2 + mx)
return(qx)
}
# Calculate lx using qx
calculate_lx <- function(qx, l0 = 10000) {
n <- length(qx)
lx <- numeric(n)
lx[1] <- l0
lx[2] <- l0 * (1 - qx[1])
for (i in 2:n) {
lx[i] <- lx[i - 1] * (1 - qx[i - 1])
}
return(lx)
}
# Convert lx to dx
calculate_dx <- function(dx, lx) {
d0 <- l0 - lx[2]
n <- length(lx)
dx <- numeric(n)
dx[1] <- d0
for (i in 2:(n-1)) {
dx[i] <- lx[i] - lx[i+1]
}
return(dx)
}
# Convert dx to Lx
calculate_Lx <- function(Lx, dx) {
L0 <- d0 * lx[2] + 0.5
n <- length(dx)
Lx <- numeric(n)
Lx[1] <- L0
for (i in 2:n-1){
Lx[i] <- dx[i] * lx[i+1] + 0.5
}
return(Lx)
}
# Convert qx to ex
convert2 <- function(Lx, lx, ex) {
n <- length(Lx)
ex <- numeric(n)
ex <- sum(Lx) / lx
e0_estime <- ex[1]
return(e0_estime)
}
# Function to calculate the difference between the estimation and the projection
calculate_error <- function(kt, e0_expert, ax, bx) {
e0_estime <- convert2(Lx, lx, e0_estime)
error <- e0_estime - e0_expert
error_value <- sum(error^2)
cat("Error:", error_value, "\n")
if (error_value < 50) {
cat("Converged to a solution: kt =", kt, "Error =", error_value, "\n")
}
return(error_value)
}
# Perform optimization using the defined function and parameters
result <- optimx(
par = c(72.047557, 70.373062, 66.536728, 63.807676, 58.721023),
fn = calculate_error,
e0_expert = e0_expert,
ax = ax,
bx = bx,
method = "Nelder-Mead",
control = list(trace = 2, maxit = 1000, abstol = 1e-100, minimize = TRUE)
)
# kt optimal
optimal_kt <- result$par
cat("Optimal_kt:", optimal_kt, "\n")
I've tried various approaches to troubleshoot this error, but it's been persisting, impeding my progress, and I have no idea where the problem may lie (i'm quite new to R, might explain why)