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

Gabor Grothendieck ggrothendieck at gmail.com
Mon Jan 29 17:57:47 CET 2007


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 at 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 at lse.ac.uk <C.Rosa at 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 at 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.
> >
>



More information about the R-help mailing list