[R-sig-Geo] Converting nb list containing areas with no neighbours with nb2WB()

Roger Bivand Roger.Bivand at nhh.no
Thu Nov 26 08:45:13 CET 2009


On Thu, 26 Nov 2009, Xingli Giam wrote:

> Hi Roger, your patch is excellent! Thank you for your help!

Thanks, new release on its way to CRAN.

Roger

>
> Your patch works fine with WinBUGS and I attempted to adapt it to the
> listw2WB() function. It works well so far.
>
> listw2WB <- function (listw)
> {
>    if (!inherits(listw, "listw"))
>        stop("not listw class object")
>    num <- card(listw$neighbours)
>    if (any(num == 0)) listw$neighbours[num == 0] <- NULL
>    adj <- unlist(listw$neighbours)
>    weights <- unlist(listw$weights)
>    list(adj = adj, weights = weights, num = num)
> }
>
> Thanks, Roger and Virgilio, for your timely advice!
>
> Best regards,
> Xingli
>
> -----Original Message-----
> From: Roger Bivand [mailto:Roger.Bivand at nhh.no]
> Sent: Wednesday, 25 November, 2009 6:20 AM
> To: Xingli Giam
> Cc: 'Virgilio Gómez-Rubio'; R-sig-Geo at stat.math.ethz.ch
> Subject: Re: [R-sig-Geo] Converting nb list containing areas with no
> neighbours with nb2WB()
>
> On Wed, 25 Nov 2009, Xingli Giam wrote:
>
>> Hi Virgilio,
>>
>> Thank you for your clear and very quick reply. I really appreciate your
> help
>> in looking at my data.
>
> The problem is caused by the nb object encoding no-neighbour status with
> an integer vector of length 1 containing 0. Please try this patched
> version:
>
> nb2WB <- function(nb)
> {
>   	if (!inherits(nb, "nb")) stop("not a neighbours list")
>         num <- card(nb)
>         if (any(num == 0)) nb[num == 0] <- NULL
>         adj <- unlist(nb)
>         weights <- rep(1, sum(num))
>
>         list(adj=adj, weights=weights, num=num)
> }
>
> It works for me so far, and num now contains the correct 0 for observation
> 233. I haven't tried it with WinBUGS though.
>
> Hope this helps,
>
> Roger
>
>>
>> Here is my data and code, I hope it will be clear enough for you:
>>
>> rm(list=ls())
>>
>> library(spdep)
>> library(R2WinBUGS)
>>
>> S <- c(66.666667,  40.000000,  50.000000,  56.666667, 250.000000,
>> 66.666667, 183.333333,  50.000000,   7.000000, 106.666667,  90.000000,
>> 83.333333, 100.000000,
>> 5.500000, 146.666667, 100.000000, 160.000000,  70.000000, 160.000000,
>> 183.333333,  70.000000, 133.333333, 130.000000,  73.333333,  93.333333,
>> 31.666667,
>> 183.333333, 116.666667, 116.666667, 200.000000, 110.000000, 120.000000,
>> 50.000000,  70.000000, 133.333333, 133.333333, 106.666667,  66.666667,
>> 106.666667,
>> 133.333333,   9.333333,  90.000000,  33.333333,  66.666667, 200.000000,
>> 106.666667,  90.000000,  31.666667, 110.000000,  50.000000, 100.000000,
>> 120.000000,
>> 110.000000, 136.666667,  31.666667,  93.333333,  70.000000, 110.000000,
>> 60.900000, 333.333333, 133.333333,  83.333333,  83.333333, 100.000000,
>> 36.666667,
>> 66.666667,  86.666667,   7.333333,  53.333333,  50.000000,  96.666667,
>> 100.000000,  60.000000,  33.333333,  60.000000, 183.333333, 133.333333,
>> 116.666667,
>> 126.666667,  50.000000, 166.666667,  50.000000,  12.666667, 100.000000,
>> 50.000000,  66.666667, 143.333333,  83.333333, 126.666667,  73.333333,
>> 45.966667,
>> 76.666667,  93.333333, 100.000000, 233.333333,  50.000000,  76.666667,
>> 116.666667,  93.333333,  46.666667,  90.000000, 106.666667,  36.666667,
>> 233.333333,
>> 26.666667,  13.333333, 216.666667,  76.666667, 110.000000, 133.333333,
>> 46.666667,  66.666667,  73.333333,  46.666667,  53.333333, 250.000000,
>> 116.666667,
>> 66.666667,  53.333333,  26.666667, 133.333333,  26.666667,  23.333333,
>> 70.000000,  66.666667, 116.666667, 100.000000,  66.666667,  90.000000,
>> 100.000000,
>> 150.000000,  50.000000, 166.666667, 200.000000, 200.000000,  50.000000,
>> 300.000000,  63.333333, 150.000000,  11.666667, 136.666667, 116.666667,
>> 126.666667,
>> 83.333333, 300.000000,  10.666667, 123.333333, 183.333333, 110.000000,
>> 116.666667, 216.666667, 110.000000,   2.666667, 266.666667, 266.666667,
>> 83.333333,
>> 126.666667, 106.666667, 266.666667, 216.666667,  93.333333, 266.666667,
>> 166.666667,  50.000000, 200.000000, 183.333333, 150.000000, 116.666667,
>> 106.666667,
>> 133.333333, 150.000000, 233.333333, 216.666667,  33.333333, 216.666667,
>> 106.666667,  56.666667,  63.333333,  23.333333, 216.666667, 100.000000,
>> 83.333333,
>> 216.666667, 216.666667,  60.000000, 166.666667, 166.666667, 100.000000,
>> 53.333333, 300.000000,  91.666667, 136.666667, 233.333333,  34.466667,
>> 116.666667,
>> 283.333333, 283.333333, 166.666667,  96.666667, 150.000000,  70.000000,
>> 4.000000, 216.666667, 135.000000, 150.000000, 200.000000,  90.000000,
>> 176.666667,
>> 53.333333, 166.666667,  53.333333,  60.000000,  38.333333,   1.666667,
>> 4.333333,   3.666667,  48.333333,  31.166667,   3.766667,  10.600000,
>> 16.666667,
>>  5.833333,   1.000000,  25.833333,  20.766667,  16.000000,   4.666667,
>> 5.000000,   1.666667, 116.666667, 200.000000)
>>
>> A <- c(
>>   233.222222,   832.888889,   312.222222,   954.000000, 19025.555556,
>> 2971.666667,  1827.777778,   267.444444,     1.555556,   178.666667,
>> 3879.555556,
>>  1342.333333,  1613.666667,     4.666667, 14959.555556,  2576.000000,
>> 3621.777778,  2141.777778,  3966.666667,  8559.333333, 11054.777778,
>> 13593.111111,
>> 12867.777778,  8385.777778,   464.444444,  1461.777778,  2427.888889,
>> 8562.222222, 11489.333333, 20980.111111,  4208.777778, 45875.777778,
>> 228.555556,
>>  2292.111111,  5760.000000,  7244.333333,  2617.333333, 10257.222222,
>> 20988.333333, 27526.000000,    34.444444,  3436.000000,   340.111111,
>> 1975.444444,
>> 12417.777778, 22108.000000,  3349.555556,   548.000000,   126.777778,
>> 1593.666667,  7449.222222, 59007.444444, 12461.222222, 48021.111111,
>> 114.666667,
>> 16273.666667, 14228.888889, 22691.777778,   632.888889, 47287.000000,
>> 12786.444444,  7463.555556,  6290.333333,  4897.111111,  4317.555556,
>> 2259.666667,
>>  3290.777778,    14.888889, 37796.777778,  1758.777778,  5962.888889,
>> 3872.888889,  4236.111111,  1678.555556, 15323.333333, 73588.000000,
>> 13239.777778,
>> 28167.666667,  7953.888889,   919.222222, 10541.888889,  3925.666667,
>> 60.222222,  4625.444444,   718.888889,  2013.333333, 11629.666667,
>> 1119.888889,
>> 15027.222222,  7370.222222,   187.555556,  5338.222222,  3425.000000,
>> 5228.111111, 48429.888889,  1866.000000,  4667.777778,  5974.888889,
>> 2502.444444,
>>  2469.777778,  1586.444444,  1899.666667,   401.111111, 13882.666667,
>> 1191.555556,     3.444444, 24858.222222,  2630.666667,  2505.000000,
>> 5146.000000,
>>  4067.000000,  1388.888889,   340.666667,   258.444444,  1999.444444,
>> 28698.666667,  8068.666667,  9680.000000,  8467.222222,  1613.888889,
>> 10770.000000,
>>  2880.666667,  3251.333333, 29182.555556,  2907.888889,  4609.000000,
>> 1721.000000,   451.555556,   285.555556,  3702.444444, 23963.666667,
>> 872.222222,
>> 12145.000000, 25471.222222, 10025.444444,   530.666667, 20373.111111,
>> 2528.111111,  3546.111111,    10.555556,  9938.888889,  1472.333333,
>> 639.888889,
>>   230.777778,  8145.000000,     2.777778,  1586.888889,  7508.555556,
>> 1211.111111,  2371.000000, 11340.222222,   336.777778,     2.111111,
>> 16218.111111,
>> 52904.000000,  1097.888889,  5090.444444, 12722.888889,  6484.333333,
>> 3241.777778,   918.888889, 29827.111111, 26832.555556,   109.555556,
>> 79631.333333,
>> 11622.000000,  8493.333333,  9811.666667, 15737.222222, 45812.666667,
>> 7389.555556, 27843.444444, 22325.777778,  1112.333333,  8978.444444,
>> 841.888889,
>>  3114.222222,  1905.888889,   854.444444, 53653.222222,  1944.666667,
>> 2510.777778, 20662.333333, 16510.555556,   833.777778, 19640.000000,
>> 19251.222222,
>> 10665.111111,   529.555556, 11623.333333,   432.222222,  1246.444444,
>> 18547.888889,   230.111111,  8350.000000, 82961.444444,  1808.222222,
>> 37233.222222,
>>  5630.555556, 21418.444444,   524.666667,     1.000000, 52227.555556,
>> 12715.888889,  3252.111111,  7660.666667,   549.111111,  3772.666667,
>> 223.777778,
>> 29452.444444,  7720.222222, 25537.333333,    64.222222,    68.000000,
>> 23.555556,    59.000000,  1285.777778,   746.444444,     3.777778,
>> 119.333333,
>>    10.666667,    51.111111,    19.777778,   342.555556,   180.000000,
>> 104.222222,   104.777778,    15.777778,    10.333333, 29903.555556,
>> 26650.444444)
>>
>> x_long <- c(
>> 146.97,  131.53,  135.88,  126.63,  140.71,  128.14,  146.65,  136.08,
>> 159.09,  153.49,  151.11,  151.42,  165.57,  167.95,  143.25,  139.42,
>> 145.73,  129.35,  155.24,
>> 148.32,  138.58,  140.60,  121.05,  120.12,  151.03,  166.70,  133.12,
>> 134.16,   29.68,   11.29,   10.20,   21.04,   44.25,    7.41,    8.59,
>> 35.30,   35.83,   21.10,
>>  -2.71,   38.95,   55.46,  -12.15,   23.37,   30.48,   48.59,   47.03,
>> 32.74,   55.55,    9.16,    6.47,    4.66,   24.46,   39.59,   14.95,
>> 6.54,   40.02,   17.02,
>>  -9.93,   92.81,  112.82,  113.89,  111.30,   94.31,  102.97,  100.65,
>> 99.71,   93.96,  105.69,   81.42,  113.36,  112.43,  122.98,   82.27,
>> 95.66,   96.06,  114.19,
>>  98.13,   87.67,  101.55,  122.25,  122.08,   74.89,  120.18,   91.87,
>> 98.94,  124.72,  125.83,  120.94,   92.82,   96.22,   93.32,   73.53,
>> 73.95,  105.21,  100.91,
>> 102.69,  100.95,   96.88,  105.81,   85.78,  119.01,  101.41,  103.31,
>> 102.28,  105.82,  115.83,  108.12,   77.03,   76.73,  107.36,  116.59,
>> 80.19,   80.83,  120.00,
>> 101.54,  101.05,  100.22,  102.84,  116.12,   89.33,   99.11,  104.90,
>> 105.10,   80.75,  108.34,  109.41,  109.65,  127.98,  120.62,  121.03,
>> -51.31,  -50.19,  -39.70,
>> -41.85,  -66.43,  -40.89,  -72.04,  -72.66,  -76.01,  -81.70,  -84.67,
>> -89.61,  -92.80,  -94.19,  -76.97,  -87.06,  -66.22,  -72.12,  -84.96,
>> -75.44,  -78.26,  -77.38,
>> -32.44,  -63.22,  -56.99,  -53.74,  -70.09,  -74.28,  -83.65,  -82.28,
>> -77.28,  -65.21,  -66.22,  -61.67,  -60.03,  -74.50,  -75.10,  -50.51,
>> -43.91,  -52.68,  -61.65,
>> -75.73,  -66.26,  -42.98,  -77.11,  -96.74,  -61.10,  -92.28,  -55.58,
>> -52.62,  -35.72,  -36.34,  -73.49,  -90.33,  -66.34,  -69.45,  -63.36,
>> -68.78,  -73.89,  -48.74,
>> -94.94,  -92.28,  -70.32,  -80.39,  -64.96,  -69.17,  -82.77,  -54.90,
>> -65.46,  -47.11,  -61.21,  -30.32,  -56.78,  -76.19,  -70.41,  -98.21,
>> -98.39,  -79.52,  -61.03,
>> -50.30,  -89.02,  -63.97,  158.22, -157.66, -159.77,  173.02,  179.31,
>> -155.31, -177.93, -138.98,  142.15,  134.56, -109.34, -172.48, -149.38,
>> -175.20, -146.36, -144.36,
>> -171.63,  107.97,  102.87)
>>
>>
>> y_lat <- c(
>> -2.10,  -7.56,  -0.92,  -3.49,  -5.21,   0.65,  -6.08,  -1.72, -31.56,
>> -11.48,  -5.22,  -5.48, -21.31, -29.04,  -4.28,  -2.79, -17.47,  -3.33,
>> -5.94,  -8.72,  -7.48,
>> -6.23,  -1.97,  -2.42,  -9.95, -15.14,  -1.04,  -2.46,  -1.93,  -0.75,
>> 5.64,  -1.17, -12.18,   5.53,   5.07,   0.00,  -8.26,  -0.30,   7.61,
>> 13.13,  -4.67,  11.23,
>> -33.98, -30.38, -19.27, -18.60, -26.36, -21.11,   4.23,   5.17,   6.78,
>> 0.96,  -3.94,   1.01,   0.13, -13.60,   0.43,   7.18,  12.53,   1.49,
>> 2.07,   2.04,  26.93,
>> 11.69,  15.11,  14.32,  21.29, -10.45,  19.93,  -8.02,  -7.59,  10.02,
>> 28.07,  16.88,  20.26,  26.03,  17.76,  24.04,  18.06,  16.82,  16.61,
>> 13.19,  13.77,  25.79,
>> -1.36,   7.89,   7.69,  12.68,  22.26,  18.72,   8.00,  17.17,  16.39,
>> 17.75,  23.05,  17.75,  18.58,  26.34,  18.34,  20.23,  10.07,   4.62,
>> 3.11,   4.08,  20.86,
>> 10.72,  22.15,  10.54,  10.63,  15.23,   0.42,   6.78,   6.98,   5.20,
>> 0.33,  -0.13,  -0.09,  -0.57,   0.05,  22.68,  11.11,  11.68,  10.34,
>> 27.65,  -7.10,  -6.95,
>> 19.56,  26.48,  22.38,  23.89, -26.65, -30.05, -16.45, -16.90, -15.69,
>> -3.96,   0.64,   8.80,   4.84,  12.54,  14.05,  15.18,  17.09,  16.65,
>> 5.51,   5.53,   9.99,
>>  6.26,  10.43,  20.42,  -2.04,   8.34,  -3.86,   4.00,   4.89,  -2.00,
>> 19.09,  -5.35,  10.22,   8.52,  18.18,  -0.54,  -5.88,  16.16,  -8.90,
>> 5.38,   7.75,  -1.12,
>> -4.26, -10.02,  -6.00,  -1.52,   1.89,  -2.75,   2.51,  17.82,   9.06,
>> 18.16,   5.72, -23.25,  -8.73,  -8.79, -11.89,  17.10,  18.24,  -3.99,
>> -6.58,   0.81,  10.74,
>> -25.75,  18.34,  15.15,  -2.28,  25.66, -23.59, -10.48,   9.11,  -6.16,
>> 5.63,  -3.04,  10.69, -20.50,  -0.20,  -7.38,   8.80,  21.79,  20.64,
>> -0.53,  14.66,  -5.78,
>> 19.67,   3.79,   6.88,   1.88, -21.23,   1.83, -16.58,  19.77, -29.27,
>> -9.78,  26.66,   7.53, -27.13, -13.62, -17.69, -21.17, -16.18, -27.61,
>> -2.82,  27.93,  26.11)
>>
>> coords <- cbind(x_long, y_lat)
>>
>> nb2000 <- dnearneigh(coords, 0, 2000, longlat=T)
>> nb2000weights <- nb2WB(nb2000)
>>
>> # find zero integer value in nb2000weights adj matrix
>> zero.int <- (1:length(nb2000weights$adj))[nb2000weights$adj==0]
>> zero.int
>>
>> # testing if nb2000weights adj and weights matrix is of the same length (#
>> Yes)
>> length(nb2000weights$adj)
>> length(nb2000weights$weights)
>>
>> N=length(A)
>>
>> d <-  list(sp = S, area_km2 = A, N=N, adj=nb2000weights$adj,
>> weights=nb2000weights$weights, num=nb2000weights$num)
>>
>> init1 = list(c=runif(1,0.5,1.5)*12, z=runif(1,0.5,1.5)*0.26,
>> prec=runif(1,0.01,100), tau=1, b=c(rep(0, N)))
>> init2 = list(c=runif(1,0.5,1.5)*12, z=runif(1,0.5,1.5)*0.26,
>> prec=runif(1,0.01,100), tau=1, b=c(rep(0, N)))
>> init3 = list(c=runif(1,0.5,1.5)*12, z=runif(1,0.5,1.5)*0.26,
>> prec=runif(1,0.01,100), tau=1, b=c(rep(0, N)))
>> inits = list(init1,init2,init3)
>>
>> powerdat1lg.bugs <- bugs(data=d, inits,
>> model.file="C:/WinBUGS/CARlogcodes/powerbuglnorm.txt",
>> parameters = c("c", "z", "sp.rep", "b"),
>> n.chains =3, n.iter = 32500, n.burnin = 7500, n.sims=3000,
>> bugs.directory ="c:/Program Files/WinBUGS14/", debug=T)
>>
>> ____________________________________________
>>
>> Here is my WinBUGS model file code
>> "C:/WinBUGS/CARlogcodes/powerbuglnorm.txt":
>>
>> model
>> {
>>
>> 	for (i in 1:N) # for each ecoreg in biome 1
>> 	{
>>
>> 	S[i] <- c*(pow(area_km2[i] , z)) + b[i]
>>
>> 	logS[i] <- log(max(0.001,S[i]))
>>
>> 	sp[i] ~ dlnorm(logS[i],prec)
>>
>> 	sp.rep [i] <- max(0.001, (c*pow(area_km2[i],z) + b[i]))
>>
>> 	}
>>
>> 	# CAR prior distribution for random effects
>>
>> 	b[1:N] ~ car.normal(adj[], weights[], num[], tau)
>>
>> 	c ~ dnorm(0,0.0000001)I(0,)
>>
>> 	z ~ dnorm(0,0.0000001)I(0,)
>>
>> 	prec ~ dgamma(0.001,0.001)
>>
>> 	tau ~ dgamma(0.001,0.001)
>>
>> 	}
>>
>> Many thanks,
>> Xingli
>>
>>
>> -----Original Message-----
>> From: Virgilio Gómez-Rubio [mailto:Virgilio.Gomez at uclm.es]
>> Sent: Wednesday, 25 November, 2009 3:27 AM
>> To: Xingli Giam
>> Cc: R-sig-Geo at stat.math.ethz.ch
>> Subject: Re: [R-sig-Geo] Converting nb list containing areas with no
>> neighbours with nb2WB()
>>
>> Hi,
>>
>>
>>> I checked the adjacency matrix of the spatial weights list output object,
>>> and a zero integer was placed at the position corresponding to the area
>> with
>>> no neighbours.
>>
>> Yes. Probably we need to fix this so that nothing is added when an area
>> has no neighbours.
>>
>>> When I re-ran the analysis after I changed my neighbourhood structure
> such
>>> that all areas had neighbours, the WinBUGS simulation ran fine.
>>>
>>> Is there a way to format the spatial weights list object via nb2WB() in a
>>> way that allows WinBUGS to read cases with no neighbours?
>>
>> It should be done automatically, but probably we forgot to consider the
>> case of areas with no neighbours.
>>
>> Could it be possible to see the map that you are using? I'd say that
>> there is a mismatch between the number of neighbours and the number of
>> weights, but I would need to check with you data and code.
>>
>>
>> Best wishes,
>>
>> Virgilio
>>
>> _______________________________________________
>> R-sig-Geo mailing list
>> R-sig-Geo at stat.math.ethz.ch
>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>
>
>

-- 
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Helleveien 30, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no


More information about the R-sig-Geo mailing list