[R] problem using do.call and substitute for predict.glm using poly()
Gavin Simpson
gavin.simpson at ucl.ac.uk
Mon Oct 27 20:27:23 CET 2003
Dear List,
I think I have found the source of my problem in a reply from Thomas
Lumley to a previous question on R-Help:
http://www.r-project.org/nocvs/mail/r-help/2002/0586.html
My code is not working because substitute() does not substitute formal
arguments to functions, and I guess the first X in data.frame(X =
predData$X) is a formal argument to data.frame().
The recommended options are to use formals() or parse(deparse()) to
achieve the required effect, but here I get a somewhat stuck.
I was wondering if anyone on the list could show my how to modify my
existing code:
pAsgn <- paste("predList[[i]][[n]] <- try(predict(resList$Y$X, newdata
= data.frame(X = predData$X), type = 'response', se = TRUE))")
pAsgn <- parse(text = pAsgn)[[1]]
for (i in namY) {
for (n in namX) {
TAsgn <- do.call("substitute", list(pAsgn, list(n = n, i = i, X
= as.name(n), Y = as.name(i))))
eval(TAsgn)
}
}
so that data.frame(X = predData$X) is replaced with the value of X such
that the output from do.call in the loop is something like:
predList[["Acr.harp"]][["Alk1"]] <- try(predict(resList$Acr.harp$Alk1,
newdata = data.frame(Alk1 = predData$Alk1), type = "response",
se = TRUE))
If anyone could point me in the right direction it would be most
appreciated.
All the best
Gav
Gavin Simpson wrote:
> Hi
>
> I am having a particular problem with some glm models I am running. I
> have been adapting code from Bill Venables 'Programmers niche' in RNews
> Vol 2/2 to fit ca. 1000 glm models to a combination of species 0/1 data
> (as Y) and related physicochemical data (X), to automate the process of
> fitting this many models. I have successfully managed to fit all the
> models and have stored the results in a list, each list has 47 main
> 'branches' (one for each species) and each branch has 23 'leaves' that
> each contain a glm object
>
> But R throws up the following error:
>
> Error in poly(Alk1, degree = 2, coefs = structure(list(alpha =
> c(37.7515662650602, :
> Object "Alk1" not found
>
> When trying to evaluate the following code:
>
> pAsgn <- paste("predList[[i]][[n]] <- try(predict(resList$Y$X, newdata
> = data.frame(X = predData$X), type = 'response', se = TRUE))")
> pAsgn <- parse(text = pAsgn)[[1]]
> for (i in namY) {
> for (n in namX) {
> TAsgn <- do.call("substitute", list(pAsgn, list(n = n, i = i,
> X = as.name(n), Y = as.name(i))))
> eval(TAsgn)
> }
> }
>
> Alk1 is used above as an example, all 23 predictors are 'not found'
> depending on which part of the loop I'm in. Investigation of the
> predList object after this has run shows for example:
>
> $Unk.nown$NCR
> [1] "Error in poly(NCR, degree = 2, coefs = structure(list(alpha =
> c(218.156626506024, : \n Object \"NCR\" not found\n"
> attr(,"class")
> [1] "try-error"
>
> pAsgn contains a parsed R expression:
>
> predList[[i]][[n]] <- try(predict(resList$Y$X, newdata = data.frame(X
> = predData$X), type = "response", se = TRUE))
>
> I think I have narrowed the problem down to the fact that the first X in
> newdata = data.frame(X = predData$X)... is not being substitute with the
> variable in question, where as all the other X and Y's are being
> substituted:
> (n and i would be supplied by for loops (see above) so I have
> substituted two values below as if they had been in the loop)
>
> > do.call("substitute", list(pAsgn, list(n = namX[1], i = namY[1], X
> = as.name(n), Y = as.name(i))))
> predList[["Acr.harp"]][["Alk1"]] <- try(predict(resList$Unk.nown$NCR,
> newdata = data.frame(X = predData$NCR), type = "response",
> se = TRUE)) ^^^^^^ problem here
>
> If i supply the values I want for one of the runs, such as:
>
> > predList[[1]][[1]] <- try(predict(resList$Acr.harp$Alk1, newdata =
> data.frame(Alk1 = predData$Alk1), type = "response", se = TRUE))
>
> Then this works, so the question is, how to I get X to be substituted in
> the above call? Perhaps this is not the cause of the error, so if anyone
> else has other suggestions.
>
> Thank you for help.
>
> Gav
>
> ps: version
> platform i386-pc-mingw32
> arch i386
> os mingw32
> system i386, mingw32
> status
> major 1
> minor 8.0
> year 2003
> month 10
> day 08
> language R
--
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
Gavin Simpson [T] +44 (0)20 7679 5522
ENSIS Research Fellow [F] +44 (0)20 7679 7565
ENSIS Ltd. & ECRC [E] gavin.simpson at ucl.ac.uk
UCL Department of Geography [W] http://www.ucl.ac.uk/~ucfagls/cv/
26 Bedford Way [W] http://www.ucl.ac.uk/~ucfagls/
London. WC1H 0AP.
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
More information about the R-help
mailing list