Hi, First let me say I am a big fan of R and appreciate all your time and effort. The update() function does not seem to work in a for loop. Consider the following: mdat <- matrix(c(1,2,3, 11,23,13, 12,4,8), nrow = 3, ncol=3, byrow=TRUE) reg <- lm(mdat[7:9]~1) for(i in 1:2) { reg <- update(reg,.~.+mdat[((i-1)*3 + 1):(i*3)]) #update reg twice } reg # reg should have two independent variables, but it only has one The update() function in conjunction with a for loop will only consider the last update, and not save all the previous ones. Is there a way around this? I appreciate your time. - Ben Godlove [[alternative HTML version deleted]]
Hello Ben, I believe the problem is not strictly update() in the for loop, but the formula being passed to update(). The value of "i" changes, but its symbol does not, so the second time through its like you overwrite the first. Here is one way around it that works for me: mdat <- matrix(c(1,2,3, 11,23,13, 12,4,8), nrow = 3, ncol=3, byrow=TRUE) reg <- lm(mdat[7:9]~1) for(i in 1:2) { x <- paste(". ~ . + mdat[", ((i-1)*3 + 1), ":", (i * 3), "]", sep ="") print(x) # just to see it reg <- update(reg, x) #update reg twice } reg I am guessing this is a simpler example of what you are really trying to do, but ff you are not interested in doing anything with reg between updates, you might consider just update()ing it once with the full model. Hope that helps, Josh P.S. I really tried to implement a suggestion for a better way to create formulae by Douglas Bates (see http://groups.google.com/group/ggplot2/msg/3169aee8708e5e0c? ), but was spectacularly unsuccessful. On Sat, Sep 18, 2010 at 9:30 AM, Benjamin Godlove <bgodlove at oberlin.edu> wrote:> Hi, > > First let me say I am a big fan of R and appreciate all your time and > effort. > > The update() function does not seem to work in a for loop. ?Consider the > following: > > mdat <- matrix(c(1,2,3, 11,23,13, 12,4,8), nrow = 3, ncol=3, byrow=TRUE) > reg <- lm(mdat[7:9]~1) > for(i in 1:2) { > reg <- update(reg,.~.+mdat[((i-1)*3 + 1):(i*3)]) #update reg twice > } > reg # reg should have two independent variables, but it only has one > > > > The update() function in conjunction with a for loop will only consider the > last update, and not save all the previous ones. ?Is there a way around > this? > > I appreciate your time. > > - Ben Godlove > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > 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. >-- Joshua Wiley Ph.D. Student, Health Psychology University of California, Los Angeles http://www.joshuawiley.com/
On 2010-09-18 13:14, Joshua Wiley wrote:> Hello Ben, > > I believe the problem is not strictly update() in the for loop, but > the formula being passed to update(). The value of "i" changes, but > its symbol does not, so the second time through its like you overwrite > the first. Here is one way around it that works for me: > > > mdat<- matrix(c(1,2,3, 11,23,13, 12,4,8), nrow = 3, ncol=3, byrow=TRUE) > reg<- lm(mdat[7:9]~1) > for(i in 1:2) { > x<- paste(". ~ . + mdat[", ((i-1)*3 + 1), ":", (i * 3), "]", sep ="") > print(x) # just to see it > reg<- update(reg, x) #update reg twice > } > reg > > > I am guessing this is a simpler example of what you are really trying > to do, but ff you are not interested in doing anything with reg > between updates, you might consider just update()ing it once with the > full model. > > Hope that helps, > > Josh > > P.S. I really tried to implement a suggestion for a better way to > create formulae by Douglas Bates (see > http://groups.google.com/group/ggplot2/msg/3169aee8708e5e0c? ), but > was spectacularly unsuccessful.Ben is making strange use of mdat in lm(); I would use a data frame. At least, we should name the columns. mdat <- matrix(c(1,2,3, 11,23,13, 12,4,8), nrow = 3, ncol=3, byrow=TRUE) colnames(mdat) <- paste("x", 1:3, sep="") dat <- as.data.frame(mdat) Then see if the following gives a suitable hint: reg <- lm(x3 ~ 1, data = dat) ## or: reg <- lm(mdat[,"x3"] ~ 1) (fo <- formula(reg)) for(i in 1:2) { x <- as.name(colnames(dat)[i]) fo <- update(fo, bquote(~ . + .(x))) print(fo) } (using update.formula() as illustration) -Peter Ehlers> > On Sat, Sep 18, 2010 at 9:30 AM, Benjamin Godlove<bgodlove at oberlin.edu> wrote: >> Hi, >> >> First let me say I am a big fan of R and appreciate all your time and >> effort. >> >> The update() function does not seem to work in a for loop. Consider the >> following: >> >> mdat<- matrix(c(1,2,3, 11,23,13, 12,4,8), nrow = 3, ncol=3, byrow=TRUE) >> reg<- lm(mdat[7:9]~1) >> for(i in 1:2) { >> reg<- update(reg,.~.+mdat[((i-1)*3 + 1):(i*3)]) #update reg twice >> } >> reg # reg should have two independent variables, but it only has one >> >> >> >> The update() function in conjunction with a for loop will only consider the >> last update, and not save all the previous ones. Is there a way around >> this? >> >> I appreciate your time. >> >> - Ben Godlove >> >> [[alternative HTML version deleted]] >>