From d.rizopoulos at erasmusmc.nl  Tue May 21 13:19:18 2013
From: d.rizopoulos at erasmusmc.nl (D. Rizopoulos)
Date: Tue, 21 May 2013 11:19:18 +0000
Subject: [Rd] making makepredictcall() work
Message-ID: <7191AFC7255B4F49A30707E39BEAD05F3C5FFFA1@EXCH-RX03.erasmusmc.nl>

Dear All,

I'm interested in creating a function similar to ns() from package 
splines that can be passed in a model formula. The idea is to produce 
"safe" predictions from a model using this function. As I have seen, to 
do this I need to use makepredictcall(). Consider the following toy example:

myns <- function (x, df = NULL, knots = NULL, intercept = FALSE, 
Boundary.knots = range(x),
                    extraArg = 0) {
     ns.x <- if (is.null(knots)) {
         ns(x, df = df, intercept = intercept, Boundary.knots = 
Boundary.knots)
     } else {
         ns(x, knots = knots, intercept = intercept, Boundary.knots = 
Boundary.knots)
     }
     out <- ns.x + extraArg
     attr(out, "class") <- c("myns", "basis", "matrix")
     out
}

makepredictcall.myns <- function (var, call) {
     # based on splines:::makepredictcall.ns
     if (as.character(call)[1L] != "myns")
         return(call)
     at <- attributes(var)[c("knots", "Boundary.knots", "intercept", 
"extraArg")]
     xxx <- call[1L:2L]
     xxx[names(at)] <- at
     xxx
}

dd <- data.frame(y = rnorm(12))
terms(model.frame(terms(~ myns(y, df = 3, extraArg = 0.5)), data = dd))

As it can be seen, makepredictcall.myns() succeeds in correctly passing 
the knots and Boundary.knots from the original data in the "predvars" 
attribute of the terms objects but it does not work for the new argument 
'extraArg' I introduced in myns().

Any pointers on how to resolve this will be highly appreciated.

Thanks in advance.

Best,
Dimitris


-- 
Dimitris Rizopoulos
Assistant Professor
Department of Biostatistics
Erasmus University Medical Center

Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands
Tel: +31/(0)10/7043478
Fax: +31/(0)10/7043014
Web: http://www.erasmusmc.nl/biostatistiek/


[Rd] making makepredictcall() work
D. Rizopoulos