Come tradurre i set di dati di John Snow per mappare le coordinate


14

Nel pacchetto HistData per R ( https://r-forge.r-project.org/R/?group_id=574 ) ho i set di dati relativi alla mappa di John Snow sull'epidemia di colera a Londra, 1854. Credo che loro sono autorevoli, essendo stati attentamente digitalizzati sotto la supervisione di Walter Tobler. Alcuni dettagli su questi set di dati sono descritti da John Mackenzie, all'indirizzo http://www1.udel.edu/johnmack/frec480/cholera/cholera2.html .

Sfortunatamente, le coordinate di morti, pompe e strade usano un sistema di coordinate arbitrarie, non coordinate delle coordinate adatte ad altre applicazioni GIS o software di mappatura in R (pacchetti spaziali, ggmap, ecc.)

In http://freakonometrics.hypotheses.org/19213 Arthur Charpentier utilizza ggmap con una versione dei dati di John Snow da http://www.rtwilson.com/downloads/SnowGIS_v2.zip . Il Cholera_Deaths.shpfile, tuttavia, elenca solo 489 decessi, non i 578 in cui ho registrato HistData::Snow.deaths.

Un'idea è quella di trovare le relazioni tra i mezzi e le deviazioni standard delle coordinate (x, y) e riscalare linearmente, ma forse c'è un modo migliore?

Ecco cosa ho provato finora

> data(Snow.deaths, package="HistData")
> D <- Snow.deaths[,2:3]
> colMeans(D)
       x        y 
13.03312 11.69721 
> var(D)
          x         y
x 3.8150987 0.3802654
y 0.3802654 2.7213828

Leggi il file Cholera_deaths

> folder <- "C:/Dropbox/R/data/Snow/SnowGIS_v2/SnowGIS"
> library(maptools)
> deaths <- readShapePoints(file.path(folder, "Cholera_Deaths"))
> head(deaths@coords)
  coords.x1 coords.x2
0  529308.7  181031.4
1  529312.2  181025.2
2  529314.4  181020.3
3  529317.4  181014.3
4  529320.7  181007.9
5  529336.7  181006.0
> # deaths has only 250 observations; 489 deaths
> sum(deaths@data$Count)
[1] 489

 > # try to relate to Snow.deaths
> X <- deaths@coords
> colnames(X) <- c("x", "y")
> 
> XX <- data.frame(X, Freq=deaths@data$Count)
> XX <- vcdExtra::expand.dft(XX)
> 
> colMeans(XX)
       x        y 
529414.8 181031.9 
> var(XX)
          x        y
x 10813.816 1521.693
y  1521.693 6227.924
>

OK, allora provo a ridimensionare Dper avere gli stessi mezzi e deviazioni standard di XX, ma qualcosa non funziona correttamente qui - i mezzi colonna di Dscaleddovrebbero essere risultati uguali a quelli di XX:

> # scale D to have the same means and standard deviations as XX
> Dscaled <- scale(D, center=TRUE, scale=TRUE)
> Dscaled <- scale(Dscaled, center=colMeans(XX), scale=sqrt(diag(var(XX))))
> colMeans(Dscaled)
        x         y 
-5091.040 -2293.947 
>

EDIT: Potrebbe essere utile in questo problema vedere la mappa di Snow disegnata dalla nuova funzione, SnowMap(axis.labels=TRUE)ora nella versione di sviluppo di HistData(rev 102) su R-Forge. Le etichette degli assi mostrano l'origine del sistema di coordinate nell'angolo in basso a sinistra così come sono nei miei Snow.*set di dati.

SnowMap


Ho appena provato a ridimensionare le pompe di ciascun set di dati per adattarle. Non credo che la linea di aiuto (Snow.pumps) sulle coordinate sia di 100 metri, poiché una scala di circa 54 (e una traduzione) fanno il miglior lavoro per mappare queste coordinate della griglia nel Regno Unito dello shapefile (che sono sicuramente in metri). Anche allora i punti non si sovrappongono esattamente, alcune altre rotazioni / inclinazioni sono chiaramente presenti. Dato che ci sono meno pompe, è possibile identificare le pompe corrispondenti in ciascun set di dati e calcolare il turno / tradurre per quelle.
Spacedman,

Presumo che tu abbia guardato HistData / inst / doc / Snow_deaths-duplicates.html e l'hai trovato inutile?
Barrycarter,

Mi è anche venuto in mente che avrei potuto ottenere la trasformazione lineare delle coordinate nei miei Snow.*file in quelle in una mappa basata su GIS con le posizioni di due pompe o tre per verificarne l'accuratezza. Sfortunatamente, non ci sono etichette per le pompe nei SnowGISfile e non ho visto un esempio di come tracciarle in modo da poterle confrontare visivamente.
user101089

1
Per un secondo, dopo aver letto il tuo titolo, ho pensato che avresti voluto mappare le coordinate in Westeros .
user35594

Risposte:


4

Forse valutare lo shapefile da http://donboyes.com/2011/10/14/john-snow-and-serendipity ha 578 punti.

Non penso che provare a mettere in relazione la morte di neve di HistData con la versione di Robin Wilson (@robintw) funzionerà poiché il file di forma contiene una coordinata a punto singolo per morti multiple a un unico indirizzo, anziché i punti multipli impilati indietro dalla strada nella mappa .

Alla versione di Robin mancano sicuramente molti punti. Da una rapida occhiata, ci sono parecchi decessi singoli periferici persi. Un altro problema è più vicino al centro della mappa in cui non è stato correttamente abbinato ai bordi quando messi insieme (questo è visibile anche nella mappa di Wikipedia ) e questo oscura un numero di punti.

Estratto della mappa fornito nel download :

inserisci qui la descrizione dell'immagine

Estratto dalla versione UCLA :

inserisci qui la descrizione dell'immagine


Grande! Per concretezza, il link ai .shpfile è donboyes.com/download/snow_shp.zip
user101089

2

Per completare la risposta a questa domanda, il codice seguente trova la trasformazione lineare delle coordinate nei file Tobler originali (in HistData) e in quelli elaborati da Don Boyes.

folder <- "C:/Dropbox/R/data/Snow/snow_shp"
library(maptools)
deaths <- readShapePoints(file.path(folder, "deaths_gcs"))
data(Snow.deaths, package="HistData")
X <- deaths@coords
D <- Snow.deaths[,2:3]

Quindi, correlare e regredire D [, 1] su X [, 1] e D [, 2] su X [, 2]. La trasformazione lineare è data dai coefficienti di regressione.

> cor(D[,1], X[,1])
[1] 0.9999664
> cor(D[,2], X[,2])
[1] 0.9995559
> 
> # linear transformations to GIS coords
> lm(D[,1] ~ X[,1])

Call:
lm(formula = D[, 1] ~ X[, 1])

Coefficients:
(Intercept)       X[, 1]  
      185.4       1264.7  

> 
> lm(D[,2] ~ X[,2])

Call:
lm(formula = D[, 2] ~ X[, 2])

Coefficients:
(Intercept)       X[, 2]  
    -105441         2047  
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.