[R-sig-Geo] [FORGED] Create a Spatial Weight Matrix based on road distance

Roger Bivand Roger@B|v@nd @end|ng |rom nhh@no
Sun Jun 23 12:00:44 CEST 2019


Comments inline below:

On Sun, 23 Jun 2019, Rolando Valdez wrote:

> I apologize for the lack of clarity.
>
> Let me try again:
>
> The SWM captures the spatial structure among territories. In the case of a
> matrix based on distance, you define a distance-threshold, say 50 km, and
> every territory under that distance is considered as neighbor, in the
> matrix, those territories considered neighbors take the value 1, and 0
> otherwise (territories beyond 50 km). This is what 'dnearneigh' function
> does.
>
> Then, I want to define a distance-threshold, say 50 km by road (not
> euclidean) and every territory under that distance (by road) be considered
> as neighbor.


So the main goal is to use distance by road between territories to 
construct a neighbour object, with a maximum distance threshold.

Firstly, why do you suppose that this will represent your a priori 
knowledge better than contiguity, which is the most obvious measure of 
neighbourhood for data with areal support?

If there are major mountain chains or water bodies impeding contact across 
a boundary between contiguous territories, could you not just edit out 
those graph edges (spdep::edit.nb() for example)? If there are many, a 
programmatic approach may be needed.

The inherent difficulty is that distances to territories in practice mean 
that you have to change support from area to point, and that needs 
thinking through. A territory centroid may, for example, not lie on a 
transport link. If you have finer scale population or production data, you 
might use weighted centroids, but this involves further steps, and using 
this kind of data may add endogeneity, as the variables used to define the 
neighbour object may enter your model elsewhere.

So:

I) explain why you cannot simply use contiguities (using accessibility as 
a covariate if important);

II) if some contiguities given territory boundaries should be removed 
because there are good reasons (mountain range, ...) for no contact, 
provide a reproducible example so that you can be assisted in programming 
the criteria for thinning the contiguity graph; and

III) if you really want to go with road distances, provide a reproducible 
example for first finding the representative point for each territory and 
then giving the road network and territory boundaries. With the linear 
network and the change-of-support points, it is not unlikely that the 
spatstat linnet route will be easiest to implement. I have used raster 
cost distances in GRASS for things like this (see the Snow example in ch. 
4 in ASDAR); gdistance is slower in that setting.

Hope this helps,

Roger

PS. It would be really helpful to use affiliations, as gmail addresses 
tell us nothing about what might be expected of background knowledge. This 
posting feels like someone looking for a response to a reviewer of an 
article submitted to a journal, where the reviewer has little idea of the 
underlying challenges involved in making such a revision. Not knowing 
this, and the lack of a reproducible example leaves helpers pretty much in 
the dark. Using existing or toy data sets lets you post without showing 
too much of the detail in your specific problem, but in this thread there 
has been too little information for reasonable traction.

>
> El sáb., 22 de jun. de 2019 a la(s) 21:15, Rolf Turner (
> r.turner using auckland.ac.nz) escribió:
>
>> On 23/06/19 3:30 PM, Rolando Valdez wrote:
>>> Sorry again.
>>>
>>> A Spatial Weight Matrix (swm) is an object used in spatial econometrics
>>> to characterize the spatial structure among territories. It is an
>>> element nxn where n is the number of territorial units (counties,
>>> districts, states, cities, regions) in the sample and it could be based
>>> on contiguity or distance. Usually, you can create a swm based on
>>> distance using 'dnearneigh' from spdep and then convert to a listw
>>> through 'nb2listw'. The problem is that the matrix that you generate
>>> trough 'dnearneigh'computes the euclidean distance among centroids of
>>> polygons. This is where I spot my issue, I need to compute the swm using
>>> the road distance instead of euclidean distance computed through
>>> 'dnearneigh'. I do have a shapefile with poligons (counties) and another
>>> shapefile with lines (roads).
>>
>> OK.  It's getting a *bit* clearer ....  You are interested in "road
>> distances" between counties.  I'm still not entirely sure what this
>> means.  Is it the *minimum* distance by road from one county to another?
>> In which case, if two counties are contiguous (adjacent) and there is a
>> road crossing the border between the two, is the distance between the
>> counties equal to zero?  (This doesn't seem like it would be
>> satisfactory ....)
>>
>> Yes, actually it is possible that two counties were connected by more than
> one road, however it's not a big deal. If I define a distance of 50 km, it
> doesn't matter how many times two counties are connected, I just need that
> they are at 50 km trough, at least, one road.
>
>> If this is not the case, then what *is* the case?  Perhaps you want
>> distances between the *centroids* of the counties.  What then do you
>> mean by road distance when the centroids do not lie on a road?
>>
>
> This is a big challenge, I'm still working on it.
>
>>
>> You apparently need to deal with counties in which there are no roads at
>> all.  To handle this you have to define what *you* mean by the distance
>> by road from county A to county B when there are no roads at all in
>> county B.  Perhaps infinity would be the appropriate distance, but *I*
>> don't know; you have to make the call.
>>
>
> If two counties are not connected through a road, they could not be
> neighbors. In this case, it would correspond to a value 0 in the matrix.
>
>>
>> Previously you indicated that you needed to know (pairwise) road
>> distances between specified points in a given set, and I showed you how
>> to obtain those using pairdist(), from spatstat.  Now it seems that you
>> want something rather different, and it's still not clear what.
>>
>> In a sense is the same, but you said so properly, We have different
> research fields.
>
>
>> You need to get *your* thoughts clear; make some definitions and
>> specifications, and decide what you really want or need.
>>
>
> I got it.
>
>>
>> It seems that you are expecting R to magically do your thinking for you;
>> it won't!
>>
>> No, I'm not expecting that.
>
>> cheers,
>>
>> Rolf
>>
>>> El sáb., 22 de jun. de 2019 a la(s) 20:00, Rolf Turner
>>> (r.turner using auckland.ac.nz <mailto:r.turner using auckland.ac.nz>) escribió:
>>>
>>>
>>>     On 23/06/19 2:38 PM, Rolando Valdez wrote:
>>>
>>>     > I am sorry, I was not clear enough. My goal is to calculate a
>>>     spatial
>>>     > weight matrix (nxn) across counties but, instead of euclidean
>>>     distance,
>>>     > to use road distance.
>>>
>>>     I'm afraid I still don't understand.  To put it mildly. You
>> presumably
>>>     have a clear idea of what you are trying to, but those of us who are
>>>     not
>>>     involved in your research have no such idea.  We (or at least I)
>>>     haven't
>>>     a clue as to what you are talking about.
>>>
>>>     What do you mean by "spatial weight"?  What are these weights used
>> for?
>>>     What is n?  How are the counties involved?  Is n the number of
>>>     counties?
>>>     Are you interested in the road distance (minimum road distance?)
>>>     between
>>>     pairs of counties?
>>>
>>>     Please explain *clearly* and do not expect those who are trying to
>> help
>>>     you to be mind-readers!!!
>>>
>>>     cheers,
>>>
>>>     Rolf
>>>
>>>     >
>>>     > El sáb., 22 de jun. de 2019 a la(s) 19:28, Rolf Turner
>>>     > (r.turner using auckland.ac.nz <mailto:r.turner using auckland.ac.nz>
>>>     <mailto:r.turner using auckland.ac.nz <mailto:r.turner using auckland.ac.nz>>)
>>>     escribió:
>>>     >
>>>     >
>>>     >     On 23/06/19 1:17 PM, Rolando Valdez wrote:
>>>     >
>>>     >     > Thank you for your answer.
>>>     >     >
>>>     >     > I have a shapefile with, say, counties, and I got another
>>>     >     shapefile with
>>>     >     > the roads. ¿What if a county does not intersect any road?
>>>     >
>>>     >     I am sorry, but it is not at all clear to me just what the
>>>     problem is.
>>>     >     How do the counties come into the picture?  You said you
>>>     wanted to get
>>>     >     the road distance between points on the roads.  What have the
>>>     counties
>>>     >     got to do with this?
>>>     >
>>>     >     Can you perhaps provide a reproducible example?
>>>     >
>>>     >     cheers,
>>>     >
>>>     >     Rolf
>>>     >
>>>     >     >
>>>     >     > El jue., 20 de jun. de 2019 a la(s) 19:08, Rolf Turner
>>>     >     > (r.turner using auckland.ac.nz <mailto:r.turner using auckland.ac.nz>
>>>     <mailto:r.turner using auckland.ac.nz <mailto:r.turner using auckland.ac.nz>>
>>>     >     <mailto:r.turner using auckland.ac.nz
>>>     <mailto:r.turner using auckland.ac.nz> <mailto:r.turner using auckland.ac.nz
>>>     <mailto:r.turner using auckland.ac.nz>>>)
>>>     >     escribió:
>>>     >     >
>>>     >     >
>>>     >     >     On 21/06/19 12:26 PM, Rolando Valdez wrote:
>>>     >     >
>>>     >     >     > Dear community,
>>>     >     >     >
>>>     >     >     > Is there any way to create a spatial weight matrix
>>>     based
>>>     >     on road
>>>     >     >     distance?
>>>     >     >     > I am trying to use the road distance between two
>> points
>>>     >     instead of
>>>     >     >     > euclidean distance.
>>>     >     >     >
>>>     >     >     > I've seen that there is a package named osrm. Can
>>>     anyone give
>>>     >     >     some advice?
>>>     >     >
>>>     >     >     I don't know anything about "osrm".  Calculating "road
>>>     distances"
>>>     >     >     can be
>>>     >     >     done in the spatstat package reasonably easily, if you
>>>     take
>>>     >     the trouble
>>>     >     >     to represent your collection of roads as a "linnet"
>>>     object.
>>>     >     >
>>>     >     >     Given that you have done so, suppose that your linnet
>>>     object
>>>     >     is "L" and
>>>     >     >     that you have vectors "x" and "y" specifying the
>>>     points on L
>>>     >     (i.e. on
>>>     >     >     your roads) between which you want to know the
>> distances.
>>>     >     >
>>>     >     >     Do:
>>>     >     >
>>>     >     >           X    <- lpp(data.frame(x=x,y=y),L)
>>>     >     >           dMat <- pairdist(X)
>>>     >     >
>>>     >     >     The object "dMat" is a (symmetric) square matrix;
>>>     dMat[i,j]
>>>     >     is the
>>>     >     >     distance between point i and point j.  (Of course the
>>>     >     diagonal entries
>>>     >     >     are all 0.)
>>>     >     >
>>>     >     >     If your collection of roads is specified by means of a
>>>     shapefile,
>>>     >     >     vignette("shapefiles") will tell you how to turn this
>>>     >     collection into a
>>>     >     >     "psp" ("planar segment pattern") object; the function
>>>     (method)
>>>     >     >     as.linnet.psp() can then be used to turn the "psp"
>>>     object into a
>>>     >     >     "linnet" object.
>>>     >     >
>>>     >     >     HTH
>>
>
>
>

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


More information about the R-sig-Geo mailing list