Haritalarda mekansal ve zamansal korelasyon gösterilmesi


16

Amerika Birleşik Devletleri'ndeki bir hava durumu istasyonları ağı için verilerim var. Bu bana tarih, enlem, boylam ve bazı ölçülen değerleri içeren bir veri çerçevesi verir. Verilerin günde bir kez toplandığını ve bölgesel ölçekli hava koşullarından kaynaklandığını varsayın (hayır, bu tartışmaya girmeyeceğiz).

Eşzamanlı olarak ölçülen değerlerin zaman ve mekan arasında nasıl ilişkili olduğunu grafiksel olarak göstermek istiyorum. Amacım araştırılan değerin bölgesel homojenliğini (veya eksikliğini) göstermektir.

Veri seti

Başlamak için, Massachusetts ve Maine bölgesinde bir grup istasyon aldım. NOAA'nın FTP sitesinde bulunan bir dizin dosyasından siteleri enlem ve boylam ile seçtim.

resim açıklamasını buraya girin

Hemen bir sorun görüyorsunuz: Benzer tanımlayıcılara sahip veya çok yakın olan birçok site var. FWIW, bunları hem USAF hem de WBAN kodlarını kullanarak tanımlıyorum. Meta verilere daha yakından baktığımda, farklı koordinatlara ve yüksekliklere sahip olduklarını gördüm ve bir sitede veri durduktan sonra başka bir yerde başlıyor. Yani, daha iyisini bilmediğim için, onlara ayrı istasyonlar gibi davranmalıyım. Bu, verilerin birbirine çok yakın istasyon çiftleri içerdiği anlamına gelir.

Ön analiz

Verileri takvim ayına göre gruplandırmayı ve sonra farklı veri çiftleri arasındaki normal en küçük kareler regresyonunu hesaplamayı denedim. Sonra tüm çiftler arasındaki korelasyonu istasyonları bağlayan bir çizgi olarak çizerim (aşağıda). Çizgi rengi OLS uyumundan R2 değerini gösterir. Daha sonra şekil Ocak, Şubat vb. 30'dan fazla veri noktasının ilgi alanındaki farklı istasyonlar arasında nasıl korele olduğunu gösterir.

her takvim ayı boyunca günlük veriler arasındaki korelasyon

Temel kodları yazdım, böylece günlük ortalama sadece her 6 saatlik periyotta veri noktaları varsa hesaplanır, bu nedenle veriler siteler arasında karşılaştırılabilir olmalıdır.

sorunlar

Ne yazık ki, bir arsa üzerinde anlam ifade etmek için çok fazla veri var. Bu, hatların boyutunu küçülterek düzeltilemez.

kresim açıklamasını buraya girin

Ağ çok karmaşık görünüyor, bu yüzden karmaşıklığı azaltmanın veya bir tür uzamsal çekirdeği uygulamanın bir yolunu bulmam gerektiğini düşünüyorum.

Ayrıca korelasyonu göstermek için en uygun metriğin ne olduğundan emin değilim, ancak hedeflenen (teknik olmayan) izleyici için OLS'un korelasyon katsayısı açıklamak için en basit olabilir. Degrade veya standart hata gibi başka bilgiler de sunmam gerekebilir.

Sorular

Bu alana ve R'ye aynı anda giriyorum ve aşağıdakilerle ilgili önerileri takdir ediyorum:

  1. Yapmaya çalıştığım şeyin resmi adı nedir? Daha fazla literatür bulmamı sağlayacak bazı yararlı terimler var mı? Aramalarım, ortak bir uygulama olması gerekenler için boşluklar çiziyor.
  2. Uzayda ayrılmış birden çok veri kümesi arasındaki korelasyonu göstermek için daha uygun yöntemler var mı?
  3. ... özellikle, görsel olarak sonuçların gösterilmesi kolay yöntemler?
  4. Bunlardan herhangi biri R'de uygulanmış mı?
  5. Bu yaklaşımlardan herhangi biri otomasyona katkıda bulunuyor mu?

[Görsel Analitik Ortamda Zamansal Korelasyonu Mekansal Olarak Tanımlamak, "Abish Malik ve ark.] [1] [1]: google.com/…
pat

2
yWy

Çizim eşiğini (0.5) artırmaya ve 4'ten fazla renk adımı kullanmaya çalışırsanız ne olur? Veya renkler yerine daha ince çizgiler kullanmak için.
nadya

nsipariş((n2)/2)

1
Buradan, burada özetlediğim analize başlamadan önce verileri ön işleme konusunda çok çalışmam gerektiğini fark ettim. @Nadya'dan gelen cevabı okuduğumda, bir tür uzamsal kümelenmeye bakmam gerektiğinin açık olduğunu düşünüyorum, ancak kara ve okyanus verilerinin toplanması yanlış olduğu için bu zor olacak. O zaman boşluk doldurma stratejilerine bakmam gerekiyor. O halde (ve ancak o zaman) haritalama / görselleştirme çalışmasına bakmaya başlayabilirim.
Andy Clifton

Yanıtlar:


10

Bu tür verileri göstermek için birkaç seçenek olduğunu düşünüyorum:

İlk seçenek bir "Ampirik Dik Fonksiyonlar Analizi" (EOF) (iklim dışı çevrelerde "Ana Bileşen Analizi" (PCA) olarak da bilinir) yapmak olacaktır. Sizin durumunuz için bu, veri konumlarınızın bir korelasyon matrisinde gerçekleştirilmelidir. Örneğin, veri matrisiniz datsütun boyutundaki uzamsal konumlarınız ve satırlardaki ölçülen parametre olacaktır; Dolayısıyla, veri matrisiniz her konum için zaman serilerinden oluşacaktır. prcomp()Fonksiyon bu alana ilişkin, sen ana bileşenler ya da korelasyonun baskın modları elde sağlayacaktır:

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.

İkinci seçenek, ilgilendiğiniz bir yere göre korelasyon gösteren haritalar oluşturmak olacaktır:

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

EDIT: ek örnek

Aşağıdaki örnekte boşluk verileri kullanılmasa da, DINEOF ile enterpolasyondan sonra aynı analizi bir veri alanına uygulayabilirsiniz ( http://menugget.blogspot.de/2012/10/dineof-data-interpolating-empirical.html ) . Aşağıdaki örnek, aşağıdaki veri kümesinden aylık anomali deniz seviyesi basınç verilerinin bir alt kümesini kullanır ( 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)

Önde gelen EOF modunu eşleyin

# 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

resim açıklamasını buraya girin

Korelasyon haritası oluştur

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

resim açıklamasını buraya girin


Bu işlevler eksik verilerle ne kadar iyi başa çıkıyor? Zaman serilerinde sık sık boşluklarım var.
Andy Clifton

2
Açıkladığınız özel "boş veri" durumu için tasarlanmış EOF yöntemleri vardır. İşte bu yöntemleri inceleyen bir makalenin bağlantısı: dx.doi.org/10.6084/m9.figshare.732650 . RSEOF ve DINEOF yöntemlerinin, boşluklu veri kümelerinden EOF'leri türetmek için en doğru yöntem olduğunu göreceksiniz. DINEOF enterpolasyon algoritması burada bulunabilir: menugget.blogspot.de/2012/10/…
Marc kutusunda

1
Bence bu korkunç bir soru için en iyi cevap (gezide).
Andy Clifton

3

Çizgilerin arkasında net bir şekilde göremiyorum ama bana göre çok fazla veri noktası var.

Tam olarak istasyonları değil bölgesel homojenliği göstermek istediğiniz için, önce onları mekansal olarak gruplandırmanızı öneririm. Örneğin, bir "balık ağı" ile kaplayın ve her hücrede (her an) ortalama ölçülen değeri hesaplayın. Bu ortalama değerleri hücre merkezlerine bu şekilde yerleştirirseniz verileri rasterleştirirsiniz (veya üst üste binen satırlar istemiyorsanız her hücrede ortalama enlem ve boylam da hesaplayabilirsiniz). Ya da her ne olursa olsun, idari birimlerin içindeki ortalamaları. Daha sonra bu yeni ortalamalı "istasyonlar" için korelasyonları hesaplayabilir ve daha az sayıda çizgiyle bir harita çizebilirsiniz.

resim açıklamasını buraya girin

Bu, tüm alandan geçen rastgele tek yüksek korelasyon çizgilerini de kaldırabilir.


xxxx

Evet, koordinatları yansıtmak iyi bir fikirdir. İyi şanslar!
nadya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.