spatstat (version 1.63-0)

rthin: Random Thinning


Applies independent random thinning to a point pattern or segment pattern.


rthin(X, P, …, nsim=1, drop=TRUE)



A point pattern (object of class "ppp" or "lpp" or "pp3" or "ppx") or line segment pattern (object of class "psp") that will be thinned.


Data giving the retention probabilities, i.e. the probability that each point or line in X will be retained. Either a single number, or a vector of numbers, or a function(x,y) in the R language, or a function object (class "funxy" or "linfun"), or a pixel image (object of class "im" or "linim").

Additional arguments passed to P, if it is a function.


Number of simulated realisations to be generated.


Logical. If nsim=1 and drop=TRUE (the default), the result will be a point pattern, rather than a list containing a point pattern.


An object of the same kind as X if nsim=1, or a list of such objects if nsim > 1.


The algorithm for random thinning was changed in spatstat version 1.42-3. Set spatstat.options(fastthin=FALSE) to use the previous, slower algorithm, if it is desired to reproduce results obtained with earlier versions.


In a random thinning operation, each point of the point pattern X is randomly either deleted or retained (i.e. not deleted). The result is a point pattern, consisting of those points of X that were retained.

Independent random thinning means that the retention/deletion of each point is independent of other points.

The argument P determines the probability of retaining each point. It may be

a single number,

so that each point will be retained with the same probability P;

a vector of numbers,

so that the ith point of X will be retained with probability P[i];

a function P(x,y),

so that a point at a location (x,y) will be retained with probability P(x,y);

an object of class "funxy" or "linfun",

so that points in the pattern X will be retained with probabilities P(X);

a pixel image,

containing values of the retention probability for all locations in a region encompassing the point pattern.

If P is a function P(x,y), it should be ‘vectorised’, that is, it should accept vector arguments x,y and should yield a numeric vector of the same length. The function may have extra arguments which are passed through the argument.


  plot(redwood, main="thinning")
  # delete 20% of points
  Y <- rthin(redwood, 0.8)
  points(Y, col="green", cex=1.4)

  # function
  f <- function(x,y) { ifelse(x < 0.4, 1, 0.5) }
  Y <- rthin(redwood, f)

  # pixel image
  Z <-, Window(redwood))
  Y <- rthin(redwood, Z)

  # pattern on a linear network
  A <- runiflpp(30, simplenet)
  B <- rthin(A, 0.2)
  g <- function(x,y,seg,tp) { ifelse(y < 0.4, 1, 0.5) }
  B <- rthin(A, linfun(g, simplenet))

  # thin other kinds of patterns
  E <- rthin(osteo$pts[[1]], 0.6)
  L <- rthin(copper$Lines, 0.5)
# }