แสดงความสัมพันธ์เชิงพื้นที่และเชิงเวลาบนแผนที่


16

ฉันมีข้อมูลสำหรับเครือข่ายสถานีตรวจอากาศทั่วสหรัฐอเมริกา สิ่งนี้ทำให้ฉันมีกรอบข้อมูลที่ประกอบด้วยวันที่ละติจูดลองจิจูดและค่าที่วัดได้บางส่วน สมมติว่ามีการรวบรวมข้อมูลวันละครั้งและขับเคลื่อนด้วยสภาพอากาศระดับภูมิภาค (ไม่เราจะไม่เข้าร่วมการสนทนานั้น)

ฉันต้องการแสดงให้เห็นชัดเจนว่าค่าที่วัดได้พร้อมกันนั้นมีความสัมพันธ์กันตลอดเวลาและพื้นที่อย่างไร เป้าหมายของฉันคือการแสดงให้เห็นถึงความเป็นเนื้อเดียวกันในภูมิภาค (หรือไม่มีในนั้น) ของค่าที่จะถูกตรวจสอบ

ชุดข้อมูล

เริ่มต้นด้วยฉันเอากลุ่มของสถานีในแมสซาชูเซตส์และเมน ฉันเลือกไซต์ตามละติจูดและลองจิจูดจากไฟล์ดัชนีที่มีอยู่ในไซต์ FTP ของ NOAA

ป้อนคำอธิบายรูปภาพที่นี่

ทันทีที่คุณเห็นปัญหาหนึ่ง: มีเว็บไซต์จำนวนมากที่มีตัวระบุที่คล้ายกันหรือใกล้เคียงกันมาก FWIW ฉันระบุว่าพวกเขาใช้ทั้งรหัส USAF และ WBAN เมื่อมองลึกลงไปที่เมทาดาทาฉันเห็นว่าพวกเขามีพิกัดและระดับความสูงต่างกันและข้อมูลหยุดที่ไซต์หนึ่งจากนั้นเริ่มที่อีกไซต์หนึ่ง ดังนั้นเนื่องจากฉันไม่รู้อะไรเลยฉันจึงต้องปฏิบัติต่อพวกเขาเป็นสถานีแยก ซึ่งหมายความว่าข้อมูลมีคู่สถานีที่ใกล้กันมาก

การวิเคราะห์เบื้องต้น

ฉันพยายามจัดกลุ่มข้อมูลตามเดือนปฏิทินจากนั้นคำนวณการถดถอยกำลังสองน้อยสุดธรรมดาระหว่างข้อมูลที่แตกต่างกัน จากนั้นฉันวางแผนความสัมพันธ์ระหว่างคู่ทั้งหมดเป็นเส้นเชื่อมต่อสถานี (ด้านล่าง) สีเส้นแสดงค่า R2 จาก OLS พอดี จากนั้นตัวเลขแสดงให้เห็นว่าจุดข้อมูล 30+ จุดตั้งแต่เดือนมกราคมกุมภาพันธ์เป็นต้นไปมีความสัมพันธ์กันอย่างไรระหว่างสถานีต่างๆในพื้นที่ที่น่าสนใจ

สหสัมพันธ์ระหว่างข้อมูลรายวันในแต่ละเดือนปฏิทิน

ฉันได้เขียนโค้ดที่สำคัญเพื่อที่ค่าเฉลี่ยรายวันจะถูกคำนวณเฉพาะในกรณีที่มีจุดข้อมูลทุก 6 ชั่วโมงดังนั้นข้อมูลควรเปรียบเทียบได้ในทุกไซต์

ปัญหาที่เกิดขึ้น

น่าเสียดายที่มีข้อมูลมากเกินไปที่จะเข้าใจในหนึ่งพล็อต ไม่สามารถแก้ไขได้ด้วยการลดขนาดของเส้น

kป้อนคำอธิบายรูปภาพที่นี่

เครือข่ายดูเหมือนจะซับซ้อนเกินไปดังนั้นฉันคิดว่าฉันต้องหาวิธีที่จะลดความซับซ้อนหรือใช้เคอร์เนลเชิงพื้นที่บางประเภท

ฉันไม่แน่ใจว่าสิ่งที่เป็นตัวชี้วัดที่เหมาะสมที่สุดในการแสดงความสัมพันธ์ แต่สำหรับผู้ชมที่ตั้งใจ (ไม่ใช่ด้านเทคนิค) สัมประสิทธิ์สหสัมพันธ์จาก OLS อาจเป็นวิธีที่ง่ายที่สุดในการอธิบาย ฉันอาจต้องนำเสนอข้อมูลอื่น ๆ เช่นข้อผิดพลาดการไล่ระดับสีหรือมาตรฐานเช่นกัน

คำถาม

ฉันเรียนรู้วิธีการของฉันในฟิลด์นี้และ R ในเวลาเดียวกันและจะขอบคุณคำแนะนำเกี่ยวกับ:

  1. ชื่อทางการของสิ่งที่ฉันพยายามจะทำคืออะไร มีคำศัพท์ที่เป็นประโยชน์ที่จะให้ฉันค้นหางานเขียนเพิ่มเติมหรือไม่ การค้นหาของฉันกำลังวาดช่องว่างสำหรับสิ่งที่ต้องเป็นแอปพลิเคชันทั่วไป
  2. มีวิธีการที่เหมาะสมกว่าหรือไม่ในการแสดงความสัมพันธ์ระหว่างชุดข้อมูลหลายชุดที่คั่นด้วยช่องว่าง
  3. ... โดยเฉพาะวิธีการที่ง่ายต่อการแสดงผลลัพธ์จากการมองเห็น?
  4. สิ่งเหล่านี้ถูกนำไปใช้ใน R หรือไม่?
  5. วิธีการใด ๆ เหล่านี้ให้ยืมตัวเองเพื่อระบบอัตโนมัติ?

[การอธิบายความสัมพันธ์ชั่วคราวเชิงพื้นที่ในสภาพแวดล้อมการวิเคราะห์ด้วยภาพ "Abish Malik et al.] [1] [1]: google.com/…
pat

2
YWY

ถ้าคุณพยายามเพิ่มเกณฑ์การลงจุด (0.5) และใช้มากกว่า 4 ขั้นตอนสี หรือจะใช้เส้นที่หนากว่าแทนสี
nadya

nใบสั่ง((n2)/2)

1
ฉันรู้จากสิ่งนี้ว่าฉันมีงานมากมายที่ต้องทำในการประมวลผลข้อมูลล่วงหน้าก่อนที่ฉันจะเริ่มการวิเคราะห์ที่ฉันได้อธิบายไว้ที่นี่ การอ่านคำตอบจาก @nadya ฉันคิดว่ามันชัดเจนว่าฉันต้องดูการรวมตัวเชิงพื้นที่บางอย่าง แต่มันจะท้าทายเพราะมันผิดที่จะรวมข้อมูลที่ดินและมหาสมุทร จากนั้นฉันต้องดูกลยุทธ์เติมช่องว่าง จากนั้น (และเท่านั้น) ฉันสามารถเริ่มดูการทำแผนที่ / การสร้างภาพข้อมูล
Andy Clifton

คำตอบ:


10

ฉันคิดว่ามีตัวเลือกเล็กน้อยในการแสดงข้อมูลประเภทนี้:

ตัวเลือกแรกคือการดำเนินการ "การวิเคราะห์ฟังก์ชั่นมุมฉาก orthogonal" (EOF) (หรือที่เรียกว่า "การวิเคราะห์องค์ประกอบหลัก" (PCA) ในวงกลมที่ไม่ใช่สภาพภูมิอากาศ) สำหรับกรณีของคุณควรดำเนินการกับเมทริกซ์สหสัมพันธ์ของตำแหน่งข้อมูลของคุณ ตัวอย่างเช่นเมทริกซ์ข้อมูลของคุณdatจะเป็นตำแหน่งเชิงพื้นที่ของคุณในมิติคอลัมน์และพารามิเตอร์ที่วัดได้ในแถว ดังนั้นเมทริกซ์ข้อมูลของคุณจะประกอบด้วยอนุกรมเวลาสำหรับแต่ละตำแหน่ง prcomp()ฟังก์ชั่นจะช่วยให้คุณได้รับองค์ประกอบหลักหรือโหมดที่โดดเด่นของความสัมพันธ์ที่เกี่ยวข้องกับข้อมูลนี้:

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.

ตัวเลือกที่สองคือการสร้างแผนที่ที่แสดงสหสัมพันธ์กับสถานที่ที่น่าสนใจแต่ละแห่ง:

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

แก้ไข: ตัวอย่างเพิ่มเติม

แม้ว่าตัวอย่างต่อไปนี้จะไม่ใช้ข้อมูล gappy แต่คุณสามารถใช้การวิเคราะห์เดียวกันกับเขตข้อมูลหลังจากแก้ไขด้วย DINEOF ( http://menugget.blogspot.de/2012/10/dineof-data-interpolating-empirical.html ) . ตัวอย่างด้านล่างใช้ชุดย่อยของข้อมูลความดันระดับน้ำทะเลผิดปกติรายเดือนจากชุดข้อมูลต่อไปนี้ ( 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)

แม็พโหมด 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

ป้อนคำอธิบายรูปภาพที่นี่

สร้างแผนที่ความสัมพันธ์

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

ป้อนคำอธิบายรูปภาพที่นี่


ฟังก์ชั่นเหล่านี้จัดการกับข้อมูลที่หายไปได้ดีแค่ไหน? ฉันมักจะมีช่องว่างในซีรีย์เวลา
Andy Clifton

2
มีวิธี EOF ที่ออกแบบมาสำหรับกรณีพิเศษของ "gappy data" ที่คุณอธิบาย นี่คือการเชื่อมโยงกับกระดาษที่ความคิดเห็นวิธีการเหล่านี้: dx.doi.org/10.6084/m9.figshare.732650 คุณจะเห็นว่าวิธี RSEOF และ DINEOF นั้นแม่นยำที่สุดในการรับ EOF จากชุดข้อมูลที่มีความสุข อัลกอริทึมการแก้ไข DINEOF สามารถพบได้ที่นี่: menugget.blogspot.de/2012/10/…
Marc ในกล่อง

1
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดสำหรับสิ่งที่เป็นคำถามที่น่ากลัว (ในการเข้าใจถึงปัญหาหลัง)
Andy Clifton

3

ฉันไม่เห็นชัดเจนหลังเส้น แต่ดูเหมือนว่าฉันมีจุดข้อมูลมากเกินไป

เนื่องจากคุณต้องการแสดงความเป็นเนื้อเดียวกันของภูมิภาคและไม่ใช่สถานีแน่นอนฉันขอแนะนำให้คุณจัดกลุ่มพวกเขาเป็นครั้งแรกในเชิงพื้นที่ ตัวอย่างเช่นการซ้อนทับโดย "fishnet" และคำนวณค่าเฉลี่ยที่วัดได้ในทุกเซลล์ (ในทุกช่วงเวลา) หากคุณวางค่าเฉลี่ยเหล่านี้ในศูนย์เซลล์ด้วยวิธีนี้คุณ rasterize ข้อมูล (หรือคุณสามารถคำนวณยังหมายถึงละติจูดและลองจิจูดในทุกเซลล์ถ้าคุณไม่ต้องการวางซ้อนบรรทัด) หรือโดยเฉลี่ยในหน่วยงานการจัดการอะไรก็ตาม จากนั้นสำหรับ "สถานี" ใหม่โดยเฉลี่ยคุณสามารถคำนวณความสัมพันธ์และพล็อตแผนที่ที่มีจำนวนบรรทัดน้อยลง

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้ยังสามารถลบเส้นที่มีความสัมพันธ์สูงแบบสุ่มเหล่านั้นผ่านพื้นที่ทั้งหมด


x×xx

ใช่เพื่อฉายพิกัดเป็นความคิดที่ดี โชคดี!
nadya
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.