Thank you all for your help... below is the code that worked as I intended:
J <- 48
N <- 1000
S <- 0.9
PsiADD <- 0.6
PsiAA <- 0.4
PsiaA <- 0.3
p <- 0.5
c <- p

y <- matrix(0,N,J)
y[,1]="A"
dtp <- rep(c(TRUE, TRUE, FALSE, FALSE), 12)[seq_len(J)]

for (q in 1:N){
  (observable <- TRUE)
  for(j in which(!dtp)){
    if(j>1)
      if(y[q, j-1] %in% c("d", "D")) break
{
  if(j %% 2){
    if (runif(1,0,1)<=S) {
      if (observable) {
        observable <- (runif(1,0,1)<=PsiAA)
      } else {
        observable <- (runif(1,0,1)<=PsiaA)
      }
      if (observable) {
        if (runif(1,0,1) <= p) y[q,j] <- "A"
      }
    } else {
      y[q,j] <- ifelse(runif(1,0,1) <= PsiADD,"D","d")
      break
    }
  } else {
    if(observable){
      if(runif(1,0,1) <= c) y[q,j] <- "A"
    }
  }
}
  }
}

for (q in 1:N) {
  for (j in which(dtp)) {
    if(j>2)
      if(y[q, j-2] %in% c("d", "D")) break
{
  if (j %% 2) {
    if (observable) {
      observable <- runif(1, 0, 1) <= PsiAA
    } else {
      observable <- runif(1, 0, 1) <= PsiaA
    }
    if (observable) {
      if (runif(1, 0, 1) <= p) y[q, j] <- "A"
    }
  } else {
    if (observable) {
      if (runif(1, 0, 1) <= c) y[q, j] <- "A"
    }
  }
}
  }
}

On Sat, Aug 11, 2012 at 12:15 PM, Rui Barradas <ruipbarra...@sapo.pt> wrote:

> Hello,
>
> I'm not sure it works, but try the following.
>
>
> for(j in which(dtp)){
>   for (q in 1:N){
>     if(y[q, j] %in% c("d", "D")) break
>     [...etc...]
>
> and in the other loop the same,
>
>
> for (j in which(!dtp)) {
>   for (q in 1:N) {
>     if(y[q, j] %in% c("d", "D")) break
>     [...etc...]
>
>
> Em 10-08-2012 20:42, Claudia Penaloza escreveu:
>
>> This is what my code looks like now. However, there is one thing I
>> can't/don't know how to fix.
>> I can't get it to be "once dead always dead", i.e., in any given row,
>> after
>> a "D" or a "d" there should be only zeros.
>> I've tried applying a flag to break the loop if dead but I can't get it to
>> work.
>> Could you please help me with this?
>>
>> Thank you for your time,
>> Claudia
>>
>> J = 24
>> N = 10
>> S = .9
>> PsiADd = 0.4
>> PsiAA = .4
>> PsiaA = .3
>> p = .5
>> c = p
>>
>> y <- matrix(0,N,J)
>> y[,1]="A"
>> dtp <- rep(c(TRUE, TRUE, FALSE, FALSE), 6)[seq_len(J)]
>> for(j in which(dtp)){
>>    for (q in 1:N){
>>      (observable <- TRUE)
>>      if(j %% 2){
>>        if (runif(1,0,1)<=S) {
>>          if (observable) {
>>            observable <- (runif(1,0,1)<=PsiAA)
>>          } else {
>>            observable <- (runif(1,0,1)<=PsiaA)
>>          }
>>          if (observable) {
>>            if (runif(1,0,1) <= p) y[q,j] <- "A"
>>          }
>>        } else {
>>          y[q,j] <- ifelse(runif(1,0,1) <= PsiADd,"d","D")
>>          break
>>        }
>>      } else {
>>            if(observable){
>>             if(runif(1,0,1) <= c) y[q,j] <- "A"
>>            }
>>          }
>>        }
>>      }
>>
>> for (j in which(!dtp)) {
>>    for (q in 1:N) {
>>      if (j %% 2) {
>>        if (observable) {
>>          observable <- runif(1, 0, 1) <= PsiAA
>>        } else {
>>          observable <- runif(1, 0, 1) <= PsiaA
>>        }
>>        if (observable) {
>>          if (runif(1, 0, 1) <= p) y[q, j] <- "A"
>>        }
>>      } else {
>>        if (observable) {
>>          if (runif(1, 0, 1) <= c) y[q, j] <- "A"
>>        }
>>      }
>>    }
>> }
>> On Wed, Aug 8, 2012 at 2:04 PM, Claudia Penaloza
>> <claudiapenal...@gmail.com>**wrote:
>>
>>  Answers inserted in BLUE below
>>>
>>> On Thu, Aug 2, 2012 at 5:34 PM, Claudia Penaloza <
>>> claudiapenal...@gmail.com> wrote:
>>>
>>>  Thank you very much for all your suggestions. I am very sorry my code is
>>>> so crude (it gives me a headache too!), I'm very new to R programing. I
>>>> will have to look at your suggestions/questions very carefully (I'm
>>>> barely
>>>> holding on at this point) and get back to you (Dr. Winsemius) with some
>>>> answers.
>>>>
>>>> Thank you!
>>>> Claudia
>>>>
>>>> On Wed, Aug 1, 2012 at 2:11 PM, David Winsemius <dwinsem...@comcast.net
>>>> >wrote:
>>>>
>>>>  On Aug 1, 2012, at 12:02 PM, Mercier Eloi wrote:
>>>>>
>>>>>   Your code almost gave me a headache. :-/
>>>>> I had a similar reaction. However, my approach might have been to
>>>>> request a more complete verbal description of the data structures being
>>>>> operated on and the methods and assumptions being used. Generally it is
>>>>> going to be easier to go from a procedural description to good R code
>>>>> than
>>>>> it is to go from a SAS Data Proc ... even if it were tested and
>>>>> debugged...
>>>>> and yours was not even debugged.
>>>>>
>>>>>
>>>>>   ##############################****############################**
>>>>> ##**####
>>>>>
>>>>>> # Robust design with Markovian emigration and dummy time periods
>>>>>> ##############################****############################**
>>>>>> ##**####
>>>>>>
>>>>>> J = 24
>>>>>> N = 10
>>>>>> S = .9
>>>>>> PsiAD = 0.06
>>>>>> PsiAd = 0.04
>>>>>> PsiAA = .4
>>>>>> PsiaA = .3
>>>>>> p = .5
>>>>>> c = p
>>>>>> y <- matrix(0,N,J)
>>>>>>
>>>>>>  # So is 'y' a matrix of states where the N rows are levels and the J
>>>>> columns are discrete times?
>>>>> # Actually I decided that context suggested you were using letters to
>>>>> represent states.
>>>>>
>>>>>  Yes, 'y' is a matrix of state, N rows are levels (independent of each
>>>>
>>> other) and J columns are discrete times.
>>> Yes, I am using letters to represent states.
>>>
>>>    y[,1]="A"
>>>>> # So we start with N <something>'s in state "A"?
>>>>> # It seems as though it might be the case that every row is independent
>>>>> of the others.
>>>>> # .. and you are performing ( replicate()-ing in R terminology) this
>>>>> test N times
>>>>> # states:
>>>>> #("A" "D")
>>>>> #("a" "d")
>>>>> #transitions:
>>>>>     matrix( c( runif(1, 0, 1) <= 0.4, # A -> A
>>>>>            runif(1,0,1) <= 0.3,  # a -> A
>>>>>            runif(1,0,1) <= 0.06. # A -> D
>>>>>            runif(1,0,1) <= 0.04  # A -> d) )
>>>>>
>>>>> # What is state "a"?
>>>>> # How do you get from A to a?
>>>>> # can you get from D or d to A or a?
>>>>>
>>>>>  Yes, we start with N "individuals" in state "A", each individual is
>>>>
>>> independent of each other.
>>> State "a" is an unobserved (!observable) version of state "A"
>>> (biologically, an individual that has temporarily left the sampling area
>>> and is not available for capture)
>>>   An individual in state "A" transitions to state "a" if it is observable
>>> and doesn't stay (stay >= AA)
>>> "D" and "d" are dead (absorbing) states. Once in either "D" or "d", the
>>> individual can no longer transition and is no longer "captured" (the row
>>> should only have zeros after a "D" or a "d")
>>>
>>>
>>>
>>>>
>>>>  # Not sure I have gotten the model assumptions down.
>>>>> # Is D" or "d" an absorbing state such as "dead or "Dead"?
>>>>>
>>>>>  Yes.
>>>> dtp <- rep(c(TRUE, TRUE, FALSE, FALSE), 6)[seq_len(J)]
>>>>
>>>>>
>>>>> #Presumably the "dummy time periods"
>>>>>
>>>>>  Yes.
>>>>
>>>
>>>  for(j in which(dtp)){   # j will be c(1,2, 5,6, 9,10 , ..., 21,22)
>>>>>
>>>>>
>>>>>
>>>>>   for (q in 1:N){  # This can almost surely become vectorized
>>>>>
>>>>>     (observable=1)
>>>>>     if(j %% 2){survive=runif(1,0,1)
>>>>>                if(survive<=S){
>>>>>                  stay=runif(1,0,1)
>>>>>                  if (observable==1){
>>>>>
>>>>>
>>>>> # It would help if the concept of "observable" were explained
>>>>> # Is this something to do with the capture-recapture observables?
>>>>>
>>>>>  Yes. All individuals start out "observable" (we need to capture them a
>>> first time). Individuals can then stay in their current state or
>>> transition
>>> to another one, if they are observable they can continue to be
>>> observable,
>>> or they can become unobservable and viceversa. Transition depends on what
>>> state you are in at any given time (A->A != A->a != a->A != a->a).
>>>
>>>                     if{
>>>>>                      observable=1
>>>>>                    }else{observable=0}
>>>>>                    }else{
>>>>>
>>>>>
>>>>> # After allowing for Mercier's astute observation that observable will
>>>>> always be 1, I'm wondering if it can be replaced with just this code
>>>>> (and
>>>>> not need the loop surrounding it.)
>>>>>
>>>>>
>>>>>
>>>>>  The individual will always "start" as observable... but as the loop
>>>>
>>> progresses through the columns in a row, it can go between being
>>> observable
>>> and unobservable (at least that is what I wanted to code).
>>>
>>>                       observable <- (stay<=PsiAA)
>>>>>
>>>>> #--------------
>>>>>
>>>>>                      return=runif(1,0,1)
>>>>>
>>>>>
>>>>> # better NOT to use the name "return" since it is a crucial R function
>>>>> name.
>>>>>
>>>>>
>>>>>
>>>>>  Will change. Thank you.
>>>>
>>>>>
>>>>>
>>>>>                      if(return<=PsiaA){
>>>>>                        observable=1
>>>>>                      }else{observable=0}}
>>>>>
>>>>>
>>>>> #------- perhaps:
>>>>>
>>>>>               randret <-  return=runif(N,0,1)
>>>>>               observable <- randret <= PsiaA
>>>>> # -------------------
>>>>>
>>>>>
>>>>>                  if(observable==1){
>>>>>                    capture=runif(1,0,1)
>>>>>                    if(capture<=p){
>>>>>
>>>>>
>>>>>      #---------- perhaps:
>>>>>            randcap <- runif(N, 0,1)
>>>>>            y[ randcap <= p, j] <- "A"
>>>>> #That would replace with "A" (within the j-column) ...
>>>>> #     only the rows in 'y' for which randcap were less than the randcap
>>>>> threshold.
>>>>>
>>>>>      #------------
>>>>>
>>>>>
>>>>>                      y[q,j]="A"}
>>>>>                  }}else{
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>                    deado=runif(1,0,1)
>>>>>                    if(deado<=PsiAd){
>>>>>                      y[q,j]="d"
>>>>>                    }else(y[q,j]="D")
>>>>>
>>>>>
>>>>> # -------Perhaps
>>>>>       deado <- runif(N, 0,1)
>>>>>       y[ , j] <- ifelse( deado<=PsiAd, "d", "D")
>>>>> #------------------------
>>>>>
>>>>>
>>>>>
>>>>>                      if(y[q,j]%in%c("D","d")){
>>>>>                        break
>>>>>
>>>>>
>>>>> #    ----------Really?  I thought that condition was assured at this
>>>>> point?
>>>>>
>>>>>
>>>>>
>>>>>  I thought so too but non-zero elements appeared toward the right in
>>>> rows
>>>>
>>> that had already "died".
>>>
>>>                        }
>>>>>                      }
>>>>>                    }else{
>>>>>                      if(observable==1){
>>>>>                        recap=runif(1,0,1)
>>>>>                        if(recap<=c){
>>>>>                          y[q,j]="A"
>>>>>                        }
>>>>>                      }
>>>>>                    }
>>>>>                  }
>>>>>                }
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> There are a lot of unnecessary tests and conditions. I tried to break
>>>>> down the code and write the tests that have been done when assigning a
>>>>> variable. I simplified your the first part but cannot guarantee that
>>>>> all
>>>>> criteria are met.
>>>>>
>>>>>
>>>>>
>>>>>  I will run the three modified versions and see how things go. I hope
>>>> my
>>>>
>>> answers are helpful.
>>>
>>>
>>>
>>>
>

        [[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