Comparing distance among point pattern events

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Comparing distance among point pattern events

R-sig-geo mailing list
Dear R-Sig-Geo Members,

I have the hypothetical point process situation:

library(spatstat)
set.seed(2019)
A <- rpoispp(100) ## First event
B <- rpoispp(50) ## Second event
C <- rpoispp(50) ## Third event
plot(A, pch=16)
plot(B, col="red", add=T)
plot(C, col="blue", add=T)

I've like to know an adequate spatial approach for comparing if on
average the event B or C is more close to A. For this, I try to make:

AB<-superimpose(A,B)
ABd<-pairdist(AB)
AC<-superimpose(A,C)
ACd<-pairdist(A)
mean(ABd)
#[1] 0.5112954
mean(ACd)
#[1] 0.5035042

With this naive approach, I concluded that event C is more close of A
that B. This sounds enough for a final conclusion or more robust
analysis is possible?

Thanks in advance,

Alexandre

--
Alexandre dos Santos
Geotechnologies and Spatial Statistics applied to Forest Entomology
Instituto Federal de Mato Grosso (IFMT) - Campus Caceres
Caixa Postal 244 (PO Box)
Avenida dos Ramires, s/n - Distrito Industrial
Caceres - MT - CEP 78.200-000 (ZIP code)
Phone: (+55) 65 99686-6970 / (+55) 65 3221-2674
Lattes CV: http://lattes.cnpq.br/1360403201088680
OrcID: orcid.org/0000-0001-8232-6722
ResearchGate: www.researchgate.net/profile/Alexandre_Santos10
Publons: https://publons.com/researcher/3085587/alexandre-dos-santos/
--

_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Reply | Threaded
Open this post in threaded view
|

Re: Comparing distance among point pattern events

Sarah Goslee
Hi,

Great question, and clear example.

The first problem:
ACd<-pairdist(A) instead of ACd <- pairdist(AC)

BUT

pairdist() is the wrong function: that calculates the mean distance
between ALL points, A to A and C to C as well as A to C.

You need crossdist() instead.

The most flexible approach is to roll your own permutation test. That
will work even if B and C are different sizes, etc. If you specify the
problem more exactly, there are probably parametric tests, but I like
permutation tests.


library(spatstat)
set.seed(2019)
A <- rpoispp(100) ## First event
B <- rpoispp(50) ## Second event
C <- rpoispp(50) ## Third event
plot(A, pch=16)
plot(B, col="red", add=T)
plot(C, col="blue", add=T)

ABd<-crossdist(A, B)
ACd<-crossdist(A, C)

mean(ABd)
# 0.5168865
mean(ACd)
# 0.5070118


# test the hypothesis that ABd is equal to ACd

nperm <- 999

permout <- data.frame(ABd = rep(NA, nperm), ACd = rep(NA, nperm))

# create framework for a random assignment of B and C to the existing points

BC <- superimpose(B, C)
B.len <- npoints(B)
C.len <- npoints(C)
B.sampvect <- c(rep(TRUE, B.len), rep(FALSE, C.len))

set.seed(2019)
for(i in seq_len(nperm)) {
    B.sampvect <- sample(B.sampvect)
    B.perm <- BC[B.sampvect]
    C.perm <- BC[!B.sampvect]

    permout[i, ] <- c(mean(crossdist(A, B.perm)), mean(crossdist(A, C.perm)))
}


boxplot(permout$ABd - permout$ACd)
points(1, mean(ABd) - mean(ACd), col="red")

table(abs(mean(ABd) - mean(ACd)) >= abs(permout$ABd - permout$ACd))
# FALSE  TRUE
#  573   426

sum(abs(mean(ABd) - mean(ACd)) >= abs(permout$ABd - permout$ACd)) / nperm
# 0.4264264

The difference between ACd and ABd is indistinguishable from that
obtained by a random resampling of B and C.


Sarah

On Fri, Nov 22, 2019 at 8:26 AM ASANTOS via R-sig-Geo
<[hidden email]> wrote:

>
> Dear R-Sig-Geo Members,
>
> I have the hypothetical point process situation:
>
> library(spatstat)
> set.seed(2019)
> A <- rpoispp(100) ## First event
> B <- rpoispp(50) ## Second event
> C <- rpoispp(50) ## Third event
> plot(A, pch=16)
> plot(B, col="red", add=T)
> plot(C, col="blue", add=T)
>
> I've like to know an adequate spatial approach for comparing if on
> average the event B or C is more close to A. For this, I try to make:
>
> AB<-superimpose(A,B)
> ABd<-pairdist(AB)
> AC<-superimpose(A,C)
> ACd<-pairdist(A)
> mean(ABd)
> #[1] 0.5112954
> mean(ACd)
> #[1] 0.5035042
>
> With this naive approach, I concluded that event C is more close of A
> that B. This sounds enough for a final conclusion or more robust
> analysis is possible?
>
> Thanks in advance,
>
> Alexandre
>

--
Sarah Goslee (she/her)
http://www.numberwright.com

_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Reply | Threaded
Open this post in threaded view
|

Re: Comparing distance among point pattern events

R-sig-geo mailing list
Dear R-Sig-Geo Members,

I have the three hypothetical point process situation (A, B and C) and my question is: What point distribution (B or C) is more close to A?

For this problem, I make a simple example:

library(spatstat)
set.seed(2023)
A <- rpoispp(30) ## First event
B <- rpoispp(30) ## Second event
C <- rThomas(10,0.02,5) ## Third event with Thomas cluster process
plot(A, pch=16)
plot(B, col="red", add=T)
plot(C, col="blue", add=T)

First, I takesthe distances between pairs of events:

ABd<-crossdist(A, B)
ACd<-crossdist(A, C)

mean(ABd)
# 0.4846027
mean(ACd)
# 0.5848766



# test the hypothesis that ABd is equal to ACd courtesy of Sarah Goslee

nperm <- 999

permout <- data.frame(ABd = rep(NA, nperm), ACd = rep(NA, nperm))

# create framework for a random assignment of B and C to the existing points

BC <- superimpose(B, C)
B.len <- npoints(B)
C.len <- npoints(C)
B.sampvect <- c(rep(TRUE, B.len), rep(FALSE, C.len))

set.seed(2023)
for(i in seq_len(nperm)) {
     B.sampvect <- sample(B.sampvect)
     B.perm <- BC[B.sampvect]
     C.perm <- BC[!B.sampvect]

     permout[i, ] <- c(mean(crossdist(A, B.perm)), mean(crossdist(A, C.perm)))
}


boxplot(permout$ABd - permout$ACd)
points(1, mean(ABd) - mean(ACd), col="red")

table(abs(mean(ABd) - mean(ACd)) >= abs(permout$ABd - permout$ACd))
#TRUE
# 999

sum(abs(mean(ABd) - mean(ACd)) >= abs(permout$ABd - permout$ACd)) / nperm
# [1] 1


The difference between ACd and ABd is distinguishable from that obtained by a random resampling of B and C.
Then B (0.4846027) is more close to A, that C (0.5848766).


But, now I comparing the distance to mean nearest neighbour and minimum distance between each pair of types:

marks(A)<-as.factor("A")
marks(B)<-as.factor("B")
marks(C)<-as.factor("C")

# distance to nearest neighbour A to B
nnda <- nncross(A,B, by=marks(A,B))

# mean nearest neighbour distances
mean(nnda[,1])
#[1] 0.09847543

# distance to nearest neighbour A to C
nndb <- nncross(A,C, by=marks(A,C))

# mean nearest neighbour distances
mean(nndb[,1])
#[1] 0.151127

# test again the hypothesis that ABd is equal to ACd

nperm <- 999

permout <- data.frame(ABd = rep(NA, nperm), ACd = rep(NA, nperm))

# create framework for a random assignment of B and C to the existing points

BC <- superimpose(B, C)
B.len <- npoints(B)
C.len <- npoints(C)
B.sampvect <- c(rep(TRUE, B.len), rep(FALSE, C.len))

set.seed(2023)
for(i in seq_len(nperm)) {
     B.sampvect <- sample(B.sampvect)
     B.perm <- BC[B.sampvect]
     C.perm <- BC[!B.sampvect]
     ab<-nncross(A, B.perm)
     ac<-nncross(A, C.perm)

     permout[i, ] <- c(mean(ab[,1]), mean(ac[,1]))
}


boxplot(permout$ABd - permout$ACd)
points(1, mean(nnda[,1]) - mean(nndb[,1]), col="red")

table(abs(mean(nnda[,1]) - mean(nndb[,1])) >= abs(permout$ABd - permout$ACd))
#FALSE  TRUE
#   91   908

sum(abs(mean(nnda[,1]) - mean(nndb[,1])) >= abs(permout$ABd - permout$ACd)) / nperm
#[1] 0.9089089


Now, the same conclusion or the mean nearest neighbour distances of A to B (0.10887343) is smaller than A to C (0.151127),
but is not so clear for me, what is the better approach if a comparing crossdist() and nndist () results for a good answer to my question?

Any conceptual tips?

Thanks in advance,

--
Alexandre dos Santos
Geotechnologies and Spatial Statistics applied to Forest Entomology
Instituto Federal de Mato Grosso (IFMT) - Campus Caceres
Caixa Postal 244 (PO Box)
Avenida dos Ramires, s/n - Distrito Industrial
Caceres - MT - CEP 78.200-000 (ZIP code)
Phone: (+55) 65 99686-6970 / (+55) 65 3221-2674
Lattes CV: http://lattes.cnpq.br/1360403201088680
OrcID: orcid.org/0000-0001-8232-6722
ResearchGate: www.researchgate.net/profile/Alexandre_Santos10
Publons: https://publons.com/researcher/3085587/alexandre-dos-santos/
--

Em 22/11/2019 10:09, Sarah Goslee escreveu:

> Hi,
>
> Great question, and clear example.
>
> The first problem:
> ACd<-pairdist(A) instead of ACd <- pairdist(AC)
>
> BUT
>
> pairdist() is the wrong function: that calculates the mean distance
> between ALL points, A to A and C to C as well as A to C.
>
> You need crossdist() instead.
>
> The most flexible approach is to roll your own permutation test. That
> will work even if B and C are different sizes, etc. If you specify the
> problem more exactly, there are probably parametric tests, but I like
> permutation tests.
>
>
> library(spatstat)
> set.seed(2019)
> A <- rpoispp(100) ## First event
> B <- rpoispp(50) ## Second event
> C <- rpoispp(50) ## Third event
> plot(A, pch=16)
> plot(B, col="red", add=T)
> plot(C, col="blue", add=T)
>
> ABd<-crossdist(A, B)
> ACd<-crossdist(A, C)
>
> mean(ABd)
> # 0.5168865
> mean(ACd)
> # 0.5070118
>
>
> # test the hypothesis that ABd is equal to ACd
>
> nperm <- 999
>
> permout <- data.frame(ABd = rep(NA, nperm), ACd = rep(NA, nperm))
>
> # create framework for a random assignment of B and C to the existing points
>
> BC <- superimpose(B, C)
> B.len <- npoints(B)
> C.len <- npoints(C)
> B.sampvect <- c(rep(TRUE, B.len), rep(FALSE, C.len))
>
> set.seed(2019)
> for(i in seq_len(nperm)) {
>      B.sampvect <- sample(B.sampvect)
>      B.perm <- BC[B.sampvect]
>      C.perm <- BC[!B.sampvect]
>
>      permout[i, ] <- c(mean(crossdist(A, B.perm)), mean(crossdist(A, C.perm)))
> }
>
>
> boxplot(permout$ABd - permout$ACd)
> points(1, mean(ABd) - mean(ACd), col="red")
>
> table(abs(mean(ABd) - mean(ACd)) >= abs(permout$ABd - permout$ACd))
> # FALSE  TRUE
> #  573   426
>
> sum(abs(mean(ABd) - mean(ACd)) >= abs(permout$ABd - permout$ACd)) / nperm
> # 0.4264264
>
> The difference between ACd and ABd is indistinguishable from that
> obtained by a random resampling of B and C.
>
>
> Sarah
>
> On Fri, Nov 22, 2019 at 8:26 AM ASANTOS via R-sig-Geo
> <[hidden email]> wrote:
>> Dear R-Sig-Geo Members,
>>
>> I have the hypothetical point process situation:
>>
>> library(spatstat)
>> set.seed(2019)
>> A <- rpoispp(100) ## First event
>> B <- rpoispp(50) ## Second event
>> C <- rpoispp(50) ## Third event
>> plot(A, pch=16)
>> plot(B, col="red", add=T)
>> plot(C, col="blue", add=T)
>>
>> I've like to know an adequate spatial approach for comparing if on
>> average the event B or C is more close to A. For this, I try to make:
>>
>> AB<-superimpose(A,B)
>> ABd<-pairdist(AB)
>> AC<-superimpose(A,C)
>> ACd<-pairdist(A)
>> mean(ABd)
>> #[1] 0.5112954
>> mean(ACd)
>> #[1] 0.5035042
>>
>> With this naive approach, I concluded that event C is more close of A
>> that B. This sounds enough for a final conclusion or more robust
>> analysis is possible?
>>
>> Thanks in advance,
>>
>> Alexandre
>>

        [[alternative HTML version deleted]]

_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo