R09 Multidimensional Scaling (MDS) # From your book, a set of distances between European cities cities.dist <- read.table("F:/S5600/Data sets/ASCII/Ch07/CITIES.txt", row.names=1) cities.dist cities <- rownames(cities.dist) colnames(cities.dist) <- cities cities.dist cities.mds <- cmdscale(cities.dist, k=2) plot(cities.mds) identify(cities.mds, labels=cities) # A similar example from R eurodist euro.mds <- cmdscale(eurodist, k=2) plot(euro.mds, type="n") text(euro.mds, rownames(euro.mds)) euro.mds[,2] <- -1*euro.mds[,2] plot(euro.mds, type="n") text(euro.mds, rownames(euro.mds)) euro.sh <- Shepard(as.dist(eurodist),euro.mds) plot(euro.sh$y, euro.sh$x, pch=16) # Book's orientation points(euro.sh$yf, euro.sh$x, pch=3,col="red") # Examine States by Voting Patterns, 1960-1976 library(cluster) data(votes.repub) repub <- votes.repub[,27:31] head(repub) pairs(repub) repub.dist <- dist(repub) # create a distance matrix repub.mds <- cmdscale(repub.dist, k=2) plot(repub.mds, type="n") text(repub.mds, state.abb) repub.pca <- prcomp(repub) plot(-repub.pca$x[,1],repub.pca$x[,2], type="n") text(-repub.pca$x[,1],repub.pca$x[,2], state.abb) text(repub.mds, state.abb, col="red") # Nonmetric MDS - Car Dissimilarity Data library(MASS) # Needed for nonmetric MDS car.dis <- read.tri("F:/S5600/Data sets/ASCII/Ch07/CAR.txt") rownames(car.dis) <- c("BMW","Ford","Infiniti","Jeep","Lexus", "Chrysler","Mercedes","Saab","Porsche","Volvo") colnames(car.dis) <- rownames(car.dis) car.dis car.nmds <- isoMDS(car.dis, k=2) plot(car.nmds$points) identify(car.nmds$points, labels=rownames(car.dis)) car.nmds$stress # Shepard diagram delta <- as.dist(car.dis) delta d <- dist(car.nmds$points) d plot(d, delta, pch=16) car.sh <- Shepard(delta, car.nmds$points) plot(car.sh$y, car.sh$x, pch=16) # Book's orientation points(car.sh$yf, car.sh$x, pch=3,col="red") # Drug Use Data - Correlations as Variable Similarities drug.cor <- read.tri("F:/S5600/Data sets/ASCII/Ch04/DRUG_USE.txt") rownames(drug.cor) <- c("Cigarettes","Beer","Wine","Liquor","Cocaine", "Tranquillizers","Medication","Heroin","Marijuana","Hashish", "Inhalants","Hallucinogenics","Amphetamines") colnames(drug.cor) <- rownames(drug.cor) head(drug.cor) # Convert to distances - method 1 (works well for correlations) drug.dist <- 1-drug.cor head(drug.dist) drug.nmds <- isoMDS(drug.dist, k=2) plot(drug.nmds$points) identify(drug.nmds$points, labels=rownames(drug.dist)) drug.sh <- Shepard(as.dist(drug.dist), drug.nmds$points) plot(drug.sh$y, drug.sh$x, pch=16) points(drug.sh$yf, drug.sh$x, pch=3,col="red") # Convert to distances - method 2 (more general) drug.dist2 <-matrix(0, nrow=13, ncol=13) for (i in 1:13) for (j in 1:13) drug.dist2[i,j] <- sqrt(drug.cor[i,i]-2*drug.cor[i,j]+drug.cor[j,j]) plot(drug.dist, drug.dist2) drug.nmds2 <- isoMDS(drug.dist2, k=2) plot(drug.nmds2$points) identify(drug.nmds2$points, labels=rownames(drug.dist)) drug.sh2 <- Shepard(as.dist(drug.dist), drug.nmds2$points) plot(drug.sh2$y, drug.sh2$x, pch=16) points(drug.sh2$yf, drug.sh2$x, pch=3,col="red")