Re: [R] Loop with string variable AND customizable "summary" output

From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
Date: Mon 29 Jan 2007 - 17:08:41 GMT

And yet one more. This one does not use eval but uses do.call, quote and bquote instead:

lapply(levels(CO2$Treatment), function(lev) do.call("lm",

     list(uptake ~ conc, quote(CO2), subset = bquote(Treatment == .(lev)))))

On 1/29/07, Gabor Grothendieck <ggrothendieck@gmail.com> wrote:
> In thinking about this a bit more here is an even shorter one yet it
> does show the level in the Call output. See ?bquote
>
> lapply(levels(CO2$Treatment), function(lev)
> eval(bquote(lm(uptake ~ conc, CO2, subset = Treatment == .(lev)))))
>
>
> On 1/29/07, Gabor Grothendieck <ggrothendieck@gmail.com> wrote:
> > Often you will find that if you arrange your data in a
> > desirable way in the first place everything becomes
> > easier. What you really want is a data frame such
> > as the last three columns of the builtin data frame
> > CO2 where Treatment corresponds to country and
> > the two numeric variables correspond to your y and x.
> >
> > Then its easy:
> >
> > lapply(levels(CO2$Treatment), function(lev)
> > lm(uptake ~ conc, CO2, subset = Treatment == lev))
> >
> > The only problem with the above is that the Call: in the
> > output does not really tell you which level of Treatment
> > is being used since it literally shows
> > "lm(uptake ~ conc, CO2, subset = Treatment == lev)"
> > each time. To get around substitute the value of lev in.
> > Because R uses delayed evaluation you also need to force the
> > evaluation of lev prior to substituting it in:
> >
> > lapply(levels(CO2$Treatment), function(lev) {
> > lev <- force(lev)
> > eval(substitute(lm(uptake ~ conc, CO2, subset = Treatment == lev)),
> > list(lev = lev))
> > })
> >
> >
> > Now if you really want to do it the way you specified originally
> > try this.
> >
> > Suppose we use attach to grab the variables
> > x1, x2, x3, x4, y1, y2, y3, y4 out of the builtin
> > anscombe data frame for purposes of getting
> > our hands on some sample data. In your case
> > the variables would already be in the workspace
> > so the attach is not needed.
> >
> > Then simply reconstruct the formula in fo. You
> > could simply use lm(fo) but then the Call: in the
> > output of lm would literally read lm(fo) so its
> > better to use do.call:
> >
> > # next line gives the variables x1, x2, x3, x4, y1, y2, y3, y4
> > # from the builtin ancombe data set.
> > # In your case such variables would already exist.
> > attach(anscombe)
> > lapply(1:4, function(i) {
> > ynm <- paste("y", i, sep = "")
> > xnm <- paste("x", i, sep = "")
> > fo <- as.formula(paste(ynm, "~", xnm))
> > do.call("lm", list(fo))
> > })
> > detach(anscombe)
> >
> > Or if all the variables have the same length you could use
> > a form such as ancombe in the first place:
> >
> > Actually this is not really a recommended way of
> > proceeding. You would be better off putting all
> > your variables in a data frame and using that.
> >
> > lapply(1:4, function(i) {
> > fo <- as.formula(paste(names(anscombe)[i+4], "~", names(anscombe)[i]))
> > do.call("lm", list(fo, data = quote(anscombe)))
> > })
> >
> > or
> >
> > lapply(1:4, function(i) {
> > fo <- y ~ x
> > fo[[2]] <- as.name(names(anscombe)[i+4])
> > fo[[3]] <- as.name(names(anscombe)[i])
> > do.call("lm", list(fo, data = quote(anscombe)))
> > })
> >
> >
> >
> > On 1/29/07, C.Rosa@lse.ac.uk <C.Rosa@lse.ac.uk> wrote:
> > > Dear All,
> > >
> > > I am using R for my research and I have two questions about it:
> > >
> > > 1) is it possible to create a loop using a string, instead of a numeric vector? I have in mind a specific problem:
> > >
> > > Suppose you have 2 countries: UK, and USA, one dependent (y) and one independent variable (y) for each country (vale a dire: yUK, xUK, yUSA, xUSA) and you want to run automatically the following regressions:
> > >
> > >
> > >
> > > for (i in c("UK","USA"))
> > >
> > > output{i}<-summary(lm(y{i} ~ x{i}))
> > >
> > >
> > >
> > > In other words, at the end I would like to have two objects as output: "outputUK" and "outputUSA", which contain respectively the results of the first and second regression (yUK on xUK and yUSA on xUSA).

> > >
> > >
> > >
> > > 2) in STATA there is a very nice code ("outreg") to display nicely (and as the user wants to) your regression results.
> > >
> > > Is there anything similar in R / R contributed packages? More precisely, I am thinking of something that is close in spirit to "summary" but it is also customizable. For example, suppose you want different Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 or a different format display (i.e. without "t value" column) implemented automatically (without manually editing it every time).
> > >
> > > In alternative, if I was able to see it, I could modify the source code of the function "summary", but I am not able to see its (line by line) code. Any idea?
> > >
> > > Or may be a customizable regression output already exists?
> > >
> > > Thanks really a lot!
> > >
> > > Carlo
> > >
> > > ______________________________________________
> > > R-help@stat.math.ethz.ch 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.
> > >
> >
>



R-help@stat.math.ethz.ch 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. Received on Tue Jan 30 04:28:31 2007

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Mon 29 Jan 2007 - 18:30:43 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.