[R-sig-Geo] Using pixel image as spatstat's intensity surface
Allar Haav
allar.haav at gmail.com
Tue Jul 23 21:56:37 CEST 2013
Dear Rolf,
Thank you for insightful answer. Following your explanation I found out
that the key problem was that I didn't specify the simulation in Linhom
envelope. For some reason I thought that lambda would be overriding the
envelope creating point process. So, your example 4 was really helpful
for that matter.
However in order to produce a proper-looking graph with an envelope, I
had to use reciplambda instead of the regular one. I figured this out
after seeing that while envelope was calculated and displayed correctly,
the observed Linhom(r) line did not appear (envelope's "obs" values are
either 0's or NaN's). Using reciplambda did the trick though, but the
values on the y-axis are 1e+07 times smaller than they should. Creating
random patterns using rpoispp() does not indicate at all that the
intensity surface should be used reciprocally: the number of points and
their spatial distribution make sense. Also if using randomly created
points there is no need for reciplambda, although it works both ways
showing slightly different results. Another worrying issue, but I'll try
to look into it.
Thank you and all the best,
Allar
On 23/07/2013 11:07, Rolf Turner wrote:
>
> Dear Allar,
>
> It is impossible for me to tell from the information that you have
> provided what is going
> wrong. Basically it seems to me that the code you used will work "in
> general". It is strange
> that you are getting *empty* plots. A toy example (see below)
> indicates that "empty plots"
> should not result.
>
> I can see why there might be problems with the envelope, but the plot
> shouldn't be
> *empty*. At the very least you should get a plot of Linhom(sites).
>
> Toy example:
>
> W <- disc(0.5,c(0.5,0.5),npoly=6)
> A <- as.im(function(x,y){0.1*cos(2*pi*(x^2+y^2))^2},W=W)
> i <- summary(A)$integral
> B <- eval.im(100*A/i)
> set.seed(42)
> X <- rpoispp(B)[W]
> E1 <- envelope(X,Linhom,lambda=A,nsim=19)
> E2 <- envelope(X,Linhom,lambda=B,nsim=19)
> E3 <- envelope(X,Linhom,lambda=A,simulate=expression(rpoispp(A)),nsim=19)
> plot(E1)
> plot(E2)
> plot(E3)
>
> The envelopes E1 and E2 are silly looking, being inappropriate, but
> they are
> certainly not empty.
>
> The envelope E3 yields a non-empty plot, although there is no envelope
> as such.
> This is due to the fact that the "simulate" expression yields nothing
> but empty
> patterns (from which no L function estimate can be calculated).
>
> I suspect that what you actually did was something like the E3
> calculation rather
> than what you told us you did.
>
> What you probably should have done is something like:
>
> E4 <- envelope(X,Linhom,lambda=B,simulate=expression(rpoispp(B)),nsim=19)
>
> which produces a sensible envelope.
>
> What Linhom() does for you is to allow you to assess whether "sites"
> arises from an
> inhomogeneous Poisson process or if there is evidence of interaction
> in the data. To
> apply Linhom() you must know (or have an idea of) the underlying
> intensity of "sites".
> To use an intensity such as "model" which you apparently *know* would
> generate fewer
> points than there are in "sites" makes no sense. Use an intensity
> which you actually
> believe to be the underlying intensity for "sites" (or which you at
> least believe to be a
> *plausible* candidate for this intensity).
>
> cheers,
>
> Rolf Turner
>
> P. S. The error that you got from applying Linhom() directly to
> "sites" with lambda=model
> might have arisen because "model" has some zero values. I *think*
> this will be a problem
> only if it has zero values at one or more points of "sites". Haven't
> experimented with
> this.
>
> R. T.
>
> On 23/07/13 13:23, Allar Haav wrote:
>> Hi all,
>>
>> I am currently trying to use spatstat's inhomogeneous cluster
>> analysis methods (mostly Linhom), but ran into a problem. Namely, I
>> have a pixel image (type "im") with values ranging from 0 to 1
>> indicating point probabilities. When creating and plotting random
>> points with it, this intensity surface works as it should. I can also
>> use it in regular envelope functions without issues. However, any
>> attempt to use the intensity surface with Linhom function results in
>> empty plot. I suspected that this might have something to do with the
>> integral of the surface, therefore made a crude transformation so
>> that it would be approximately the number of points under study (see
>> below), but of course it didn't change anything. Generally I still
>> feel that the crux lies in the intensity surface's values, but I
>> can't quite put my finger on it.
>>
>> A simplified code I used is as follows:
>>
>> area <- as.owin(area_polygon)
>> sites <- as.ppp(as(readShapeSpatial('sites.shp')))
>> sites$window <- area
>> model <- as.im(read.asciigrid('model.asc'))
>> sites.n <- sites$n
>> integral <- summary(model)$integral
>>
>> # This creates a nice plot with simulation envelopes
>> plot(envelope(sites, Lest, nsim=19,
>> simulate=expression(rpoispp(eval.im(model*(sites.n/integral ))))))
>>
>> # These produce only empty plots
>> plot(envelope(sites, Linhom, nsim=19, lambda=model ))
>> plot(envelope(sites, Linhom, nsim=19, lambda=eval.im(model
>> *(sites.n/integral ))))
>>
>> # A further check without envelope
>> Linhom(sites, lambda=model)
>> # This resulted in:
>> "Error in Kwtsum(dIJ, bI, wIJ, b, w = reciplambda, breaks) : Weights
>> in K-function were infinite or NA"
>>
>> That last error message left me a bit perplexed. Indeed, I have NA
>> values in the dataset as the study area is not perfectly rectangular.
>> But this should be a non-issue anyway.
>> Frankly I'm running out of ideas. I've been thinking of alternative
>> approaches, e.g. creating random points from the intensity surface
>> and fitting a model based on it using "ppm", perhaps using some
>> covariates. Yet this seems actually an awful idea considering the
>> probable loss of accuracy and the fact that basically the model
>> already exists.
>>
>> As a side note, a bit of googling on the issue revealed an older post
>> about inhomogeneous process analysis
>> (http://r-sig-geo.2731867.n2.nabble.com/memory-allocation-problem-with-envelope-function-in-spatstat-td5029218.html).
>> There a command equivalent to my first envelope plot was used:
>> Lin=envelope(SPECIES.ppp,Linhom,nsim=5,simulate=expression(rpoispp(lambda)),
>> ! + correction="border")
>> That made me think that I might be overthinking the problem and I've
>> already found the solution with first try. However I am still
>> skeptical as the difference between Lest and Linhom does not lie
>> merely in simulated patterns - weights are also to be considered. If
>> so, why was this solution used?
>>
>> Any suggestions or ideas? All sort of feedback would be appreciated.
More information about the R-sig-Geo
mailing list