[R] R help on loops

Laz lmramba at ufl.edu
Fri Jun 7 11:39:36 CEST 2013


Dear Berend,

For reproducibility,
Rspatswap() is a function which originally returns a single value. For 
example Rspatswap(...)  and you get 0.8

So, run Rspatswap() 20 times and store all the values.
Then from these 20 values, calculate the calculate average, 
sd,se,min,max to get something similar to:

         average           sd           se       min      max
trace 0.8880286 0.0009178193 0.0004589096 0.8870152 0.889241

If we repeat the function 10 times, then I expect 10 rows with 5 columns but it does not work ?

I hope I am now clearer...







On 6/7/2013 5:24 AM, Berend Hasselman wrote:
> On 07-06-2013, at 10:59, Laz <lmramba at ufl.edu> wrote:
>
>> Dear R users,
>>
>> I am stuck here: My first function returns a vector of 5 values.
>> In my second function, I want to repeat this, a number of times, say 10
>> so that I have 10 rows and five columns but I keep on getting errors.
>>
>> See the code and results below:
>>
>> optm <-function(perm, verbose = FALSE)
>> {
>>    trace<-c()
>>    for (k in 1:perm){
>> trace[k]<-Rspatswap(rhox=0.6,rhoy=0.6,sigmasqG=0.081,SsqR=1)[1]
>>      perm[k]<-k
>>      mat<-cbind(trace, perm = seq(perm))
>>    }
>>    if (verbose){
>>      cat("***starting matrix\n")
>>      print(mat)
>>    }
>>    # iterate till done
>>    while(nrow(mat) > 1){
>>      high <- diff(mat[, 'trace']) > 0
>>      if (!any(high)) break  # done
>>      # find which one to delete
>>      delete <- which.max(high) + 1L
>>      mat <- mat[-delete, ]
>>      newmat<-apply(mat,2,mean)[1]
>>      sdm<-sd(mat[,1])
>>      sem<-sdm/sqrt(nrow(mat))
>>      maxv<-mat[1,1]
>>      minv<-mat[nrow(mat),1]
>>        }
>>    stats<-cbind(average=newmat,sd=sdm,se=sem,min=minv,max=maxv)
>>    stats
>> }
>>
>>> test<-optm(perm=20)
>>> test
>>          average           sd           se       min      max
>> trace 0.8880286 0.0009178193 0.0004589096 0.8870152 0.889241
>>
>>
>> itn<-function(it){
>> siml<-matrix(NA,ncol=5,nrow=length(it))
>>    for(g in 1:it){
>>     siml[g]<-optm(perm=20)
>>    }
>> siml<-cbind(siml=siml)
>> siml
>> }
>>
>>> ans<-itn(5)
>> Warning messages:
>> 1: In siml[g] <- optm(perm = 20) :
>>    number of items to replace is not a multiple of replacement length
>> 2: In siml[g] <- optm(perm = 20) :
>>    number of items to replace is not a multiple of replacement length
>> 3: In siml[g] <- optm(perm = 20) :
>>    number of items to replace is not a multiple of replacement length
>> 4: In siml[g] <- optm(perm = 20) :
>>    number of items to replace is not a multiple of replacement length
>> 5: In siml[g] <- optm(perm = 20) :
>>    number of items to replace is not a multiple of replacement length
>>> ans
>>            [,1]      [,2]      [,3]      [,4]      [,5]
>> [1,] 0.8874234 0.8861666 0.8880521 0.8870958 0.8876469
>>
>
> 1. Not reproducible code. Where does function Rspatswap come from?
>
> 2. You have several errors in function itn:
>      Argument it is a scalar: length(it) is 1. You need to do siml <- matrix(NA,ncol=5,nrow=it)
> Next in the g-loop you want to fill row g so do: siml[g,] <- …..
>
> Finally why are you doing siml <- cbind(siml=siml)?
> Seems superfluous to me. Delete the line.
>
> Berend
>
>



More information about the R-help mailing list