[R] MRF smoothers in MGCV - specifying neighbours

Simon Wood s.wood at bath.ac.uk
Thu May 8 15:15:02 CEST 2014


Hi Mark,

I'm not sure what is happening here - there is no chance that nb.l 
contains a neighbourhood not in the levels of obs$xy.idx, I suppose? 
i.e. is

all(names(nb.l)%in%levels(obs$xy.idx))

also TRUE? Here is some code illustrating what nb should look like (and 
in response to Roger Bivand's suggestion I also tried this replacing all 
the labels with things like "x/y", but it still works).


## example mrf fit using polygons....
library(mgcv)
## Load Columbus Ohio crime data (see ?columbus for details and credits)
data(columb)       ## data frame
data(columb.polys) ## district shapes list
xt <- list(polys=columb.polys) ## neighbourhood structure info for MRF
par(mfrow=c(2,2))
## First a full rank MRF...
b0 <- gam(crime ~ s(district,bs="mrf",xt=xt),data=columb,method="REML")

## same fit based on direct neighbour spec...
nb <- mgcv:::pol2nb(columb.polys)$nb
xt <- list(nb=nb)
b <- gam(crime ~ s(district,bs="mrf",xt=xt),data=columb,method="REML")

best,
Simon



On 08/05/14 01:58, Mark Payne wrote:
> Hi,
>
> Does anyone have an example of a Markov Random Field smoother (MRF) in MGCV
> where they have specified the neighbourhood directly, rather than supplying
> polygons? Does anyone understand how the rules should be? Based on the
> columb example, I have setup my data set and neighbourhood like so:
>
>> head(nb.l)
> $`10/10`
> [1] 135 155 153
>
> $`10/2`
> [1] 27  8  6
>
> $`10/3`
> [1] 48  7 28 26
>
> $`10/4`
> [1] 69 27 49 47
>
> $`10/5`
> [1] 48 70 68
>
> $`10/7`
> [1] 115  95  93
>
>> head(obs)
>              x          y      truth x.idx y.idx xy.idx
> 24  1.4835147  0.8026673  2.3605204    13    10  13/10
> 26  1.0452111  0.4673685  1.8316741    11     8   11/8
> 43  2.1514977 -0.2640058 -2.8812026    17     5   17/5
> 46  2.8473951  0.5445714  3.6347799    20     9   20/9
> 53  1.7983253 -0.6905912 -2.5473984    15     3   15/3
> 86 -0.1839814 -0.7824026 -0.5776616     5     2    5/2
>>
>
> but get the following error:
>
>> mdl <- gam(truth ~
> s(xy.idx,bs="mrf",xt=list(nb=nb.l)),data=obs,method="REML")
> Error in smooth.construct.mrf.smooth.spec(object, dk$data, dk$knots) :
>    mismatch between nb/polys supplied area names and data area names
>
> However, there is a perfect match between the nb list names and the data
> area names:
>> all(levels(obs$xy.idx) %in% names(nb.l))
> [1] TRUE
>>
>
> Any suggestions where to start?
>
> Mark
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>


-- 
Simon Wood, Mathematical Science, University of Bath BA2 7AY UK
+44 (0)1225 386603               http://people.bath.ac.uk/sw283



More information about the R-help mailing list