[R] limiting simulated animal movement

Jim Lemon jim at bitwrit.com.au
Sun Mar 22 11:22:15 CET 2009


Umesh Srinivasan wrote:
> Hi,
>
> I am trying to simulate animal movement in a gridded landscape made up of
> cells. At each time step (iteration), the animal moves from one cell to
> another in a random fashion.
> ...
> The problem is
> 1. I want to limit animals to a pre-defined circular home range
> 2. I want to limit animals to the borders of the landscape itself
>
>
> I tried to limit animals to their home range using:
>
> if (sqrt((x - a)^2 + (y - b)^2) > radius.range) {
> a <- a[i-1]
> b <- b[i-1]
> }
>
> Where x and y are co-ordinates for the centre of the home range
>
> But this is not working - giving NA values for x and y co-ordinates. Does
> anyone know what to do?
>   
Hi Umesh,
The reason the above is generating NAs may be that you have defined x 
and y outside the function you are using to simulate movement. In 
general, an animal would slow down near the edges of a range, so 
something like this might give you a more realistic simulated exploration:

explore.circle<-function(x,y,radius,nsteps) {
 plot(0,xlim=c(x-radius-1,x+radius+1),ylim=c(y-radius-1,y+radius+1),type="n")
 newx<-newy<-rep(NA,nsteps+1)
 xyprob<-matrix(NA,ncol=6,nrow=nsteps+1)
 newx[1]<-x
 newy[1]<-y
 for(astep in 1:nsteps) {
  xprob<-c((newx[astep]-(x-radius))/radius,1,(x+radius-newx[astep])/radius)
  newx[astep+1]<-newx[astep]+sample(-1:1,1,prob=xprob)
  yprob<-c((newy[astep]-(y-radius))/radius,1,(y+radius-newy[astep])/radius)
  newy[astep+1]<-newy[astep]+sample(-1:1,1,prob=yprob)
  text(newx[astep],newy[astep],astep)
  xyprob[astep,]<-c(xprob,yprob)
 }
 text(newx[nsteps+1],newy[nsteps+1],nsteps+1)
 return(cbind(newx,newy,xyprob))
}

This is not guaranteed to stay inside the circle, so you might have to 
add more constraints.

Jim




More information about the R-help mailing list