Search code examples
statisticsspatialanovaspatstat

Anova for multiple point patterns not working for Strauss model


I just started getting into spatial analysis and am fitting some models to my data. My main goal is to test for spatial regularity (whether there is inhibition between points).

I created my hyperframe for the data below. There are 6 point patterns (Areas), 4 in subhabitat 1, and 2 in subhabitat 2.

ALL_ppp <- list(a1ppp, a2ppp, a3ppp, a4ppp, a5ppp, a6ppp) 
H <- hyperframe(Area = c("A1","A2","A3","A4","A5","A6"), Subhabitat = c("sbh1","sbh1","sbh1","sbh1","sbh2","sbh2"), Points = ALL_ppp )

I then created some models. This model fits a Strauss process with a different interaction radius for each area, with intensity depending on subhabitat type. It is very similar to the example in the book on page 700.

radii <- c(mean(area1$diameter), mean(area2$diameter),mean(area3$diameter),mean(area4$diameter),mean(area5$diameter),mean(area6$diameter))
Rad <- hyperframe(R=radii)
Str <- with(Rad, Strauss(R))
Int <- hyperframe(str=Str)

fittest8 <- mppm(Points ~ Subhabitat, H, interaction=Int, iformula = ~str:Area)

I would like to conduct a formal test for significance for the Strauss interaction parameters using anova.mppm to test for regularity. However, I am not sure if I am doing this properly, as I cannot seem to get this to work. I have tried:

fittest8 <- mppm(Points ~ Subhabitat, H, interaction=Int, iformula = ~str:Area)
fitex <- mppm(Points ~ Subhabitat, H)
anova.mppm(fittest8, fitex, test = "Chi")

I get the error "Error: Coefficient ‘str’ is missing from new.coef" and cannot find a way to resolve this. Any advice would be greatly appreciated.

Thanks!


Solution

  • First, please learn how to make a minimal reproducible example. This will make it easier for people to help you solve the problem, without having to guess what was in your data.

    In your example, the columns named Area and Subhabitat in the hyperframe H are character vectors, but in your code, the call to mppm would require that they are factors. I assume you converted them to factors in order to be able to fit the model fittest8. (Another reason to make a working example)

    You said that your example was similar to one on page 700 of the spatstat book which does work. In that case, a good strategy is to modify your example to make it as similar as possible to the example that works, because this will narrow down the possible cause.

    A working example of the problem, similar to the one in the book, is:

    Str <- hyperframe(str=with(simba, Strauss(mean(nndist(Points)))))
    fit1 <- mppm(Points ~ group, simba, interaction=Str, iformula=~str:group)
    fit0 <- mppm(Points ~ group, simba)
    anova(fit0, fit1, test="Chi")
    

    which yields the same error Error: Coefficient ‘str’ is missing from new.coef

    The simplest way to avoid this is to replace the interaction formula ~str:group by str+str:group:

    fit1x <- mppm(Points ~ group, simba, interaction=Str, 
               iformula = ~str + str:group)
    anova(fit0, fit1x, test="Chi")
    

    or in your example

    fittest8X <- mppm(Points ~ Subhabitat, H, interaction=Int, 
               iformula=~str + str:Area)
    anova(fittest8X, fitex, test="Chi")
    

    Note that fittest8X and fittest8 are equivalent models but are expressed in a slightly different way.

    The interaction formula and the trend formula are connected in a complicated way and the software is not always successful in disentangling them. If you get this kind of problem again, try different versions of the interaction formula.