# [R] Possible to use array of spline functions for storing data?

David Winsemius dwinsemius at comcast.net
Sat Mar 6 17:01:30 CET 2010

```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)
#  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

```