Producing a conditional adjacency matrix

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

Producing a conditional adjacency matrix

Rhys Dubin
Hi all,

I have a question regarding matrices (produced using poy2nb in spdep).

I’m trying to produce an adjacency matrix from a GIS Polygon shapefile with about 500 individual polygons (queen or rook — it doesn’t really matter for now), but conditional on the value of the parent polygon.

For instance, if a polygon had an arbitrary value of 1, I want to return a list of all neighboring polygons that have a value of 2 or 3 (ie. ≠ 1). The same would go for a polygon with a value of 2 (ie. return all neighbors with a value of ≠ 2).

Is there a solution to this issue built into spdep, do I need to use a different package, or is it possible to accomplish this with a subsetting command?

Thanks!

Rhys


_______________________________________________
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: Producing a conditional adjacency matrix

Roger Bivand
Administrator
On Mon, 30 Sep 2019, Rhys Dubin wrote:

> Hi all,
>
> I have a question regarding matrices (produced using poy2nb in spdep).
>
> I’m trying to produce an adjacency matrix from a GIS Polygon shapefile
> with about 500 individual polygons (queen or rook — it doesn’t really
> matter for now), but conditional on the value of the parent polygon.
>
> For instance, if a polygon had an arbitrary value of 1, I want to return
> a list of all neighboring polygons that have a value of 2 or 3 (ie. ≠
> 1). The same would go for a polygon with a value of 2 (ie. return all
> neighbors with a value of ≠ 2).
>
> Is there a solution to this issue built into spdep, do I need to use a
> different package, or is it possible to accomplish this with a
> subsetting command?
No built-in solution, but to make progress a clear, reproducible example
is essential, otherwise we're guessing what you want. For example, add a
doctored variable to the eire or columbus data sets to show your needs. Do
you want a glist including (1) all neighbours j with a value of x not
equal to x[i], and excluding (0) all with x[j] == x[i]?

Roger

>
> Thanks!
>
> Rhys
>
>
> _______________________________________________
> R-sig-Geo mailing list
> [hidden email]
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
--
Roger Bivand
Department of Economics, Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; e-mail: [hidden email]
https://orcid.org/0000-0003-2392-6140
https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en
_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Roger Bivand
Department of Economics
Norwegian School of Economics
Helleveien 30
N-5045 Bergen, Norway
Reply | Threaded
Open this post in threaded view
|

Re: Producing a conditional adjacency matrix

Rhys Dubin
Hi Roger,

Including a bit more detail below (my apologies if this is just complete gibberish — first time posting to a forum like this):

First, I add a random ID variable to the columbus dataset indicating the variable I’d like to base my exclusions on in the final neighbor list:
> columbus$ID <- sample(1:3, nrow(columbus), replace=T)

In my case, that produced the following IDs for the first 4 polyids:

POLYID 1: 3
POLYID 2: 2
POLYID 3: 3
POLYID 4: 1

Second, col.ga.nb indicates that each of the previous POLYID’s has the following neighbors

> View(col.gal.nb)

POLYID 1 (w new assigned ID of 3): 2, 3
POLYID 2 (“ “ 2): 1, 3, 4
POLYID 3 (“ “ 3): 1, 2, 4, 5
POLYID 4 (“ “ 1): 2, 3, 5, 8

Third (or brevity’s sake) looking only at POLYID 1 (with new ID = 3):

Its neighbors from col.ga.nb (POLYID 2 and 3) have ID values of 3 and 1 respectively

My end goal would be to produce a new list in which POLYID 1’s only neighbor is POLYID 3 (with an ID of 1). POLYID 2 would be excluded, as its ID value matches its parent.

The same would be true of each subsequent polygon.

In essence, the same format you mentioned at the end of your reply: a glist including all neighbors j with a value of x not equal to x[i], and excluding all with x[j] == x[i].

Best,

Rhys


> On Oct 1, 2019, at 1:22 PM, Roger Bivand <[hidden email]> wrote:
>
> On Mon, 30 Sep 2019, Rhys Dubin wrote:
>
>> Hi all,
>>
>> I have a question regarding matrices (produced using poy2nb in spdep).
>>
>> I’m trying to produce an adjacency matrix from a GIS Polygon shapefile with about 500 individual polygons (queen or rook — it doesn’t really matter for now), but conditional on the value of the parent polygon.
>>
>> For instance, if a polygon had an arbitrary value of 1, I want to return a list of all neighboring polygons that have a value of 2 or 3 (ie. ≠ 1). The same would go for a polygon with a value of 2 (ie. return all neighbors with a value of ≠ 2).
>>
>> Is there a solution to this issue built into spdep, do I need to use a different package, or is it possible to accomplish this with a subsetting command?
>
> No built-in solution, but to make progress a clear, reproducible example is essential, otherwise we're guessing what you want. For example, add a doctored variable to the eire or columbus data sets to show your needs. Do you want a glist including (1) all neighbours j with a value of x not equal to x[i], and excluding (0) all with x[j] == x[i]?
>
> Roger
>
>>
>> Thanks!
>>
>> Rhys
>>
>>
>> _______________________________________________
>> R-sig-Geo mailing list
>> [hidden email]
>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>
> --
> Roger Bivand
> Department of Economics, Norwegian School of Economics,
> Helleveien 30, N-5045 Bergen, Norway.
> voice: +47 55 95 93 55; e-mail: [hidden email]
> https://orcid.org/0000-0003-2392-6140
> https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en

_______________________________________________
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: Producing a conditional adjacency matrix

Roger Bivand
Administrator
On Tue, 1 Oct 2019, Rhys Dubin wrote:

> Hi Roger,
>
> Including a bit more detail below (my apologies if this is just complete gibberish — first time posting to a forum like this):
>
> First, I add a random ID variable to the columbus dataset indicating the variable I’d like to base my exclusions on in the final neighbor list:
>> columbus$ID <- sample(1:3, nrow(columbus), replace=T)
>
> In my case, that produced the following IDs for the first 4 polyids:
>
> POLYID 1: 3
> POLYID 2: 2
> POLYID 3: 3
> POLYID 4: 1
>
> Second, col.ga.nb indicates that each of the previous POLYID’s has the following neighbors
>
>> View(col.gal.nb)
>
> POLYID 1 (w new assigned ID of 3): 2, 3
> POLYID 2 (“ “ 2): 1, 3, 4
> POLYID 3 (“ “ 3): 1, 2, 4, 5
> POLYID 4 (“ “ 1): 2, 3, 5, 8
>
> Third (or brevity’s sake) looking only at POLYID 1 (with new ID = 3):
>
> Its neighbors from col.ga.nb (POLYID 2 and 3) have ID values of 3 and 1 respectively
>
> My end goal would be to produce a new list in which POLYID 1’s only neighbor is POLYID 3 (with an ID of 1). POLYID 2 would be excluded, as its ID value matches its parent.
Leave col.gal.nb as it is, and generate a list of general weights:

> library(spdep)
Loading required package: sp
Loading required package: spData
Loading required package: sf
Linking to GEOS 3.7.2, GDAL 3.0.1, PROJ 6.2.0
> data(columbus, package="spData")
> ls()
[1] "bbs"        "col.gal.nb" "columbus"   "coords"     "polys"
> col.gal.nb[[1]]
[1] 2 3
> set.seed(1)
> columbus$ID <- sample(1:3, nrow(columbus), replace=T)
> columbus$ID[1]
[1] 1
> columbus$ID[col.gal.nb[[1]]]
[1] 3 1 # second entry equal
> glist <- lapply(seq(along=col.gal.nb), function(i)
   as.integer(columbus$ID[i] != columbus$ID[col.gal.nb[[i]]]))
> glist[[1]]
[1] 1 0 # second weight zero

From there use nb2listw() to generate weights if that is what you need.
lapply() is always worth learning - do not use View() on objects that are
not data.frames or matrices, it either tells nothing or is misleading.

Hope this clarifies,

Roger

>
> The same would be true of each subsequent polygon.
>
> In essence, the same format you mentioned at the end of your reply: a
> glist including all neighbors j with a value of x not equal to x[i], and
> excluding all with x[j] == x[i].
>
> Best,
>
> Rhys
>
>
>> On Oct 1, 2019, at 1:22 PM, Roger Bivand <[hidden email]> wrote:
>>
>> On Mon, 30 Sep 2019, Rhys Dubin wrote:
>>
>>> Hi all,
>>>
>>> I have a question regarding matrices (produced using poy2nb in spdep).
>>>
>>> I’m trying to produce an adjacency matrix from a GIS Polygon shapefile with about 500 individual polygons (queen or rook — it doesn’t really matter for now), but conditional on the value of the parent polygon.
>>>
>>> For instance, if a polygon had an arbitrary value of 1, I want to return a list of all neighboring polygons that have a value of 2 or 3 (ie. ≠ 1). The same would go for a polygon with a value of 2 (ie. return all neighbors with a value of ≠ 2).
>>>
>>> Is there a solution to this issue built into spdep, do I need to use a different package, or is it possible to accomplish this with a subsetting command?
>>
>> No built-in solution, but to make progress a clear, reproducible example is essential, otherwise we're guessing what you want. For example, add a doctored variable to the eire or columbus data sets to show your needs. Do you want a glist including (1) all neighbours j with a value of x not equal to x[i], and excluding (0) all with x[j] == x[i]?
>>
>> Roger
>>
>>>
>>> Thanks!
>>>
>>> Rhys
>>>
>>>
>>> _______________________________________________
>>> R-sig-Geo mailing list
>>> [hidden email]
>>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>
>> --
>> Roger Bivand
>> Department of Economics, Norwegian School of Economics,
>> Helleveien 30, N-5045 Bergen, Norway.
>> voice: +47 55 95 93 55; e-mail: [hidden email]
>> https://orcid.org/0000-0003-2392-6140
>> https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en
>
>
--
Roger Bivand
Department of Economics, Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; e-mail: [hidden email]
https://orcid.org/0000-0003-2392-6140
https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en
_______________________________________________
R-sig-Geo mailing list
[hidden email]
https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Roger Bivand
Department of Economics
Norwegian School of Economics
Helleveien 30
N-5045 Bergen, Norway
Reply | Threaded
Open this post in threaded view
|

Re: Producing a conditional adjacency matrix

Rhys Dubin
Thank you so much Roger! Works like a charm.

Rhys

On Oct 1, 2019, at 3:38 PM, Roger Bivand <[hidden email]<mailto:[hidden email]>> wrote:

On Tue, 1 Oct 2019, Rhys Dubin wrote:

Hi Roger,

Including a bit more detail below (my apologies if this is just complete gibberish — first time posting to a forum like this):

First, I add a random ID variable to the columbus dataset indicating the variable I’d like to base my exclusions on in the final neighbor list:
columbus$ID <- sample(1:3, nrow(columbus), replace=T)

In my case, that produced the following IDs for the first 4 polyids:

POLYID 1: 3
POLYID 2: 2
POLYID 3: 3
POLYID 4: 1

Second, col.ga.nb indicates that each of the previous POLYID’s has the following neighbors

View(col.gal.nb)

POLYID 1 (w new assigned ID of 3): 2, 3
POLYID 2 (“ “ 2): 1, 3, 4
POLYID 3 (“ “ 3): 1, 2, 4, 5
POLYID 4 (“ “ 1): 2, 3, 5, 8

Third (or brevity’s sake) looking only at POLYID 1 (with new ID = 3):

Its neighbors from col.ga.nb (POLYID 2 and 3) have ID values of 3 and 1 respectively

My end goal would be to produce a new list in which POLYID 1’s only neighbor is POLYID 3 (with an ID of 1). POLYID 2 would be excluded, as its ID value matches its parent.

Leave col.gal.nb as it is, and generate a list of general weights:

library(spdep)
Loading required package: sp
Loading required package: spData
Loading required package: sf
Linking to GEOS 3.7.2, GDAL 3.0.1, PROJ 6.2.0
data(columbus, package="spData")
ls()
[1] "bbs"        "col.gal.nb" "columbus"   "coords"     "polys"
col.gal.nb[[1]]
[1] 2 3
set.seed(1)
columbus$ID <- sample(1:3, nrow(columbus), replace=T)
columbus$ID[1]
[1] 1
columbus$ID[col.gal.nb[[1]]]
[1] 3 1 # second entry equal
glist <- lapply(seq(along=col.gal.nb), function(i)
 as.integer(columbus$ID[i] != columbus$ID[col.gal.nb[[i]]]))
glist[[1]]
[1] 1 0 # second weight zero

From there use nb2listw() to generate weights if that is what you need. lapply() is always worth learning - do not use View() on objects that are not data.frames or matrices, it either tells nothing or is misleading.

Hope this clarifies,

Roger


The same would be true of each subsequent polygon.

In essence, the same format you mentioned at the end of your reply: a glist including all neighbors j with a value of x not equal to x[i], and excluding all with x[j] == x[i].

Best,

Rhys


On Oct 1, 2019, at 1:22 PM, Roger Bivand <[hidden email]<mailto:[hidden email]>> wrote:

On Mon, 30 Sep 2019, Rhys Dubin wrote:

Hi all,

I have a question regarding matrices (produced using poy2nb in spdep).

I’m trying to produce an adjacency matrix from a GIS Polygon shapefile with about 500 individual polygons (queen or rook — it doesn’t really matter for now), but conditional on the value of the parent polygon.

For instance, if a polygon had an arbitrary value of 1, I want to return a list of all neighboring polygons that have a value of 2 or 3 (ie. ≠ 1). The same would go for a polygon with a value of 2 (ie. return all neighbors with a value of ≠ 2).

Is there a solution to this issue built into spdep, do I need to use a different package, or is it possible to accomplish this with a subsetting command?

No built-in solution, but to make progress a clear, reproducible example is essential, otherwise we're guessing what you want. For example, add a doctored variable to the eire or columbus data sets to show your needs. Do you want a glist including (1) all neighbours j with a value of x not equal to x[i], and excluding (0) all with x[j] == x[i]?

Roger


Thanks!

Rhys


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

--
Roger Bivand
Department of Economics, Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; e-mail: [hidden email]<mailto:[hidden email]>
https://orcid.org/0000-0003-2392-6140
https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en



--
Roger Bivand
Department of Economics, Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; e-mail: [hidden email]<mailto:[hidden email]>
https://orcid.org/0000-0003-2392-6140
https://scholar.google.no/citations?user=AWeghB0AAAAJ&hl=en


        [[alternative HTML version deleted]]

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