[R] R: LIST function and LOOPS
Uwe Ligges
ligges at statistik.uni-dortmund.de
Sat Mar 12 15:27:33 CET 2005
Clark Allan wrote:
> 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?
Why do you want to set.seed() inside the loop?
Just set it once at the beginning of your simulation in order to get
reproducible results - you can assume independence anyway.
Or maybe I am missing the point why you are going to set.seed() inside
the loop.
Uwe Ligges
>
> 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 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
More information about the R-help
mailing list