Search code examples
netlogo

setting incubation period for mosquitoes and human


I have infection model which is working fine. now I want to add incubation period for infection to be realized either in mosquito or human. incubation period is 10 days, when infected mosquito interact with susceptible human the human become exposed for 10 days the after that changes to infected state.

**ask turtles
  [
    if exposed?;; [set incubation-period incubation-period + 10 ]
   [if random-float 10 < incubation-period
      [set infected? true set color red]]]**

after adding above code turtles jump to infected, do not get exposed first


Solution

  • (A note: I understand that incubation is not the period of time after which an organism is infected, but that incubation starts upon infection and it is the period of time after which symptoms show. However, in my reply and in the example it contains, I'll follow the scheme of things that I seem to understand from your question: first exposure, then incubation, finally infection. I am pointing this out to make sure that there are no ambiguities between your question and my answer)


    I am not sure why you are using random numbers, and you did not share a relevant parte of your code, so I am not sure I really understand how you want to implement this.

    However, let's start from what is surely not working there: you say set incubation-period incubation-period + 10. Whatever the value of incubation-period was before, now it is at least 10 (assuming incubation-period is never negative, of course).

    Then you check the condition random-float 10 < incubation-period. On the one hand, we already said that incubation-period is at least 10 now; on the other hand, the value resulting from random-float 10 is strictly less than 10. This means that the condition always evaluates as true, and that therefore every single agent running these lines will jump to set infected? true set color red.


    Now the question is: how are you intending to implement incubation? Why are you thinking about a condition of that type?

    I am not a medical person but, given my understanding, I can imagine you want your incubation to be a period of time after which something happens.

    In that case, rather than checking a condition based on a random number, you need to implement a counter: each agent that is exposed to an infected mosquito starts a countdown which equals the duration of incubation; when the countdown reaches zero, the agent becomes infected.

    You said you want the incubation to last 10 days. Assuming that in your model one tick equals one day, you can do something like:

    breed [humans human]
    breed [mosquitos mosquito]
    
    turtles-own [
      infected?
      incubation
    ]
    
    
    to setup
      clear-all
      reset-ticks
      
      set-default-shape humans "person"
      set-default-shape mosquitos "bug" ; The closest to a mosquito that was in the library!
      
      create-humans 100
      create-mosquitos 10
      
      ask turtles [
        setxy random-xcor random-ycor
        set infected? FALSE
        set color white
      ]
      
      ask n-of 2 mosquitos [
        become-infected
      ]
    end
    
    
    to go
      ask turtles with [incubation > 0] [
        set incubation incubation - 1
        if (incubation = 0) [
          become-infected
        ]
      ]
      
      ask turtles [
        right random 360
        forward 1
      ]
      
      ask mosquitos with [infected?] [
        let targets turtles-here with [not infected?]
        if (targets != NOBODY) [
          ask targets [
            start-incubation
          ]
        ]
      ]
      
      tick
    end
    
    
    to start-incubation
      set incubation 10
      set color orange + 1
    end
    
    
    to become-infected
      set infected? TRUE
      set color red
    end
    

    As you can see in the third block of code in go, when a healthy agent is on the same patch as an infected mosquito, the healthy agent goes to start-incubation and sets incubation to 10.

    In the first block of code in go, every agent that is incubating the disease will reduce by 1 the value of incubation so that, after 10 iterations, it will reach 0. When this happens, the agent goes to become-infected.

    The reason why this countdown is implemented at the beginning of go, and not at some point after the lines that check for exposure, is simple: if the countdown was after exposure, then it would mean that agents would set incubation as 10 but would also reduce it by 1 right after it, with the result that the real incubation would last 9 days and not 10 days.


    You might want to include some randomness in the actual length that incubation takes from individual to individual. I am not sure this is what you were thinking about when you introduced randomness in the condition to finish incubation, but I'm going to put this here anyway.

    If you want to do so, randomness has to be used only once upon determining the length of incubation for that individual. For example, if you want to the duration of incubation to be somewhere between 5 and 10 days, you can do:

    to start-incubation
      set incubation 5 + random 6
      set color orange + 1
    end
    

    This way, you make sure that incubation starts with a value of at least 5, plus a number between 0 and 5.

    This is a useful scheme to use in NetLogo. To generalise it:

    to start-incubation
      let min-incubation 5
      let max-incubation 10
      set incubation min-incubation + random (max-incubation - min-incubation + 1)
      set color orange + 1
    end
    

    Final note: I strongly suggest you avoid using random-float in this case, unless it is absolutely necessary for some reason that I don't see. Use random instead.

    If you use random-float, you get a decimal number. This means that, if you take the approach of setting the incubation period within a range (as in my example of a range between 5 and 10), you may get incubation starting at 8.5, which means that after 8 ticks it would be at 0.5 and after 9 ticks it would be at -0.5. This way, the condition incubation = 0 will never evaluate as true. You could change it to incubation <= 0, sure, but this has the exact same result of using random (i.e. incubation lasting a number of ticks between 5 and 10) but with a bug waiting to happen.