Mostra correlazione spaziale e temporale sulle mappe


16

Ho dei dati per una rete di stazioni meteorologiche negli Stati Uniti. Questo mi dà un frame di dati che contiene data, latitudine, longitudine e un certo valore misurato. Supponiamo che i dati vengano raccolti una volta al giorno e guidati da condizioni meteorologiche su scala regionale (no, non entreremo in quella discussione).

Vorrei mostrare graficamente come i valori misurati simultaneamente siano correlati nel tempo e nello spazio. Il mio obiettivo è mostrare l'omogeneità regionale (o la sua mancanza) del valore che si sta studiando.

Set di dati

Per cominciare, ho preso un gruppo di stazioni nella regione del Massachusetts e del Maine. Ho selezionato i siti per latitudine e longitudine da un file indice disponibile sul sito FTP del NOAA.

inserisci qui la descrizione dell'immagine

Immediatamente vedi un problema: ci sono molti siti che hanno identificatori simili o sono molto vicini. FWIW, li identifico usando entrambi i codici USAF e WBAN. Osservando più a fondo i metadati ho visto che hanno coordinate e prospetti diversi e che i dati si fermano in un sito e iniziano in un altro. Quindi, poiché non conosco meglio, devo trattarli come stazioni separate. Ciò significa che i dati contengono coppie di stazioni molto vicine tra loro.

Analisi preliminare

Ho provato a raggruppare i dati per mese di calendario e quindi a calcolare la regressione dei minimi quadrati ordinaria tra diverse coppie di dati. Tracciato quindi la correlazione tra tutte le coppie come una linea che collega le stazioni (sotto). Il colore della linea mostra il valore di R2 dall'adattamento OLS. La figura mostra quindi come i 30+ punti dati di gennaio, febbraio, ecc. Siano correlati tra le diverse stazioni nell'area di interesse.

correlazione tra i dati giornalieri durante ciascun mese di calendario

Ho scritto i codici sottostanti in modo che la media giornaliera sia calcolata solo se ci sono punti dati ogni periodo di 6 ore, quindi i dati dovrebbero essere comparabili tra i siti.

I problemi

Sfortunatamente, ci sono semplicemente troppi dati per dare un senso a una trama. Ciò non può essere risolto riducendo la dimensione delle linee.

Kinserisci qui la descrizione dell'immagine

La rete sembra essere troppo complessa, quindi penso di dover trovare un modo per ridurre la complessità o applicare un qualche tipo di kernel spaziale.

Inoltre, non sono sicuro di quale sia la metrica più appropriata per mostrare la correlazione, ma per il pubblico (non tecnico) previsto, il coefficiente di correlazione di OLS potrebbe essere il più semplice da spiegare. Potrei aver bisogno di presentare alcune altre informazioni come il gradiente o anche l'errore standard.

Domande

Sto imparando la mia strada in questo campo e R allo stesso tempo, e apprezzerei suggerimenti su:

  1. Qual è il nome più formale per quello che sto cercando di fare? Ci sono alcuni termini utili che mi permetterebbero di trovare più letteratura? Le mie ricerche disegnano spazi vuoti per quella che deve essere un'applicazione comune.
  2. Esistono metodi più appropriati per mostrare la correlazione tra più set di dati separati nello spazio?
  3. ... in particolare, metodi che mostrano facilmente risultati visivamente?
  4. Qualcuno di questi sono implementati in R?
  5. Qualcuno di questi approcci si presta all'automazione?

[Descrivendo la correlazione temporale spazialmente in un ambiente di Visual Analytics, "Abish Malik et al.] [1] [1]: google.com/…
pat

2
yWy

Cosa succede se si tenta di aumentare la soglia di stampa (0,5) e di utilizzare più di 4 passaggi di colore? O per usare linee più sottili e spesse anziché colori.
Nadya,

nordine((n2)/2)

1
Da questo mi sono reso conto che ho molto lavoro da fare sulla pre-elaborazione dei dati prima di iniziare l'analisi che ho delineato qui. Leggendo la risposta di @nadya, penso che sia chiaro che devo esaminare una sorta di aggregazione spaziale, ma sarà una sfida poiché è sbagliato aggregare i dati di terra e oceano. Quindi ho bisogno di esaminare le strategie di riempimento del gap. Quindi (e solo allora) posso iniziare a guardare il lavoro di mappatura / visualizzazione.
Andy Clifton,

Risposte:


10

Penso che ci siano alcune opzioni per mostrare questo tipo di dati:

La prima opzione sarebbe quella di condurre una "Analisi empirica delle funzioni ortogonali" (EOF) (indicata anche come "Analisi delle componenti principali" (PCA) nei circoli non climatici). Nel tuo caso, questo dovrebbe essere condotto su una matrice di correlazione delle posizioni dei tuoi dati. Ad esempio, la matrice dei dati datsarebbe la posizione spaziale nella dimensione della colonna e il parametro misurato nelle righe; Quindi, la tua matrice di dati consisterà in serie temporali per ogni posizione. La prcomp()funzione ti permetterà di ottenere i componenti principali, o le modalità di correlazione dominanti, relative a questo campo:

res <- prcomp(dat, retx = TRUE, center = TRUE, scale = TRUE) # center and scale should be "TRUE" for an analysis of dominant correlation modes)
#res$x and res$rotation will contain the PC modes in the temporal and spatial dimension, respectively.

La seconda opzione sarebbe quella di creare mappe che mostrino una correlazione relativa a una singola posizione di interesse:

C <- cor(dat)
#C[,n] would be the correlation values between the nth location (e.g. dat[,n]) and all other locations. 

EDIT: esempio aggiuntivo

Mentre il seguente esempio non utilizza i dati gappy, è possibile applicare la stessa analisi a un campo dati dopo l'interpolazione con DINEOF ( http://menugget.blogspot.de/2012/10/dineof-data-interpolating-empirical.html ) . L'esempio seguente utilizza un sottoinsieme di dati mensili di anomalia sulla pressione a livello del mare dal seguente set di dati ( http://www.esrl.noaa.gov/psd/gcos_wgsp/Gridded/data.hadslp2.html ):

library(sinkr) # https://github.com/marchtaylor/sinkr

# load data
data(slp)

grd <- slp$grid
time <- slp$date
field <- slp$field

# make anomaly dataset
slp.anom <- fieldAnomaly(field, time)

# EOF/PCA of SLP anom
P <- prcomp(slp.anom, center = TRUE, scale. = TRUE)

expl.var <- P$sdev^2 / sum(P$sdev^2) # explained variance
cum.expl.var <- cumsum(expl.var) # cumulative explained variance
plot(cum.expl.var)

Mappa la modalità EOF principale

# make interpolation
require(akima)
require(maps)

eof.num <- 1
F1 <- interp(x=grd$lon, y=grd$lat, z=P$rotation[,eof.num]) # interpolated spatial EOF mode


png(paste0("EOF_mode", eof.num, ".png"), width=7, height=6, units="in", res=400)
op <- par(ps=10) #settings before layout
layout(matrix(c(1,2), nrow=2, ncol=1, byrow=TRUE), heights=c(4,2), widths=7)
#layout.show(2) # run to see layout; comment out to prevent plotting during .pdf
par(cex=1) # layout has the tendency change par()$cex, so this step is important for control

par(mar=c(4,4,1,1)) # I usually set my margins before each plot
pal <- jetPal
image(F1, col=pal(100))
map("world", add=TRUE, lwd=2)
contour(F1, add=TRUE, col="white")
box()

par(mar=c(4,4,1,1)) # I usually set my margins before each plot
plot(time, P$x[,eof.num], t="l", lwd=1, ylab="", xlab="")
plotRegionCol()
abline(h=0, lwd=2, col=8)
abline(h=seq(par()$yaxp[1], par()$yaxp[2], len=par()$yaxp[3]+1), col="white", lty=3)
abline(v=seq.Date(as.Date("1800-01-01"), as.Date("2100-01-01"), by="10 years"), col="white", lty=3)
box()
lines(time, P$x[,eof.num])
mtext(paste0("EOF ", eof.num, " [expl.var = ", round(expl.var[eof.num]*100), "%]"), side=3, line=1) 

par(op)
dev.off() # closes device

inserisci qui la descrizione dell'immagine

Crea mappa di correlazione

loc <- c(-90, 0)
target <- which(grd$lon==loc[1] & grd$lat==loc[2])
COR <- cor(slp.anom)
F1 <- interp(x=grd$lon, y=grd$lat, z=COR[,target]) # interpolated spatial EOF mode


png(paste0("Correlation_map", "_lon", loc[1], "_lat", loc[2], ".png"), width=7, height=5, units="in", res=400)

op <- par(ps=10) #settings before layout
layout(matrix(c(1,2), nrow=2, ncol=1, byrow=TRUE), heights=c(4,1), widths=7)
#layout.show(2) # run to see layout; comment out to prevent plotting during .pdf
par(cex=1) # layout has the tendency change par()$cex, so this step is important for control

par(mar=c(4,4,1,1)) # I usually set my margins before each plot
pal <- colorRampPalette(c("blue", "cyan", "yellow", "red", "yellow", "cyan", "blue"))
ncolors <- 100
breaks <- seq(-1,1,,ncolors+1)
image(F1, col=pal(ncolors), breaks=breaks)
map("world", add=TRUE, lwd=2)
contour(F1, add=TRUE, col="white")
box()

par(mar=c(4,4,0,1)) # I usually set my margins before each plot
imageScale(F1, col=pal(ncolors), breaks=breaks, axis.pos = 1)
mtext("Correlation [R]", side=1, line=2.5)
box()

par(op)

dev.off() # closes device

inserisci qui la descrizione dell'immagine


In che misura queste funzioni gestiscono i dati mancanti? Abbastanza spesso ho delle lacune nelle serie storiche.
Andy Clifton,

2
Esistono metodi EOF progettati per il caso speciale di "dati gappy" che descrivi. Ecco un link a un documento che esamina questi metodi: dx.doi.org/10.6084/m9.figshare.732650 . Vedrai che i metodi RSEOF e DINEOF sono i più precisi per derivare EOF da insiemi di dati gappy. L'algoritmo di interpolazione DINEOF è disponibile qui: menugget.blogspot.de/2012/10/…
Marc nella casella

1
Penso che questa sia la migliore risposta a una domanda terribile (col senno di poi).
Andy Clifton,

3

Non vedo chiaramente dietro le righe, ma mi sembra che ci siano troppi punti dati.

Dato che vuoi mostrare l'omogeneità regionale e non esattamente le stazioni, ti suggerirei innanzitutto di raggrupparle spazialmente. Ad esempio, sovrapporre una "rete" e calcolare il valore misurato medio in ogni cella (in ogni momento). Se inserisci questi valori medi nei centri di celle in questo modo rasterizzi i dati (oppure puoi calcolare anche la latitudine e la longitudine in ogni cella se non vuoi sovrapporre le linee). O alla media all'interno delle unità amministrative, qualunque cosa. Quindi per queste nuove "stazioni" medie è possibile calcolare le correlazioni e tracciare una mappa con un numero inferiore di linee.

inserisci qui la descrizione dell'immagine

Questo può anche rimuovere quelle singole linee ad alta correlazione casuali che attraversano tutta l'area.


Anche questa è un'idea interessante. Poiché alcuni domini possono essere piuttosto grandi, probabilmente raggrupperei i dati inX×X km di celle anziché Xlatitudine-longitudine-by.
Andy Clifton,

Sì, proiettare le coordinate è una buona idea. In bocca al lupo!
Nadya,
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.