Mostrando correlação espacial e temporal nos mapas

16

Eu tenho dados para uma rede de estações meteorológicas nos Estados Unidos. Isso me fornece um quadro de dados que contém data, latitude, longitude e algum valor medido. Suponha que os dados sejam coletados uma vez por dia e conduzidos pelo clima em escala regional (não, não entraremos nessa discussão).

Gostaria de mostrar graficamente como os valores medidos simultaneamente são correlacionados no tempo e no espaço. Meu objetivo é mostrar a homogeneidade regional (ou a falta dela) do valor que está sendo investigado.

Conjunto de dados

Para começar, peguei um grupo de estações na região de Massachusetts e Maine. Selecionei sites por latitude e longitude a partir de um arquivo de índice disponível no site FTP da NOAA.

insira a descrição da imagem aqui

Imediatamente você vê um problema: existem muitos sites com identificadores semelhantes ou muito próximos. FWIW, eu os identifico usando os códigos da USAF e da WBAN. Analisando mais detalhadamente os metadados, vi que eles têm coordenadas e elevações diferentes, e os dados param em um site e começam em outro. Então, como não conheço melhor, tenho que tratá-las como estações separadas. Isso significa que os dados contêm pares de estações muito próximas umas das outras.

Análise preliminar

Tentei agrupar os dados por mês e depois calcular a regressão dos mínimos quadrados comuns entre diferentes pares de dados. Em seguida, traço a correlação entre todos os pares como uma linha que liga as estações (abaixo). A cor da linha mostra o valor de R2 do ajuste do OLS. A figura mostra como os mais de 30 pontos de dados de janeiro, fevereiro etc. são correlacionados entre diferentes estações na área de interesse.

correlação entre dados diários durante cada mês do calendário

Escrevi os códigos subjacentes para que a média diária seja calculada apenas se houver pontos de dados a cada 6 horas, para que os dados sejam comparáveis ​​entre sites.

Problemas

Infelizmente, há simplesmente muitos dados para entender em um gráfico. Isso não pode ser corrigido reduzindo o tamanho das linhas.

kinsira a descrição da imagem aqui

A rede parece ser muito complexa, então acho que preciso descobrir uma maneira de reduzir a complexidade ou aplicar algum tipo de núcleo espacial.

Também não tenho certeza de qual é a métrica mais apropriada para mostrar correlação, mas para o público-alvo (não técnico), o coeficiente de correlação do OLS pode ser apenas o mais simples de explicar. Talvez seja necessário apresentar outras informações, como o erro gradiente ou padrão.

Questões

Estou aprendendo a entrar neste campo e R ao mesmo tempo e gostaria de receber sugestões sobre:

  1. Qual é o nome mais formal para o que estou tentando fazer? Existem alguns termos úteis que me permitam encontrar mais literatura? Minhas pesquisas estão desenhando espaços em branco para o que deve ser um aplicativo comum.
  2. Existem métodos mais apropriados para mostrar a correlação entre vários conjuntos de dados separados no espaço?
  3. ... em particular, métodos fáceis de mostrar resultados visualmente?
  4. Algum destes implementado em R?
  5. Alguma dessas abordagens se presta à automação?
Andy Clifton
fonte
[Descrevendo a correlação temporal espacialmente em um ambiente de análise visual ", Abish Malik et al.] [1] [1]: google.com/…
pat
2
yWy
E se você tentar aumentar o limite de plotagem (0,5) e usar mais de 4 etapas de cores? Ou use linhas mais finas e espessas em vez de cores.
Nadya
nordem((n2)/2)
1
Percebi com isso que tenho muito trabalho a fazer no pré-processamento dos dados antes de iniciar a análise que descrevi aqui. Lendo a resposta de @nadya, acho claro que preciso observar algum tipo de agregação espacial, mas isso será desafiador, pois é errado agregar dados de terra e oceano. Então eu preciso olhar para estratégias de preenchimento de lacunas. Então (e somente então) posso começar a examinar o trabalho de mapeamento / visualização.
Andy Clifton

Respostas:

10

Eu acho que existem algumas opções para mostrar esse tipo de dados:

A primeira opção seria realizar uma "Análise empírica de funções ortogonais" (EOF) (também conhecida como "Análise de componentes principais" (PCA) em círculos não climáticos). Para o seu caso, isso deve ser realizado em uma matriz de correlação dos seus locais de dados. Por exemplo, sua matriz de dados datseria sua localização espacial na dimensão da coluna e o parâmetro medido nas linhas; Portanto, sua matriz de dados consistirá em séries temporais para cada local. A prcomp()função permitirá que você obtenha os principais componentes, ou modos dominantes de correlação, relacionados a este 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.

A segunda opção seria criar mapas que mostrem correlação em relação a um local de interesse individual:

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

EDIT: exemplo adicional

Embora o exemplo a seguir não use dados gappy, você pode aplicar a mesma análise a um campo de dados após a interpolação com o DINEOF ( http://menugget.blogspot.de/2012/10/dineof-data-interpolating-empirical.html ) . O exemplo abaixo usa um subconjunto de dados mensais de pressão do nível do mar de anomalia do seguinte conjunto de dados ( 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)

Mapeie o principal modo EOF

# 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

insira a descrição da imagem aqui

Criar mapa de correlação

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

insira a descrição da imagem aqui

Marc na caixa
fonte
Quão bem essas funções lidam com dados ausentes? Muitas vezes tenho lacunas nas séries temporais.
Andy Clifton
2
Existem métodos EOF projetados para o caso especial de "dados com falhas" que você descreve. Aqui está um link para um artigo que analisa esses métodos: dx.doi.org/10.6084/m9.figshare.732650 . Você verá que os métodos RSEOF e DINEOF são os mais precisos para derivar EOFs de conjuntos de dados com falhas. O algoritmo de interpolação DINEOF pode ser encontrado aqui: menugget.blogspot.de/2012/10/…
Marc na caixa
1
Penso que esta é a melhor resposta para o que é uma pergunta terrível (em retrospectiva).
Andy Clifton
3

Não vejo claramente atrás das linhas, mas parece-me que há muitos pontos de dados.

Como você deseja mostrar a homogeneidade regional e não exatamente as estações, sugiro que você primeiro as agrupe espacialmente. Por exemplo, sobreponha-se a uma "rede de pesca" e calcule o valor médio medido em todas as células (a cada momento). Se você colocar esses valores médios nos centros de células dessa maneira, rasterizará os dados (ou poderá calcular também latitude e longitude médias em todas as células, se não desejar sobrepor linhas). Ou, em média, dentro das unidades administrativas, qualquer que seja. Então, para essas novas "estações" médias, você pode calcular correlações e traçar um mapa com menor número de linhas.

insira a descrição da imagem aqui

Isso também pode remover as linhas aleatórias de alta correlação únicas que atravessam toda a área.

nadya
fonte
x×xx
Sim, projetar as coordenadas é uma boa ideia. Boa sorte!
Nadya