A többdimenziós skálázást (MDS) egy dimenziócsökkentő eljárás, melyet először a földrajzban használtak térképek kirajzolására. Azóta számos más területen is alkalmazzák, pl. pszichológiában kognitív térképek. Ennek a bejegyzésnek a célja az MDS alkalmazásának bemutatása R-ben. Példaként Magyarország térképét fogjuk kirajzolni települések távolságmátrixának felhasználásával.
Hazánk távolságmátrixát a http://www.psoft.hu/termekek/telepules-matrix.html weboldalról lehet letölteni XLS formátumban.
XLS fájl beolvasására bőven van választási lehetőség az R csomagok között: gdata, xlsReadWrite, XLConnect, xlsx, stb. Ezek közül én személy szerint az XLConnect csomagot használom, illetve fogom használni a példa során.
Adatok betöltése:
Az adatok betöltését 2 lépésből oldjuk meg: Az xls fájl betöltése után az adatokat az első munkalapból olvassuk be, ugyanis ez tartalmazza a távolságokat.
1 2 3 4 |
library(XLConnect) wb <- loadWorkbook("psoft-telepules-matrix-30000.xls") # A munkafüzet beolvasása data <- readWorksheet(wb, 1) # Az első munkalap betöltése |
Adatok tisztítása:
Az elemzés elvégzéséhez egy numerikus mátrixra van szükségünk, illetve a városok neveire. Amit alakítani kell a jelenlegi adathalmazon:
- Az első oszlopot tartalmazó városnevekből sorneveket csinálunk, majd töröljük.
- Utolsó sorban a psoft promo szövege található, amire értelemszerűen nincs szükségünk.
- Azonos városok távolságánál hiányzó, vagyis (NA) értékek szerepelnek, ezeket le kell cserélni 0-ra.
Megvalósítás:
1 2 3 |
rownames(data) <- data[, 1] # Sornév létrehozása data <- data[-nrow(data), -1] # Utolsó sor és első oszlop elhagyása data[is.na(data)] <- 0 # NA értékek lecserélése 0-ra. |
Kész is van a távolságmátrixunk, most már nekieshetünk a többdimenziós skálázásnak. MDS-re több lehetőség is van, én a legegyszerűbbet: a cmdscale függvényt alkalmazom, ami a stat package-en belül található. Paraméterként egy numerikus mátrixot, vagy data.frame-et kell megadni. Alapértelmezetten 2 dimenziót használ, ezt a k paraméterrel lehet állítani. Általában a priori módon határozzák meg.
1 |
MDS <- cmdscale(data) |
A koordinátákat az MDS mátrix 2 oszlopa tartalmazza. Ezek alapján szeretnénk kirajzolni a térképet a ggplot2 quickplotja segítségével. Az első oszlop az x koordináta, a második pedig az y.
1 2 3 4 |
library(ggplot2) p <- qplot(MDS[, 1], MDS[, 2], label=rownames(data)) p <- p + geom_text() p |
Ezzel a probléma, hogy a tengelyek fel vannak cserélve. Az MDS ugyanis a távolságok alapján nem tudja megállapítani, hogy melyik város van északra, vagy éppen délre. Ha mindkét tengelyre tükrözzük a koordinátákat, akkor már ismerősebb lehet a plot.
1 2 3 |
p2 <- qplot(-1*MDS[, 1], -1*MDS[, 2], label=rownames(data)) p2 <- p2 + geom_text() p2 |
Ellenőrzés, a modell jósága:
Az MDS lényege hogy egy adathalmazt dimenziócsökkentéssel könnyebben elemezhetővé tegyen. A dimenziócsökkentési eljárások a legtöbb esetben információveszteséggel járnak. A modell jóságát többféleképpen is ellenőrizhetjük, jelen esetben a determinációs hányados alapján fogunk dönteni.
1 2 3 |
library(MASS) shep <- Shepard(data, MDS) summary(lm(shep$yf ~ shep$x))$r.squared |
1 |
0.9875959 |
Az információveszteség mértéke kevesebb mint 2% tehát a modell kiemelkedően jónak számít.