[R] Running different Regressions using for loops

David Winsemius dwinsemius at comcast.net
Fri Sep 28 17:42:32 CEST 2012


On Sep 28, 2012, at 4:35 AM, Krunal Nanavati wrote:

> Ok...I am sorry for the misunderstanding....
> 
> what I am trying to do is....

Perhaps (and that is a really large 'perhaps'):

>>> lm.list2 <- list()
lm.means <- list()
>>> for(i in seq_along(pricemedia)){
>>>       regr <- paste(pricemedia[i], trendseason, sep = "+")
>>>       fmla <- paste(response, regr, sep = "~")
>>>       lm.list2[[i]] <- lm(as.formula(fmla), data = tryout2) }
           lm.means[[i]]  <- mean(lm.list2[[i]]$coefficients[c("Price1", "Media1")]
            }



> 
> When I run...this set of statements....the 1st regression to be run, will
> have Price 1, Media 1...as X variables....and in the second loop it will
> have Price 1 & Media 2 ....
> 
> So, what I was thinking is...if I can generate inside the for loop....the
> mean for Price 1 and Media 1 during the 1st loop....and then mean for
> Price 1 and Media 2 during the second loop...and so on...for all the 10
> regressions
> 
> 
> Is the method that I was trying appropriate...or is there a better method
> there...I am sorry for the earlier explanation, I hope this one makes it
> more understandable

One generally want ones methods to be determinate while allowing the results to be approximate.

Had you followed the posting guide a offered a reproducible example it would have been much more "understandable".


> 
> 
> Thanks for your time...and all the quick replies
> 
> 
> -----Original Message-----
> From: Rui Barradas [mailto:ruipbarradas at sapo.pt]
> Sent: 28 September 2012 16:49
> To: Krunal Nanavati
> Cc: David Winsemius; r-help at r-project.org
> Subject: Re: [R] Running different Regressions using for loops
> 
> Ok, if I'm understanding it well, you want the mean value of Price1,   ,
> Price5? I don't know if it makes any sense, the coefficients already are
> mean values, but see if this is it.
> 
> price.coef <- sapply(lm.list, function(x) coef(x)[2])
> mean(price.coef)
> 
> Rui Barradas
> Em 28-09-2012 12:07, Krunal Nanavati escreveu:
>> Hi,
>> 
>> Yes the thing that you provided...works fine....but probably I should
>> have asked for some other thing.
>> 
>> Here is what I am trying to do....
>> 
>> I am trying to get the mean of Price variable....so I am entering the
>> below function:
>> 
>>          mean(names(lm.list2[[2]]$coefficient[2] ))
>> 
>> but this gives me an error....
>> 
>> 	[1] NA
>> 	Warning message:
>> 	In mean.default(names(lm.list2[[2]]$coefficient[2])) :
>>   	argument is not numeric or logical: returning NA
>> 
>> I thought by getting the text from the list variable...will help me
>> generate the mean for that text...which is a variable in the
>> data...say Price 1, Media 2....and so on
>> 
>> Is this a proper approach...if it is...then something more needs to be
>> done with the function that you provided.
>> 
>> If not, is there a better way...to generate the mean of a particular
>> variable inside the " for loop " used earlier...given below:
>> 
>>> lm.list2 <- list()
>>> for(i in seq_along(pricemedia)){
>>>       regr <- paste(pricemedia[i], trendseason, sep = "+")
>>>       fmla <- paste(response, regr, sep = "~")
>>>       lm.list2[[i]] <- lm(as.formula(fmla), data = tryout2) }
>> 
>> 
>> 
>> Thanks & Regards,
>> 
>> Krunal Nanavati
>> 9769-919198
>> 
>> 
>> -----Original Message-----
>> From: Rui Barradas [mailto:ruipbarradas at sapo.pt]
>> Sent: 28 September 2012 16:02
>> To: Krunal Nanavati
>> Cc: David Winsemius; r-help at r-project.org
>> Subject: Re: [R] Running different Regressions using for loops
>> 
>> Hello,
>> 
>> Try
>> 
>> names(lm.list2[[2]]$coefficient[2] )
>> 
>> Rui Barradas
>> Em 28-09-2012 11:29, Krunal Nanavati escreveu:
>>> Ok...this solves a part of my problem
>>> 
>>> When I type   " lm.list2[2] " ...I get the following output
>>> 
>>> [[1]]
>>> 
>>> Call:
>>> lm(formula = as.formula(fmla), data = tryout2)
>>> 
>>> Coefficients:
>>> (Intercept)       Price2       Media1      Distri1        Trend
>>> Seasonality
>>>     13491232     -5759030        -1520        34370        48628
>>> 445351
>>> 
>>> 
>>> 
>>> 
>>> When I enter   " lm.list2[[2]]$coefficient[2] " it gives me the below
>>> output
>>> 
>>> Price2
>>> -5759030
>>> 
>>> And when I enter   " lm.list2[[2]]$coefficient[[2]] " ...I get the
>>> number...which is   -5759030
>>> 
>>> 
>>> I am looking out for a way to get just the  " Price2 "....is there a
>>> statement for that??
>>> 
>>> 
>>> 
>>> Thanks & Regards,
>>> 
>>> Krunal Nanavati
>>> 9769-919198
>>> 
>>> 
>>> -----Original Message-----
>>> From: Rui Barradas [mailto:ruipbarradas at sapo.pt]
>>> Sent: 28 September 2012 15:18
>>> To: Krunal Nanavati
>>> Cc: David Winsemius; r-help at r-project.org
>>> Subject: Re: [R] Running different Regressions using for loops
>>> 
>>> Hello,
>>> 
>>> To access list elements you need `[[`, like this:
>>> 
>>> summ.list[[2]]$coefficients
>>> 
>>> Or Use the extractor function,
>>> 
>>> coef(summ.list[[2]])
>>> 
>>> Rui Barradas
>>> Em 28-09-2012 07:23, Krunal Nanavati escreveu:
>>>> Hi Rui,
>>>> 
>>>> Excellent!!  This is what I was looking for. Thanks for the help.
>>>> 
>>>> So, now I have stored the result of the 10 regressions in
>>> "summ.list
>>>> <- lapply(lm.list2, summary)"
>>>> 
>>>> And now once I enter        " sum.list "....it gives me the output for
>>> all
>>>> the 10 regressions...
>>>> 
>>>> I wanted to access a beta coefficient of one of the
>>>> regressions....say "Price2+Media1+Trend+Seasonality"...the result of
>> which is stored in"
>>>> sum.list[2] "
>>>> 
>>>> I entered the below statement for accessing the Beta coefficient for
>>>> Price2...
>>>> 
>>>>> summ.list[2]$coefficients[2]
>>>> NULL
>>>> 
>>>> But this is giving me " NULL " as the output...
>>>> 
>>>> What I am looking for, is to access a beta value of a particular
>>>> variable from a particular regression output and use it for further
>>> analysis.
>>>> Can you please help me out with this. Greatly appreciate, you guys
>>>> efforts.
>>>> 
>>>> 
>>>> 
>>>> 
>>>> Thanks & Regards,
>>>> 
>>>> Krunal Nanavati
>>>> 9769-919198
>>>> 
>>>> -----Original Message-----
>>>> From: Rui Barradas [mailto:ruipbarradas at sapo.pt]
>>>> Sent: 27 September 2012 21:55
>>>> To: Krunal Nanavati
>>>> Cc: David Winsemius; r-help at r-project.org
>>>> Subject: Re: [R] Running different Regressions using for loops
>>>> 
>>>> Hello,
>>>> 
>>>> Inline.
>>>> Em 27-09-2012 13:52, Krunal Nanavati escreveu:
>>>>> Hi,
>>>>> 
>>>>> Thanks for all your help. I am stuck again, but with a new problem,
>>>>> on similar lines.
>>>>> 
>>>>> I have taken the problem to the next step now...i have now added 2
>>> "for"
>>>>> loops... 1 for the Price variable...and another for the Media
>>>>> variable
>>>>> 
>>>>> I have taken 5 price variables...and 2 media variables with the
>>>>> "trend and seasonality"(appearing in all of them)....so in all
>>>>> there will be
>>>>> 10 regression to run now
>>>>> 
>>>>> Price 1, Media 1
>>>>> 
>>>>> Price 1, Media 2
>>>>> 
>>>>> Price 2, Media 1'
>>>>> 
>>>>> Price 2, Media 2
>>>>> 
>>>>> ...and so on
>>>>> 
>>>>> I have built up a code for it...
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>>> tryout=read.table("C:\\Users\\Krunal\\Desktop\\R
>>>>> tryout.csv",header=T,sep=",")
>>>>>> cnames <- names(tryout)
>>>>>> price <- cnames[grep("Price", cnames)] media <-
>>>>>> cnames[grep("Media", cnames)] resp <- cnames[1] regr <-
>>>>>> cnames[7:8] lm.list <- vector("list", 10) for(i in 1:5)
>>>>> + {
>>>>> + regress <- paste(price[i], paste(regr, collapse = "+"), sep =
>>>>> + "+") for(j in 1:2) {
>>>>> + regress1 <- paste(media[j],regress,sep="+") fmla <- paste(resp,
>>>>> + regress1, sep = "~") lm.list[[i]] <- lm(as.formula(fmla), data =
>>>>> + tryout) } }
>>>>>> summ.list <- lapply(lm.list, summary) summ.list
>>>>> 
>>>>> 
>>>>> But it is only running...5 regressions...only Media 1 along with
>>>>> the
>>>>> 5 Price variables & Trend & Seasonality is regressed on
>>>>> Volume...giving only
>>>>> 5 outputs
>>>>> 
>>>>> I feel there is something wrong with the    " lm.list[[i]] <-
>>>>> lm(as.formula(fmla), data = tryout)"   statement.
>>>> No, I don't think so. If it's giving you only 5 outputs the error is
>>>> probably in the fmla construction. Put print statements to see the
>>>> results of those paste() instructions.
>>>> 
>>>> Supposing your data.frame is now called tryout2,
>>>> 
>>>> 
>>>> price <- paste("Price", 1:5, sep = "") media <- paste("Media", 1:2,
>>>> sep = "") pricemedia <- apply(expand.grid(price, media,
>>>> stringsAsFactors = FALSE), 1, paste, collapse="+")
>>>> 
>>>> response <- "Volume"
>>>> trendseason <- "Trend+Seasonality"  # do this only once
>>>> 
>>>> lm.list2 <- list()
>>>> for(i in seq_along(pricemedia)){
>>>>        regr <- paste(pricemedia[i], trendseason, sep = "+")
>>>>        fmla <- paste(response, regr, sep = "~")
>>>>        lm.list2[[i]] <- lm(as.formula(fmla), data = tryout2) }
>>>> 
>>>> The trick is to use ?expand.grid
>>>> 
>>>> Hope this helps,
>>>> 
>>>> Rui Barradas
>>>> 
>>>>>     I am not sure about its
>>>>> placement...whether it should be in loop 2 or in loop 1
>>>>> 
>>>>> Can you please help me out??
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> Thanks & Regards,
>>>>> 
>>>>> Krunal Nanavati
>>>>> 9769-919198
>>>>> 
>>>>> -----Original Message-----
>>>>> From: Rui Barradas [mailto:ruipbarradas at sapo.pt]
>>>>> Sent: 27 September 2012 16:22
>>>>> To: David Winsemius
>>>>> Cc: Krunal Nanavati; r-help at r-project.org
>>>>> Subject: Re: [R] Running different Regressions using for loops
>>>>> 
>>>>> Hello,
>>>>> 
>>>>> Just to add that you can also
>>>>> 
>>>>> lapply(lm.list, coef)
>>>>> 
>>>>> with a different output.
>>>>> 
>>>>> Rui Barradas
>>>>> Em 27-09-2012 09:24, David Winsemius escreveu:
>>>>>> On Sep 26, 2012, at 10:31 PM, Krunal Nanavati wrote:
>>>>>> 
>>>>>>> Dear Rui,
>>>>>>> 
>>>>>>> Thanks for your time.
>>>>>>> 
>>>>>>> I have a question though, when I run the 5 regression, whose
>>>>>>> outputs are stored in "lm.list[i]", I only get the coefficients
>>>>>>> for the Intercept, Price, Trend & Seasonality as below
>>>>>>> 
>>>>>>> 
>>>>>>>> lm.list[1]
>>>>>>> [[1]]
>>>>>>> 
>>>>>>> Call:
>>>>>>> 
>>>>>>> lm(formula = as.formula(fmla), data = tryout)
>>>>>>> 
>>>>>>> Coefficients:
>>>>>>> 
>>>>>>> (Intercept)       Price4        Trend  Seasonality
>>>>>>> 
>>>>>>>        9923123     -2606826        64616       551392
>>>>>> summ.list <- lapply(lm.list, summary) coef.list <-
>>>>>> lapply(summ.list,
>>>>>> coef) coef.list
>>>>>> 
>>>>>>> I am also looking out for t stats and p value and R squared.
>>>>>> For the r.squared
>>>>>> 
>>>>>> rsq.vec <- sapply(summ.list, "$", "r.squared") adj.rsq <-
>>>>>> sapply(summ.list, "$", "adj.r.squared")
>>>>>> 
>>>>>>> Do you know,
>>>>>>> how can I get all these statistics. Also, why is " as.formula "
>>>>>>> used in the lm function. It should work without that as well,
> right?
>>>>>> No.
>>>>>>> Can you please tell me, why the code that I had written, does not
>>>>>>> work with R. I thought it should work perfectly.
>>>>>> In R there is a difference between expression objects and
>>>>>> character
>>>>> objects.
>>>>>>> Thanks & Regards,
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> Krunal Nanavati
>>>>>>> 
>>>>>>> 9769-919198
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> *From:* Rui Barradas [mailto:ruipbarradas at sapo.pt]
>>>>>>> *Sent:* 26 September 2012 17:13
>>>>>>> *To:* Krunal Nanavati
>>>>>>> *Cc:* r-help at r-project.org
>>>>>>> *Subject:* Re: [R] Running different Regressions using for loops
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> Hello,
>>>>>>> 
>>>>>>> Try the following.
>>>>>>> 
>>>>>>> 
>>>>>>> #cnames <- names(tryout)  # in your code, use this one cnames <-
>>>>>>> c("Volume", "Price1", "Price2", "Price3", "Price4", "Price5",
>>>>>>> "Trend", "Seasonaliy")
>>>>>>> 
>>>>>>> price <- cnames[grep("Price", cnames)] resp <- cnames[1] regr <-
>>>>>>> cnames[7:8]
>>>>>>> 
>>>>>>> #lm.list <- vector("list", 5)
>>>>>>> for(i in 1:5){
>>>>>>>        regress <- paste(price[i], paste(regr, collapse = "+"),
>>>>>>> sep =
>>>> "+")
>>>>>>>        fmla <- paste(resp, regress, sep = "~")
>>>>>>>        print(fmla)
>>>>>>>        #lm.list[[i]] <- lm(as.formula(fmla), data = tryout) }
>>>>>>> 
>>>>>>> Hope this helps,
>>>>>>> 
>>>>>>> Rui Barradas
>>>>>>> 
>>>>>>> Em 26-09-2012 08:08, Krunal Nanavati escreveu:
>>>>>>> 
>>>>>>> Hi,
>>>>>>> 
>>>>>>> 
>>>>>>> I am trying to run many different regressions using a FOR Loop.
>>>>>>> 
>>>>>>> 
>>>>>>> The input data that is read into R has the following variables
>>>>>>> 
>>>>>>> .         Volume
>>>>>>> .         Price2
>>>>>>> .         Price3
>>>>>>> .         Price4
>>>>>>> .         Price5
>>>>>>> .         Trend
>>>>>>> .         Seasonality
>>>>>>> 
>>>>>>> I want to run 5 regressions, with the Volume as an dependent
>>>>>>> variable and
>>>>>>> 
>>>>>>> Price, Trend & Seasonality as independent variables. I have read
>>>>>>> the above
>>>>>>> 
>>>>>>> mentioned variables in a variable called "tryout"
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> I am entering the following syntax in R
>>>>>>> 
>>>>>>> 
>>>>>>> for(i in 1:5)
>>>>>>> 
>>>>>>> + {
>>>>>>> + result[i]=lm(Volume~Price[i]+Trend+Seasonaliy,data=tryout)
>>>>>>> + summary(result[i])
>>>>>>> + }
>>>>>>> 
>>>>>>> After running these lines.I am getting the following error
>>>>>>> message Error in eval(expr, envir, enclos) : object 'Price' not
>>>>>>> found
>>>>>>> 
>>>>>>> Can someone help me out with this error message. Appreciate for
>>>>>>> your time
>>>>>>> 
>>>>>>> and consideration.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>      [[alternative HTML version deleted]]
>>>>>>> 
>>>>>>> 
>>>>>> David Winsemius, MD
>>>>>> Alameda, CA, USA
>>>>>> 

David Winsemius, MD
Alameda, CA, USA




More information about the R-help mailing list