Andrew Crane-Droesch
2013-Oct-26 08:33 UTC
[R] Inscrutable error message in mgcv: 1> prediction = predict(MI, se.fit=TRUE, newdata=rhc), Error in if (object$inter) X[[i]] <- PredictMat(object$margin[[i]], dat, : , argument is of length zero
Dear List, I am trying to reproduce a figure that I made for an analysis that I did a few months ago. Between when I first made the figure and now, I've upgraded to R 3.0.2 and upgraded my operating system (ubuntu 13.04). My codebase, which once works, is throwing an error when I try to use predict.gam on a model object that I saved: 1> prediction = predict(MI,se.fit=TRUE,newdata=rhc) Error in if (object$inter) X[[i]] <- PredictMat(object$margin[[i]], dat, : argument is of length zero traceback() gives me the following: 1> traceback() 6: Predict.matrix.tensor.smooth(object, dk$data) 5: Predict.matrix(object, dk$data) 4: Predict.matrix3(object, data) 3: PredictMat(object$smooth[[k]], data) 2: predict.gam(MI, se.fit = TRUE, newdata = rhc) 1: predict(MI, se.fit = TRUE, newdata = rhc) the final function being called looks like this: 1> Predict.matrix.tensor.smooth function (object, data) { m <- length(object$margin) X <- list() for (i in 1:m) { term <- object$margin[[i]]$term dat <- list() for (j in 1:length(term)) dat[[term[j]]] <- data[[term[j]]] if (object$inter) X[[i]] <- PredictMat(object$margin[[i]], dat, n = length(dat[[1]])) else X[[i]] <- Predict.matrix(object$margin[[i]], dat) } mxp <- length(object$XP) if (mxp > 0) for (i in 1:mxp) if (!is.null(object$XP[[i]])) X[[i]] <- X[[i]] %*% object$XP[[i]] T <- tensor.prod.model.matrix(X) T } Unfortunately, I can't say that I understand how that function is working, beyond that it takes a fitted model object and makes a piece of the model matrix. Any ideas about what this could stem from? Where to start looking to fix it? I could probably do the entire analysis from scratch, but it is quite complex and I'd prefer to save the time. Apologies for non-reproducible code -- the data is big and the script is long. Thanks for any assistance, Andrew
Simon Wood
2013-Oct-29 17:19 UTC
[R] Inscrutable error message in mgcv: 1> prediction = predict(MI, se.fit=TRUE, newdata=rhc), Error in if (object$inter) X[[i]] <- PredictMat(object$margin[[i]], dat, : , argument is of length zero
Sorry, this relates to ?"mgcv-FAQ" number 5, unfortunately. 'ti' terms were introduced as a much better and cleaner way of allowing smooth main effects and interactions where the interactions are based on 'te' terms: this required some re-engineering of the tensor product smooth objects (the offending 'iter' element of the smooth is how 'ti' terms are distinguished from normal 'te' terms internally). I'm afraid this won't work in the current mgcv without re-fitting the original model. Simon On 26/10/13 10:33, Andrew Crane-Droesch wrote:> Dear List, > > I am trying to reproduce a figure that I made for an analysis that I did > a few months ago. Between when I first made the figure and now, I've > upgraded to R 3.0.2 and upgraded my operating system (ubuntu 13.04). My > codebase, which once works, is throwing an error when I try to use > predict.gam on a model object that I saved: > > 1> prediction = predict(MI,se.fit=TRUE,newdata=rhc) > Error in if (object$inter) X[[i]] <- PredictMat(object$margin[[i]], dat, : > argument is of length zero > > traceback() gives me the following: > > 1> traceback() > 6: Predict.matrix.tensor.smooth(object, dk$data) > 5: Predict.matrix(object, dk$data) > 4: Predict.matrix3(object, data) > 3: PredictMat(object$smooth[[k]], data) > 2: predict.gam(MI, se.fit = TRUE, newdata = rhc) > 1: predict(MI, se.fit = TRUE, newdata = rhc) > > the final function being called looks like this: > > 1> Predict.matrix.tensor.smooth > function (object, data) > { > m <- length(object$margin) > X <- list() > for (i in 1:m) { > term <- object$margin[[i]]$term > dat <- list() > for (j in 1:length(term)) dat[[term[j]]] <- data[[term[j]]] > if (object$inter) > X[[i]] <- PredictMat(object$margin[[i]], dat, n > length(dat[[1]])) > else X[[i]] <- Predict.matrix(object$margin[[i]], dat) > } > mxp <- length(object$XP) > if (mxp > 0) > for (i in 1:mxp) if (!is.null(object$XP[[i]])) > X[[i]] <- X[[i]] %*% object$XP[[i]] > T <- tensor.prod.model.matrix(X) > T > } > > Unfortunately, I can't say that I understand how that function is > working, beyond that it takes a fitted model object and makes a piece of > the model matrix. > > Any ideas about what this could stem from? Where to start looking to > fix it? I could probably do the entire analysis from scratch, but it is > quite complex and I'd prefer to save the time. > > Apologies for non-reproducible code -- the data is big and the script is > long. > > Thanks for any assistance, > Andrew > > ______________________________________________ > R-help at 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.-- Simon Wood, Mathematical Science, University of Bath BA2 7AY UK +44 (0)1225 386603 http://people.bath.ac.uk/sw283