Dear listeRs;

I am hoping to provide myself the ability to interpolate mortality estimates within intervals for a range of conditions and ages. I have four mortality tables derived from the Society of Actuaries 2001 VBT tables that contains interval mortality rates by starting age and year of duration. I would like to flexibly interpolate using a large set (~4MM) of ages and conditions as input to small number (~300) of functions, but my toy implementations puzzle me when I examine them, and I cannot seem to store them properly. Say you start with a vector of qx's:

> qx = c(.001, .003, 0.005, 0.01, 0.03, 0.06, 0.12, 0.24,0.4, 0.8)
# Now convert to mortality
> mx <- 2*qx/(2-qx)
# And make a spline function
> mspline <- splinefun(mx)
# Works well.
> mspline(5.5)
# [1] 0.04466954
# Examine the spline function
> mspline
function (x, deriv = 0)
{
    deriv <- as.integer(deriv)
    if (deriv < 0 || deriv > 3)
        stop("'deriv' must be between 0 and 3")
    if (deriv > 0) {
        z0 <- double(z$n)
        z[c("y", "b", "c")] <- switch(deriv, list(y = z$b, b = 2 *
            z$c, c = 3 * z$d), list(y = 2 * z$c, b = 6 * z$d,
            c = z0), list(y = 6 * z$d, b = z0, c = z0))
        z[["d"]] <- z0
    }
    res <- .C("spline_eval", z$method, as.integer(length(x)),
        x = as.double(x), y = double(length(x)), z$n, z$x, z$y,
        z$b, z$c, z$d, PACKAGE = "stats")$y
    if (deriv > 0 && z$method == 2 && any(ind <- x <= z$x[1L]))
        res[ind] <- ifelse(deriv == 1, z$y[1L], 0)
    res
}
<environment: 0x218874878>

My first puzzlement is the lack of any evidence that this is particular to the data that was offered to splinefun. Is it all hidden within <environment: 0x218874878>? My plan had been to convert a set of about 300 rows of data into 300 spline functions that could be indexed in an array by gender, smoking status, and age.

Would I be able to create an array of such functions? Testing leaves me discouraged:

> spline.arr <- array( , dim= c(sex=2, smk=2, age = 65))
> str(spline.arr)
 logi [1:2, 1:2, 1:65] NA NA NA NA NA NA ..
# Now attempt to store one function in the first "cell":
> spline.arr[1,1,1] <- mspline
Error in spline.arr[1, 1, 1] <- mspline :
  number of items to replace is not a multiple of replacement length

From the help page for array I thought that the possibility of storing lists within arrays might mean that functions would "fit", but have I been too expansive in my thinking? Is there an incantation that would let me store a language object in an array. Lists appear to be similarly unable to accept a function as an element:

> spl.list <- list()
> spl.list[["M"]][["NS"]][["20"]] <- mspline
Error in spl.list[["M"]][["NS"]][["20"]] <- mspline :
  invalid type/length (closure/0) in vector allocation
> spl.list[["M"]][["NS"]][["20"]] <- 1  # no error

--
David Winsemius, MD
West Hartford, CT

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to