multivariate smoothing and gradient estimation
On Wed, 2009-09-16 at 14:10 -0700, Chris Martin wrote:
Dear list members, I am a looking for a function that can calculate a "surface" from at least four predictor variables and one response variable. I would then like to calculate the first derivative of a specific point on this surface. I have looked at many packages for nonparametric smoothing and kernel density estimation but have been unable to find any that fulfill both these criteria. For example, loess can handle multivariate data, but I do not how to extract the derivative from the resulting fit? Many smoothing splines offer predict functions to extract the derivative, but these functions can only handle univariate data (e.g. smooth.spline). Ideally, I would like to use local estimates of the surface (i.e. loess).
Depending upon how many observations you have (i.e. not very large numbers) you could estimate this model using mgcv::gam which allows multivariate smooths. You can then compute the derivatives for this smooth using finite differences using the predict.gam method as a basis from which to work (using type = "lpmatrix"). The trick is to get the bits from the model that you need. This code snippet uses data from the semiPar package. I produced the script as I was reading the text that semiPar is support for. Simon Wood, author of the mgcv package, kindly helped me with the code to compute the derivatives: ## Example from Ruppert, Wand and Carroll 2003 pp 156-8 ## Semiparametric regression ## Cambridge University Press ## ## Data for the strontium example are in package SemiPar, support ## software for the book above. require(SemiPar) require(mgcv) # '` require(nlme) ## load the Strontium data data(fossil) mod1 <- gamm(strontium.ratio ~ s(age), data = fossil) ## Compute derivatives ############################################### ## where to evaluate derivatives x.age <- with(fossil, seq(min(age), max(age), length = 200)) newd <- data.frame(age = x.age) X0 <- predict(mod1$gam, newd, type = "lpmatrix") eps <- 1e-7 ## finite difference interval x.age <- x.age + eps ## shift the evaluation points newd <- data.frame(age = x.age) X1 <- predict(mod1$gam, newd, type = "lpmatrix") Xp <- (X1 - X0) / eps ## maps coefficients to (fd approx.) derivatives colnames(Xp) Xi <- Xp*0 Xi[, 2:10] <- Xp[,2:10] ## Xi\%*\%coef(b) = smooth deriv i ## you'll need to change 2:10 in the above to match the cols for your ## smoother ## ith smooth derivative df <- Xi %*% coef(mod1$gam) ## cheap diag(Xi\%*\%b$Vp\%*\%t(Xi))^.5 df.sd <- rowSums(Xi %*% mod1$gam$Vp * Xi)^.5 ## SE of deriv I haven't used this approach to compute the derivatives of a multivariate smooth, but it should work as long as you can identify the columns of X0 and X1 that arise from predict.gam. HTH G
I would appreciate any suitable functions or advice on where to look for functions that fulfill both these criteria. Thank you very much for your time. best wishes, Chris Martin Population Biology Graduate Group '12 University of California, Davis [[alternative HTML version deleted]]
_______________________________________________ R-sig-ecology mailing list R-sig-ecology at r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-ecology
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~% Dr. Gavin Simpson [t] +44 (0)20 7679 0522 ECRC, UCL Geography, [f] +44 (0)20 7679 0565 Pearson Building, [e] gavin.simpsonATNOSPAMucl.ac.uk Gower Street, London [w] http://www.ucl.ac.uk/~ucfagls/ UK. WC1E 6BT. [w] http://www.freshwaters.org.uk %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%