การจัดกลุ่มข้อมูลเชิงพื้นที่ใน R หรือไม่ [ปิด]


34

ฉันมีจุดข้อมูลมากมายพร้อมละติจูดและลองจิจูด ฉันต้องการใช้ R เพื่อจัดกลุ่มตามระยะทาง

ฉันลองดูที่หน้านี้แล้วลองใช้แพ็คเกจclustTool แต่ฉันไม่แน่ใจว่าฟังก์ชัน clust ใน clustTool พิจารณาจุดข้อมูล (lat, lon) เป็นข้อมูลเชิงพื้นที่และใช้สูตรที่เหมาะสมเพื่อคำนวณระยะทางระหว่างพวกเขาหรือไม่

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

จะเกิดอะไรขึ้นถ้าฉันต้องการพิจารณาพารามิเตอร์ที่สามในการจัดกลุ่มของฉัน

เช่นถ้าฉันมี (lat, lon) และพารามิเตอร์อื่น ๆ

ระยะทางคำนวณอย่างไร

ปัญหาอื่น ๆ ที่ฉันมีกับ clustTool คือมันถูกออกแบบโดยคำนึงถึง GUI ฉันไม่รู้ว่าจะข้ามค่าใช้จ่าย GUI ในห้องสมุดไปได้อย่างไรเพราะฉันไม่ต้องการ

ฉันมีตัวเลือกอะไรใน R สำหรับการวิเคราะห์กลุ่มของข้อมูลเชิงพื้นที่?



tnx whuber ผมมีคำถาม. มีแพ็คเกจเฉพาะสำหรับการจัดกลุ่มเชิงพื้นที่ใน R หรือไม่ ฉันหมายถึงเท่าที่ฉันเข้าใจว่าควรคำนวณระยะทางแตกต่างกันสำหรับข้อมูลเชิงพื้นที่ ถูกต้องหรือไม่
kaptan

เกือบทุกแพ็คเกจการจัดกลุ่มวัตถุประสงค์ทั่วไปที่ฉันพบรวมถึง R's Clusterจะยอมรับเมทริกซ์ที่แตกต่างกันหรือระยะทางเป็นอินพุต สิ่งนี้ทำให้พวกมันสมบูรณ์แบบทั่วไปและสามารถนำไปใช้กับการจัดกลุ่มบนทรงกลมได้หากคุณสามารถคำนวณระยะทางด้วยตัวเองซึ่งตรงไปตรงมา
whuber

ฉันกำลังประสบปัญหาคล้ายกันมากเป็นเวลานาน แต่ไม่สามารถหาทางออกที่ดีคุณสามารถดูที่โพสต์ของฉันในกองแลกเปลี่ยน ฉันมีชุดของข้อมูลอุณหภูมิผิวน้ำทะเลรายเดือน (lon, lat, sst) คุณพบวิธีการค้นหากลุ่มสำหรับข้อมูลเชิงพื้นที่ดังกล่าวหรือไม่? ฉันไม่พบแพ็คเกจ / ฟังก์ชั่น R ที่เหมาะสม ขอบคุณล่วงหน้า Paco
pacomet

คุณได้พิจารณาใช้ SatScan แล้วหรือยัง?

คำตอบ:


13

นี่คือวิธีการแก้ปัญหาตามค้นหากลุ่มของกฎตามระยะทางคะแนนแต่ใช้distmฟังก์ชั่นจากgeosphereแพคเกจ:

library(sp)
library(rgdal)
library(geosphere)

# example data from the thread
x <- c(-1.482156, -1.482318, -1.482129, -1.482880, -1.485735, -1.485770, -1.485913, -1.484275, -1.485866)
y <- c(54.90083, 54.90078, 54.90077, 54.90011, 54.89936, 54.89935, 54.89935, 54.89879, 54.89902)

# convert data to a SpatialPointsDataFrame object
xy <- SpatialPointsDataFrame(
      matrix(c(x,y), ncol=2), data.frame(ID=seq(1:length(x))),
      proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))

# use the distm function to generate a geodesic distance matrix in meters
mdist <- distm(xy)

# cluster all points using a hierarchical clustering approach
hc <- hclust(as.dist(mdist), method="complete")

# define the distance threshold, in this case 40 m
d=40

# define clusters based on a tree "height" cutoff "d" and add them to the SpDataFrame
xy$clust <- cutree(hc, h=d)

คุณควรได้รับ:

        coordinates ID clust
1 (-1.482156, 54.90083)  1     1
2 (-1.482318, 54.90078)  2     1
3 (-1.482129, 54.90077)  3     1
4  (-1.48288, 54.90011)  4     2
5 (-1.485735, 54.89936)  5     3
6  (-1.48577, 54.89935)  6     3
7 (-1.485913, 54.89935)  7     3
8 (-1.484275, 54.89879)  8     4
9 (-1.485866, 54.89902)  9     3

ขั้นตอนต่อไปนี้เป็นเพียงการสร้างภาพข้อมูล:

library(dismo)
library(rgeos)

# expand the extent of plotting frame
xy@bbox[] <- as.matrix(extend(extent(xy),0.001))

# get the centroid coords for each cluster
cent <- matrix(ncol=2, nrow=max(xy$clust))
for (i in 1:max(xy$clust))
    # gCentroid from the rgeos package
    cent[i,] <- gCentroid(subset(xy, clust == i))@coords

# compute circles around the centroid coords using a 40m radius
# from the dismo package
ci <- circles(cent, d=d, lonlat=T)

# plot
plot(ci@polygons, axes=T)
plot(xy, col=rainbow(4)[factor(xy$clust)], add=T)

พล็อต


ฉันมีปัญหาเกี่ยวกับสิ่งนี้: ฉันมีเมทริกซ์ระยะทางและฉันพบระยะทางที่ใหญ่ที่สุดสำหรับแต่ละรายการ: for (i in 1:186) { print(paste(i,min(distance[i,c(1:(i-1),(i+1):187)]))) } ต้องใช้4แต่เมื่อฉันสมัครx <- cutree(hc, h=5)จะให้ 101 กลุ่มจาก 187 กลุ่มในเชิงตรรกะควรเป็น 1 มีอะไรผิดปกติหรือไม่
Peter.k

สวัสดีฉันไม่แน่ใจว่าจะช่วยคุณได้อย่างไร ฉันทำตัวอย่างเล็ก ๆ x = as.dist(matrix(runif(100), ncol=10)); hc = hclust(x, method="complete"); cutree(hc, h=max(x))และจะปรับการทำงาน: สิ่งนี้จะให้คลัสเตอร์เดียวกับคุณตามที่คุณคาดหวัง ลองพล็อตโมเดลการทำคลัสเตอร์ของคุณด้วย: plot(hc)และดูว่าค่าสูงสุดคืออะไร
ssanch

11

มีฟังก์ชั่นสำหรับคำนวณระยะทางที่แท้จริงบนพื้นดินทรงกลมใน R ดังนั้นคุณสามารถใช้ฟังก์ชันเหล่านั้นและเรียกฟังก์ชันการทำคลัสเตอร์ด้วยเมทริกซ์ระยะทางแทนพิกัด ฉันไม่สามารถจำชื่อหรือแพ็คเกจที่เกี่ยวข้องได้ ดูเบาะแสงาน R-spatial

ตัวเลือกอื่นคือเปลี่ยนคะแนนของคุณเป็นระบบอ้างอิงเพื่อให้ระยะทางเป็นแบบยุคลิด ในสหราชอาณาจักรฉันสามารถใช้ระบบอ้างอิง OSGrid:

 data = spTransform(data,CRS("+epsg:27700"))

ใช้ spTransform จากแพ็คเกจ 'rgdal' (หรือบางที maptools) ค้นหาระบบกริดสำหรับข้อมูลของคุณ (โซน UTM ที่เกี่ยวข้องจะทำ) และคุณจะคำนวณระยะทางเป็นเมตรโดยไม่มีปัญหา

นี่เป็นสิ่งที่ดีถ้าข้อมูลของคุณเป็นพื้นที่ขนาดเล็ก - ถ้าคุณมีข้อมูลทั่วโลกคุณจำเป็นต้องคำนวณระยะทางทรงกลมจริงๆและนั่นเป็นหนึ่งในแพ็คเกจ (หรือมากกว่า) ของแพคเกจที่กล่าวถึงในมุมมองงาน R Spatial:

http://cran.r-project.org/web/views/Spatial.html

ดูเหมือนว่าคุณต้องการแพ็คเกจ "geosphere" แต่อ่านมุมมองภารกิจอวกาศ!


7

ฉันจะดูแพ็คเกจSpatstat แพคเกจทั้งหมดมีไว้สำหรับการวิเคราะห์รูปแบบจุดเชิงพื้นที่ (sic) มีebook ที่ยอดเยี่ยมที่เขียนโดยศาสตราจารย์ Adrian Baddeley ที่ CSIROซึ่งมีเอกสารรายละเอียดวิธีการใช้งานและตัวอย่างสำหรับแพ็คเกจทั้งหมด ดูที่บทที่ 19 สำหรับ "วิธีการระยะทางสำหรับรูปแบบจุด"

ที่กล่าวว่าฉันไม่แน่ใจว่าแม้ spatstat แยกความแตกต่างระหว่างข้อมูลเชิงพื้นที่และลำดับดังนั้นคุณอาจต้องการที่จะตำหนิจุดของคุณเป็นสิ่งที่มีค่า x และ y ที่สอดคล้องกัน - อาจลองใช้rgdal (ห้องสมุด R สำหรับ GDAL และ OGR)


TNX นั่นเป็น ebook ที่ยอดเยี่ยม แต่ฉันไม่แน่ใจว่าการจัดกลุ่มสามารถทำได้โดยใช้ Spatstat นี้เพราะฉันไม่เห็นฟังก์ชั่นเฉพาะสำหรับการจัดกลุ่ม คุณช่วยอธิบายหน่อยได้ไหม?
kaptan

2
ที่จริงแล้วเพื่อความเป็นธรรมหลังจากได้ดูอีกครั้งฉันจะดูแพคเกจDClusterซึ่งเป็นแพคเกจที่ Bivand ทำการวิเคราะห์กลุ่มโรคด้วย นอกจากนี้ยังขอโทษที่รอการตอบกลับ!
om_henners

6

บางทีคำตอบนี้อาจจะช้าไป 2 ปี แต่อย่างไรก็ตาม

สำหรับความรู้ของฉันการจัดกลุ่มเชิงพื้นที่จำเป็นต้องมีย่านที่กำหนดซึ่งการจัดกลุ่มจะถูก จำกัด อย่างน้อยที่สุดในตอนเริ่มต้น kulldorfฟังก์ชั่นในSpatialEpiแพคเกจช่วยให้การจัดกลุ่มอยู่บนพื้นฐานเชิงพื้นที่ละแวกใกล้เคียงที่รวบรวม

ต่อไปDBSCANสถิติพร้อมใช้งานจากfpcแพคเกจอาจจะมีประโยชน์

ดูที่นี่สำหรับการสนทนาที่คล้ายกัน: https://stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

และที่นี่สำหรับรายงานที่น่าสนใจเกี่ยวกับอัลกอริทึมของคลัสเตอร์ล่าสุดเช่น CHAMAELEON: http://www.cs.uiuc.edu/homes/hanj/pdf/gkdbk01.pdf


บทความนั้นโดย Han et al. "วิธีการจัดกลุ่มเชิงพื้นที่ในการทำเหมืองข้อมูล: การสำรวจ" สามารถดูได้ที่: hanj.cs.illinois.edu/pdf/gkdbk01.pdf
knb

5

แม้ว่าจะไม่ใช่Rแพ็คเกจ แต่Geodaอาจเป็นโปรแกรมที่น่าสนใจในการตรวจสอบเนื่องจากเขียนโดย Luc Anselin ซึ่งสนับสนุนทฤษฎีการจัดกลุ่มเชิงพื้นที่และฉันเชื่อว่ามันสามารถเปิดใช้งานการจัดกลุ่มบางอย่างได้ (แม้ว่าจะมีบางเวลาตั้งแต่ฉันสำรวจแล้ว)

spdepเป็นRแพ็คเกจที่ยอดเยี่ยม ซึ่งจะรวมถึงskaterฟังก์ชั่นสำหรับอวกาศ 'K'luster การวิเคราะห์โดยการกำจัดต้นไม้ขอบ นอกจากนี้ยังนำฟังก์ชั่นอื่น ๆ สำหรับการวิเคราะห์เชิงพื้นที่รวมถึงความสัมพันธ์อัตโนมัติเชิงพื้นที่และการตรวจจับของกลุ่มท้องถิ่นโดยใช้ Local Moran และสถิติเชิงพื้นที่อื่น ๆ มันอธิบายไว้ดังนี้

คอลเลกชันของฟังก์ชั่นในการสร้างวัตถุเมทริกซ์น้ำหนักเชิงพื้นที่จากรูปหลายเหลี่ยมจากจุดของรูปแบบตามระยะทางและ tesselations สำหรับการสรุปวัตถุเหล่านี้และสำหรับการอนุญาตให้ใช้ในการวิเคราะห์ข้อมูลเชิงพื้นที่รวมถึงการรวมภูมิภาค คอลเลกชันของการทดสอบสำหรับ autocorrelation เชิงพื้นที่รวมทั้ง Moran I, APLE, Geary C, Hubert / Mantel สถิติผลิตภัณฑ์ข้ามทั่วไป, Empirical Bayes ประมาณการและAssunção / Reis ดัชนี, Getis / Ord G และสถิติการเข้าร่วมหลายสี, Moran I และ Getis / Ord G, การประมาณค่าแบบอานม้าและการทดสอบที่แน่นอนสำหรับ Moran I ระดับโลกและระดับท้องถิ่น; และฟังก์ชั่นสำหรับการประมาณค่าความล่าช้าเชิงพื้นที่พร้อมกันแบบอัตโนมัติ (SAR) และแบบจำลองข้อผิดพลาดการวัดผลกระทบสำหรับแบบจำลองความล่าช้า

อย่างน้อยคุณสามารถทดสอบว่าคะแนนของคุณมีการกระจายแบบสุ่ม (สันนิษฐานว่าเป็นการทดสอบล่วงหน้าที่มีประโยชน์เมื่อพิจารณาระยะทางเชิงพื้นที่) แต่ก็สามารถสร้างมาตรการที่มีประโยชน์อื่น ๆ ที่คุณสามารถป้อนไปยังอัลกอริทึมการจัดกลุ่มของคุณ ในที่สุดบางทีคุณอาจพบคำถามที่มีประโยชน์ในhttps://stats.stackexchange.com/การจัดการกับปัญหาการจัดกลุ่มเชิงพื้นที่ (แต่เพิ่มเติมจากมุมมองเชิงทฤษฎี)


คำตอบนี้เป็นการระบุฟังก์ชันการทำงานประเภทเดียวกันมากมายวิเคราะห์รูปแบบเชิงพื้นที่หรือความสัมพันธ์อัตโนมัติของรูปแบบจุดที่มีอยู่ในไลบรารี spatstat ที่นี่เป็นที่น่าสนใจมันไม่ได้มีปัญหากับการรวมกลุ่ม ฉันทั้งหมดสำหรับการทดสอบสมมติฐานและการวิเคราะห์เชิงสำรวจ แต่ก็ควรตอบคำถามในมือโดยตรง วิธีการสำหรับการทำคลัสเตอร์โดยใช้ spdep นั้นขึ้นอยู่กับเมทริกซ์น้ำหนักเชิงพื้นที่ [Wij] โดยใช้ k เพื่อนบ้านที่ใกล้ที่สุด, ความบังเอิญหรือระยะทาง
Jeffrey Evans

2

ลองใช้ LeaderCluster packacge ใน R ซึ่งแตกต่างจากอัลกอริทึมการจัดกลุ่มอื่น ๆ ที่ไม่ต้องการให้ผู้ใช้ระบุจำนวนของกลุ่ม แต่ต้องการรัศมีโดยประมาณของคลัสเตอร์เป็นพารามิเตอร์การปรับแต่งหลัก


-2

ตรวจสอบฟังก์ชั่นระยะทางแพคเกจ geosphere หรือฟังก์ชั่นฟอสซิล deg.dist คุณมีข้อมูลเป็นองศาและจำเป็นต้องแปลเป็นเมตรหรือฟุตก่อนทำการจัดกลุ่ม

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