[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