Learn R Programming

spatstat (version 1.11-4)

applynbd: Apply Function to Every Neighbourhood in a Point Pattern

Description

Visit each point in a point pattern, find the neighbouring points, and apply a given function to them.

Usage

applynbd(X, FUN, N, R, criterion, exclude=FALSE, ...)

Arguments

X
Point pattern. An object of class "ppp", or data which can be converted into this format by as.ppp.
FUN
Function to be applied to each neighbourhood. The arguments of FUN are described under Details.
N
Integer. If this argument is present, the neighbourhood of a point of X is defined to consist of the N points of X which are closest to it. This argument is incompatible with R and crit
R
Nonnegative numeric value. If this argument is present, the neighbourhood of a point of X is defined to consist of all points of X which lie within a distance R of it. This argument is incompatible wi
criterion
Function. If this argument is present, the neighbourhood of a point of X is determined by evaluating this function. See under Details. This argument is incompatible with N and R.
exclude
Logical. If TRUE then the point currently being visited is excluded from its own neighbourhood.
...
extra arguments passed to the function FUN. They must be given in the form name=value.

Value

  • Similar to the result of apply. If each call to FUN returns a single numeric value, the result is a vector of dimension X$n, the number of points in X. If each call to FUN returns a vector of the same length m, then the result is a matrix of dimensions c(m,n); note the transposition of the indices, as usual for the family of apply functions. If the calls to FUN return vectors of different lengths, the result is a list of length X$n.

Details

This is an analogue of apply for point patterns. It visits each point in the point pattern X, determines which points of X are ``neighbours'' of the current point, applies the function FUN to this neighbourhood, and collects the values returned by FUN.

The definition of ``neighbours'' depends on the arguments N, R and criterion, exactly one of which must be given. Also the argument exclude determines whether the current point is excluded from its own neighbourhood.

If N is given, then the neighbours of the current point are the N points of X which are closest to the current point (including the current point itself unless exclude=TRUE). If R is given, then the neighbourhood of the current point consists of all points of X which lie closer than a distance R from the current point. If criterion is given, then it must be a function with two arguments dist and drank which will be vectors of equal length. The interpretation is that dist[i] will be the distance of a point from the current point, and drank[i] will be the rank of that distance (the three points closest to the current point will have rank 1, 2 and 3). This function must return a logical vector of the same length as dist and drank whose i-th entry is TRUE if the corresponding point should be included in the neighbourhood. See the examples below.

Each point of X is visited; the neighbourhood of the current point is determined, and stored as a point pattern Y; then the function FUN is called as: FUN(Y=Y, current=current, dists=dists, dranks=dranks, ...)

where current is a vector of length 2 giving the coordinates of the current point, dists is a vector of distances from the current point to each of the points in Y, dranks is a vector of the ranks of these distances with respect to the full point pattern X, and ... are the arguments passed from the call to applynbd.

The results of each call to FUN are collected and returned according to the usual rules for apply and its relatives. See Value above.

Note that FUN will be called exactly as described above, with each argument named explicitly. Care is required when writing the function FUN to ensure that the arguments will match up. See the Examples.

See markstat for a common use of this function.

See Also

ppp.object, apply, markstat

Examples

Run this code
data(redwood)

  # count the number of points within radius 0.2 of each point of X
  nneighbours <- applynbd(redwood, R=0.2, function(Y, ...){Y$n-1})
  # equivalent to:
  nneighbours <- applynbd(redwood, R=0.2, function(Y, ...){Y$n}, exclude=TRUE)

  # compute the distance to the second nearest neighbour of each point
  secondnndist <- applynbd(redwood, N = 2,
                           function(dists, ...){max(dists)},
                           exclude=TRUE)

  # marked point pattern
  data(longleaf)
  <testonly># smaller dataset
	longleaf <- longleaf[seq(1, longleaf$n, by=80)]</testonly>
  # compute the median of the marks of all neighbours of a point
  # (see also 'markstat')
  dbh.med <- applynbd(longleaf, R=90, exclude=TRUE,
                 function(Y, ...) { median(Y$marks)})


  # ANIMATION explaining the definition of the K function
  # (arguments `fullpicture' and 'rad' are passed to FUN)

  showoffK <- function(Y, current, dists, dranks, fullpicture,rad) { 
	plot(fullpicture, main="")
	points(Y, cex=2)
        u <- current
	points(u[1],u[2],pch="+",cex=3)
	theta <- seq(0,2*pi,length=100)
	polygon(u[1]+ rad * cos(theta),u[2]+rad*sin(theta))
	text(u[1]+rad/3,u[2]+rad/2,Y$n,cex=3)
	Sys.sleep(if(runif(1) < 0.1) 1.5 else 0.3)
	return(Y$n - 1)
  }
  applynbd(redwood, R=0.2, showoffK, fullpicture=redwood, rad=0.2, exclude=TRUE)

  # animation explaining the definition of the G function

  showoffG <- function(Y, current, dists, dranks, fullpicture) { 
	plot(fullpicture, main="")
	points(Y, cex=2)
        u <- current
	points(u[1],u[2],pch="+",cex=3)
	v <- c(Y$x[1],Y$y[1])
	segments(u[1],u[2],v[1],v[2],lwd=2)
	w <- (u + v)/2
	nnd <- dists[1]
	text(w[1],w[2],round(nnd,3),cex=2)
	Sys.sleep(if(runif(1) < 0.1) 1.5 else 0.3)
	return(nnd)
  }

  data(cells)
  applynbd(cells, N=1, showoffG, exclude=TRUE, fullpicture=cells)

Run the code above in your browser using DataLab