I did take your advice and change a few things in it to help it run.  After
reading through your earlier reply again I understood exactly what you were
saying, so I did apply it in my function too.  Thanks for all the advice! I
appreciate it!

Adrienne

On Fri, Aug 13, 2010 at 3:29 AM, Petr PIKAL <petr.pi...@precheza.cz> wrote:

> Hi
>
> wootten.adrie...@gmail.com napsal dne 12.08.2010 14:15:30:
>
> > Not quite what I was trying to say.  The process generates a random
> uniform
> > number between 0 and 1 and compares to a specific conditional
> probability.  It
> > is looking for this in particular:
> >
> > random number < Pr( rain(station=i,day=d)=1 | rain(station=i,day=d-1)=0
> & rain
> > (station=j,day=d)=0 & rain(station=k,day=d)=0)
> >
> > In this particular example, if the random number is less than the
> probability
> > the value for station i and day d will be given as 1, otherwise it will
> be zero.
> >
> > There are 8 possible combinations.  i is the station to be generated, j
> and k
> > are the two stations most strongly correlated with station i.  Stations
> j and
> > k have already been generated in the example I gave previously.  So I
> want to
> > know given what is going on at stations j and k during day d and at
> station i
> > for day d-1 if the value for station i day d will be 1 or 0.
>
> But AFAIK that is what I said. Did you try anything from what I suggested?
>
> You have 4 possible combinations from 2 stations (I named them col1 col2,
> but you can name them differently - station j and k). So vector named cols
> results in numbers 1:4 based on values col1 and col2 and you can do it
> outside of loop.
>
> If col1 and col2 are 0/1 vectors you can get it e.g. by
>
> cols <- (col1+(col2+1)*2)-1
>
> and you get vector based on 0/1 value combination of your 2 vectors
> (please try it:-)
>
> You have 8 combinations of probabilities outcome (you call it specific
> probability) and I presume it is a vector of 8 values (you still does not
> provide small ***reproducible*** example)
>
> So you can generate vector of random numbers with outside of loop and
> compute combination of all possible outcomes with
>
> > ran<-runif(20)
> > p<-runif(8)
> > comparison <- outer(ran,p, "<")
>
> You will get comparison matrix e.g. for one month and you can just choose
> appropriate row/column value in cycle based on cols value and previous day
> value in station i.
>
> >
> > Hope this provides some clarification.
> > A
>
> If you do not provide some data with input and required specific outcome
> you won't get specific answer. Instead of trying to explain it by
> elaborated text use dput for exporting objects needed for computation and
> if possible also the outcome.
>
> Regards
> Petr
>
>
>
> > On Thu, Aug 12, 2010 at 3:21 AM, Petr PIKAL <petr.pi...@precheza.cz>
> wrote:
> > Hi
> >
> > without toy example it is rather complicated to check your function. So
> > only few remarks:
> >
> > Instead of generating 1 random number inside a loop generate whole
> vector
> > of random numbers outside a loop and choose a number
> >
> > Do not mix ifelse with if. ifelse is intended to work with whole vector.
> >
> > Work with matrices instead of data frames whenever possible if speed is
> an
> > issue.
> >
> > If I understand correctly you want to put 1 or 0 into one column based
> on:
> >
> > previous value in the same column
> > comparison of some random number with predefined probabilities in vector
> > of 6 values
> >
> > So here is vectorised version of your 4 ifs based on assumption
> >
> > 0 in col1 0 in col 2 = 5
> > 0 in col1 1 in col 2 = 9
> > 1 in col1 0 in col 2 = 6
> > 1 in col1 1 in col 2 =10
> >
> >
> > col1<-sample(1:2, 20, replace=T)
> > col2<-sample(c(4,8), 20, replace=T)
> >
> > col1+col2
> >  [1]  5  6  9  6  6  5  9 10  9  9  6  9 10  6 10  9 10  9  5  5
> > cols<-as.numeric(as.factor(col1+col2))
> >
> > cols
> >  [1] 1 2 3 2 2 1 3 4 3 3 2 3 4 2 4 3 4 3 1 1
> >
> >
> > And here is computed comparison of six values p (ortho obs used) with 20
> > generated random values
> >
> > ran<-runif(20)
> > p<-runif(8)
> > comparison <- outer(ran,p, "<")
> >       [,1]  [,2]  [,3] [,4]  [,5]  [,6]  [,7]  [,8]
> >  [1,] FALSE  TRUE FALSE TRUE  TRUE  TRUE  TRUE  TRUE
> >  [2,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
> >  [3,] FALSE  TRUE FALSE TRUE FALSE  TRUE  TRUE FALSE
> >  [4,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
> >  [5,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
> >  [6,] FALSE  TRUE FALSE TRUE FALSE  TRUE FALSE FALSE
> >  [7,] FALSE  TRUE FALSE TRUE FALSE  TRUE FALSE FALSE
> >  [8,] FALSE  TRUE FALSE TRUE  TRUE  TRUE  TRUE  TRUE
> >  [9,] FALSE  TRUE FALSE TRUE  TRUE  TRUE  TRUE  TRUE
> > [10,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
> > [11,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
> > [12,] FALSE  TRUE FALSE TRUE  TRUE  TRUE  TRUE  TRUE
> > [13,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
> > [14,] FALSE  TRUE FALSE TRUE  TRUE  TRUE  TRUE  TRUE
> > [15,]  TRUE  TRUE  TRUE TRUE  TRUE  TRUE  TRUE  TRUE
> > [16,] FALSE  TRUE FALSE TRUE  TRUE  TRUE  TRUE  TRUE
> > [17,] FALSE  TRUE FALSE TRUE FALSE  TRUE FALSE FALSE
> > [18,] FALSE  TRUE FALSE TRUE  TRUE  TRUE  TRUE  TRUE
> > [19,] FALSE  TRUE FALSE TRUE  TRUE  TRUE  TRUE  TRUE
> > [20,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
> >
> >
> > Now the only what you need to put in loop is to select appropriate
> column
> > from matrix comparison based on value on cols vector and 0 or 1 in
> > previous row of station column.
> >
> > Something like (untested)
> >
> > gen.log<-rep(NA, nrow(genmat)-1)
> >
> > for (i in 2:nrow(genmat)) {
> >
> > gen.log[i] <- if( genmat[i-1, num] ==0)  comparison[i, cols[i]] else
> > comparison[i,cols[i+5]]
> >
> > }
> >
> > genmat[2:nrow(genmat), num] <- gen.log*1
> >
> > Regards
> > Petr
> >
> >
> > r-help-boun...@r-project.org napsal dne 11.08.2010 18:35:37:
> >
> > > Hello Everyone!
> > >
> > > Here's what I'm trying to do.  I'm working on generating occurrences
> of
> > > precipitation based upon precipitation occurrence for a station during
> > the
> > > previous day and two stations that have already been generated by
> joint
> > > probablities and 1st order Markov chains or by the same generation
> > process.
> > > This has to be done for each remaining stations for each month.
> > >
> > > > genmat # 7 stations in this example, line_before is the climatology
> of
> > the
> > > last day of the previous month. Stations 4 and 6 have been generated
> > already
> > > in this example
> > >             [,1] [,2] [,3] [,4] [,5] [,6] [,7]
> > > line_before    1    1    1    0    1    1    1
> > >               NA   NA   NA    1   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    1   NA    0   NA
> > >               NA   NA   NA    1   NA    1   NA
> > >               NA   NA   NA    1   NA    1   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    1   NA    1   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    1   NA    1   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    1   NA    1   NA
> > >               NA   NA   NA    1   NA    1   NA
> > >               NA   NA   NA    1   NA    1   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    1   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    0   NA    0   NA
> > >               NA   NA   NA    1   NA    1   NA
> > >               NA   NA   NA    1   NA    1   NA
> > >               NA   NA   NA    1   NA    1   NA
> > >               NA   NA   NA    0   NA    0   NA
> > > > num # station to generate
> > > [1] 2
> > > > use1 # 1st station to use in generation
> > > [1] 6
> > > > use2 # 2nd station to use in generation
> > > [1] 4
> > >
> > > > genmat = event.gen2(genmat,use1,use2,num,ortho_obs_used) #
> Generation
> > > function shown below
> > > > genmat # genmat - after it has gone through station 2
> > >             [,1] [,2] [,3] [,4] [,5] [,6] [,7]
> > > line_before    1    1    1    0    1    1    1
> > >               NA    0   NA    1   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    0   NA    1   NA    0   NA
> > >               NA    1   NA    1   NA    1   NA
> > >               NA    1   NA    1   NA    1   NA
> > >               NA    1   NA    0   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    1   NA    1   NA    1   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    1   NA    1   NA    1   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    1   NA    1   NA    1   NA
> > >               NA    0   NA    1   NA    1   NA
> > >               NA    1   NA    1   NA    1   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    1   NA    0   NA    1   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    0   NA    0   NA    0   NA
> > >               NA    1   NA    1   NA    1   NA
> > >               NA    1   NA    1   NA    1   NA
> > >               NA    1   NA    1   NA    1   NA
> > >               NA    0   NA    0   NA    0   NA
> > >
> > > Where event.gen2 is this function:
> > >
> > > event.gen2 = function(genmat,use1,use2,num,ortho_obs_used){
> > >
> > > for(r in 2:nrow(genmat)){
> > >
> > > ran = runif(1,0,1)
> > >
> > > if(genmat[r,use1]==0 & genmat[r,use2]==0){
> > >
> >
> genmat[r,num]<-ifelse(genmat[r-1,num]==0,ifelse(ran<ortho_obs_used$Pr[1],1,
> > > 0),ifelse(ran<ortho_obs_used$Pr[4],1,0))
> > > }
> > >
> > > if(genmat[r,use1]==0 & genmat[r,use2]==1){
> > >
> >
> genmat[r,num]<-ifelse(genmat[r-1,num]==0,ifelse(ran<ortho_obs_used$Pr[2],1,
> > > 0),ifelse(ran<ortho_obs_used$Pr[5],1,0))
> > > }
> > >
> > > if(genmat[r,use1]==1 & genmat[r,use2]==0){
> > >
> >
> genmat[r,num]<-ifelse(genmat[r-1,num]==0,ifelse(ran<ortho_obs_used$Pr[3],1,
> > > 0),ifelse(ran<ortho_obs_used$Pr[7],1,0))
> > > }
> > >
> > > if(genmat[r,use1]==1 & genmat[r,use2]==1){
> > >
> >
> genmat[r,num]<-ifelse(genmat[r-1,num]==0,ifelse(ran<ortho_obs_used$Pr[6],1,
> > > 0),ifelse(ran<ortho_obs_used$Pr[8],1,0))
> > > }
> > >
> > > gc()
> > > }
> > >
> > > genmat
> > >
> > > }
> > >
> > > ####
> > >
> > > ortho_obs_used is a data frame that contains the probablity of
> > precipitation
> > > occurring on a given day for a specific set of condtions.
> > > For instance ortho_obs_used$Pr[1] is the probablity of rain at station
> s
> > for
> > > day d, given that there was no rain at station s for day d-1 and no
> rain
> > at
> > > either of the other two stations for day d.
> > >
> > > The event.gen2 function handles the generation, and it runs quickly
> for
> > the
> > > 5 remaining stations and one month, but I have to run this for 317
> > stations
> > > over 48 months or more, and it becomes a really bad bottleneck.  So
> what
> > I'd
> > > like to know is if there is anyway that I can re-write this function
> to
> > work
> > > without a loop.  I couldn't find anything from previous posts about
> > getting
> > > out of loops where the previous iteration is required to determine the
> > next
> > > calculation.
> > >
> > > Sorry for the length of the post, but I thought it best to try to
> > explain
> > > what I was doing first, before diving into my question
> > >
> > > Thanks in advance!
> > >
> > > Adrienne Wootten
> > > Graduate Research Assistant/Environmental Meteorologist
> > > M.S. Atmospheric Science
> > > NC State University
> > > State Climate Office of North Carolina
> > > Raleigh, NC 27695
> > >
> > >    [[alternative HTML version deleted]]
> > >
> > > ______________________________________________
> > > R-help@r-project.org mailing list
> > > https://stat.ethz.ch/mailman/listinfo/r-help
> > > PLEASE do read the posting guide
> > http://www.R-project.org/posting-guide.html
> > > and provide commented, minimal, self-contained, reproducible code.
>
>

        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to