David Winsemius
2010-Mar-06 16:01 UTC
[R] Possible to use array of spline functions for storing data?
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
Dieter Menne
2010-Mar-06 16:41 UTC
[R] Possible to use array of spline functions for storing data?
David Winsemius wrote:> > 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: > .... >How about using the polynomial representation given be polySpline in package splines? It a slightly decorated list of knots and coefficients that could be stored in a database. Dieter -- View this message in context: http://n4.nabble.com/Possible-to-use-array-of-spline-functions-for-storing-data-tp1582896p1582914.html Sent from the R help mailing list archive at Nabble.com.