Re: [R] R: LIST function and LOOPS

From: Clark Allan <Allan_at_STATS.uct.ac.za>
Date: Fri 11 Mar 2005 - 23:15:30 EST

hi

thanx for the help. i dont want to use matrices. i solve my problem, see the example below.

the set.seed is used because in my actual application i need to generate INDEPENDENT variables. will this ensure that the variables are independent?

z3<-function(w)
{
for (i in 1:w)
{
ss<-0

       for (j in 1:5)
       {
                set.seed(j+1+(i-1)*6)
                r<-rnorm(1)
        	ss<-ss+r
		a<-list(ss=ss,r=r)
       }

print(paste("############ i=",i,"############")) print(a)
}
}
z3(3)

> z3(3)

[1] "############ i= 1 ############"
$ss
[1] -2.213343

$r
[1] 0.269606

[1] "############ i= 2 ############"
$ss
[1] -2.904235

$r
[1] -1.480568

[1] "############ i= 3 ############"
$ss
[1] -0.01516304

$r
[1] 0.9264592

thanx again

***
allan

###############################################################################################
###############################################################################################
###############################################################################################
###############################################################################################
###############################################################################################
###############################################################################################


Adaikalavan Ramasamy wrote:
>
> You will need to capture the value of ss at the end of each 'i' as such
>
> z4 <-function(w){
>
> output <- numeric(w)
>
> for (i in 1:w){
>
> set.seed(i+6) # this is redundant line
> ss<-0
>
> for (j in 1:5){
> set.seed(j+1+(i-1)*6)
> r<-rnorm(1)
> ss<-ss+r
> }
>
> output[i] <- ss
> }
> return(output)
> }
>
> BTW, I do not think it is a good idea to set.seed() so many times.
>
> To answer you more general question, see if the following is useful.
> I am trying to simulate 'n' values from a standard normal distribution
> but 'n' is random variable itself.
>
> f <-function(w, lambda=3){
>
> tmp <- list(NULL)
>
> for (i in 1:w){
> n <- 1 + rpois(1, lambda=lambda) # number of simulation required
> tmp[[ i ]] <- rnorm(n)
> }
>
> # flatten the list into a ragged matrix
> out.lengths <- sapply(tmp, length)
> out <- matrix( nr=w, nc=max( out.lengths ) )
> rownames(out) <- paste("w =", 1:w)
> for(i in 1:w) out[i, 1:out.lengths[i] ] <- tmp[[i]]
>
> return(out)
> }
>
> f(6, lambda=3)
>
> It is not very elegant but I hope that helps you out somehow.
>
> Regards, Adai
>
> On Thu, 2005-03-10 at 10:16 +0200, Clark Allan wrote:
> > hi all
> >
> > another simple question.
> >
> > i've written a dummy program so that you get the concept. (the code
> > could be simplfied such that there are no loops. but lets leave the
> > loops in for now.)
> >
> > z1<-function(w)
> > {
> > for (i in 1:w)
> > {
> > set.seed(i+6)
> > ss<-0
> > for (j in 1:5)
> > {
> > set.seed(j+1+(i-1)*6)
> > r<-rnorm(1)
> > ss<-ss+r
> > }
> > list(ss=ss)
> > }
> > }
> > check.1<-z1(3)
> > check.1
> >
> > the results is:
> > $ss
> > [1] -0.01516304
> >
> >
> > what i want is something that looks like this:
> >
> > j=1
> > $ss
> > [1] -2.213343
> >
> > j=2
> > $ss
> > [1] -2.904235
> >
> > j=3
> > $ss
> > [1] -0.01516304
> >
> >
> > i know that i could use the print command. (see z2)
> >
> > z2<-function(w)
> > {
> > for (i in 1:w)
> > {
> > set.seed(i+6)
> > ss<-0
> > for (j in 1:5)
> > {
> > set.seed(j+1+(i-1)*6)
> > r<-rnorm(1)
> > ss<-ss+r
> > }
> > print(ss)
> > }
> > }
> > check.2<-z2(3)
> > check.2
> >
> > > check.2<-z2(3)
> > [1] -2.213343
> > [1] -2.904235
> > [1] -0.01516304
> > > check.2
> > [1] -0.01516304
> >
> > the problem with z2 is that only the last value is saved.
> >
> >
> > what i could do is use matrices like the following: (but i dont want to
> > do this AND WOULD PREFER TO USE list.)
> >
> > z3<-function(w)
> > {
> > results.<-matrix(nrow=w,ncol=1)
> > colnames(results.)<-c("ss")
> > for (i in 1:w)
> > {
> > set.seed(i+6)
> > ss<-0
> > for (j in 1:5)
> > {
> > set.seed(j+1+(i-1)*6)
> > r<-rnorm(1)
> > ss<-ss+r
> > }
> > results.[i,1]<-ss
> > }
> > results.
> > }
> > check.3<-z3(3)
> > check.3
> >
> > > check.3
> > ss
> > [1,] -2.21334260
> > [2,] -2.90423463
> > [3,] -0.01516304
> >
> > what if i have a new program (something different) and i want the
> > following:
> >
> > j=1
> > $a
> > 1
> > 2
> > 3
> >
> > $b
> > 1
> > 2
> > 3
> > 4
> > 5
> >
> > $c
> > 1
> >
> >
> > ###############
> > j=2
> > $a
> > 11
> > 21
> > 31
> >
> > $b
> > 11
> > 21
> > 31
> > 41
> > 51
> >
> > $c
> > 11
> >
> > ###############
> > j=3
> > $a
> > 21
> > 22
> > 32
> >
> > $b
> > 21
> > 22
> > 32
> > 42
> > 52
> >
> > $c
> > 21
> >
> > MATRICES SEEMS TO BE A GOOD WAY OF DOING THIS (but then you would have
> > to set up three matrices, one for a,b and c). BUT WHAT IF I WANT TO USE
> > THE LIST FUNCTION? i.e. there is a list in the first loop that i want to
> > display!
> >
> > sorry for the long mail.
> >
> > ***
> > ALLAN
> > ______________________________________________ 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



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 Received on Mon Mar 14 10:34:14 2005

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:30:47 EST