Skip to content

loop question

2 messages · Thomas Friedrichsmeier, Joshua Wiley

#
Dear all,

I am trying to set up a list with 1:c objects each meant to capture the 
coefficients for one coefficient and 100 replications. I receive the 
following error message:

Error in betaboot[[p]] : subscript out of bounds.

My code is below. Where is my mistake?

Many thanks,

Thomas

_________________________________
betaboot<-list(NULL)

for (i in 1:c) {
betaboot[[i]]<-cbind()
}


num <- 100 # this is the number of bootstraps

for (i in 1:num) {

     [BOOTSTRAP]

   coef.temp <- coef(model.temp, data=newdata)

   for (p in 1:c){
   betaboot[[p]] <- cbind(betaboot[[p]], coef.temp[,p])
   }

   }
#
Dear Thomas,
On Tue, Apr 5, 2011 at 8:33 AM, Thomas <thomas.triebs at cantab.net> wrote:
if you know the number of bootstraps (which you seem to later on), a
preferred way to instatiate the list would be:

betaboot <- vector(mode = "list", length = yourlength)
because "c()" is such an important function, I would strongly
encourage you not to use it also as a variable.
Don't use this to build an empty list.
This should work assuming betaboot is instatiated properly.  That
said, it looks like you have a nested for loop and then just keep
cbind()ing each element of betaboot bigger and bigger.  You may get a
performance increase if you also instantiate each matrix/dataframe
inside betaboot.  Then the call would become something like:

betaboot[[i]][,p] <- coef.temp[,p]

that is, you can use a chained series of extraction operators to get
to the appropriate column in the matrix/dataframe inside the
appropriate list element.  Then rather than constantly using cbind(),
you just place coef.temp[,p] where you want it.  The only requirement
is that you know the sizes of the matrices/dataframes going in so you
can create empty ones from the get go.

Cheers,

Josh