library("MPsychoR")
library("smacof")
chps = read.csv("chps_support.csv")
#Random force used to add missing values. missRanger - Fast Imputation of Missing Values by Chained Random Forests
options(digits=2, scipen=999)
data(list="chps", package="MPsychoR")
data set 㤼㸱chps㤼㸲 not found
mydata2<-missRanger::missRanger(data = chps, verbose=0)
for(j in 1:ncol(mydata2))mydata2[,j]<-round(mydata2[,j])
M <- tidyr::gather(data=mydata2,key="Item", value = "Value")
M$Item <-factor(x=M$Item, levels = names(sort(tapply(X=M$Value, INDEX=M$Item, FUN=mean))))
require(ggplot2)
ggplot(M) + aes(x=Value, fill=Item)+geom_bar()+facet_wrap(~Item)

#Standardized the variables since not all of the variables were the same.
standardize = function(x){
return ((x-mean(x,na.rm=TRUE))/sd(x,na.rm=TRUE))
}
std_data = as.data.frame(apply(mydata2,2,standardize))
library("smacof")
Wdelta <- dist(t(std_data)) ## Euclidean distances
fit.wenchuan1 <- mds(Wdelta, type = "ordinal") ## MDS fit
fit.wenchuan1
Call:
mds(delta = Wdelta, type = "ordinal")
Model: Symmetric SMACOF
Number of objects: 13
Stress-1 value: 0.15
Number of iterations: 49
plot(fit.wenchuan1, main = "CHPS Survey MDS")

#The stress is higher using the randomstress test.
set.seed(123)
rsvec <- randomstress(n = attr(Wdelta, "Size"), ndim = 2,
nrep = 500, type = "ordinal")
mean(rsvec)
[1] 0.24
hist(x=rsvec, main = "Histogram of randomly generated/nmultidimensional scaling stress")

#The model above is less than 0.21, which means that it is statistically significant.
mean(rsvec) - 2*sd(rsvec)
[1] 0.21
set.seed(123)
permmds <- permtest(fit.wenchuan1, data = std_data,
method.dat = "euclidean", nrep = 500,
verbose = FALSE)
permmds
Call: permtest.smacof(object = fit.wenchuan1, data = std_data, method.dat = "euclidean",
nrep = 500, verbose = FALSE)
SMACOF Permutation Test
Number of objects: 13
Number of replications (permutations): 500
Observed stress value: 0.15
p-value: 0.004
n <- attr(Wdelta, "Size")
svec <- NULL
for (i in 1:(n-1)) {
svec[i] <- mds(Wdelta, ndim = i, type = "ordinal")$stress
}
plot(x=1:(n-1), y=svec, type="b", main = "MDS Scree Plot", pch=20, xlab="Number of Dimensions", ylab = "Stress")

set.seed(123)
fit.wenchuan <- NULL ## 100 random starts
for(i in 1:100) {
fit.wenchuan[[i]] <- mds(Wdelta, type = "ordinal",
init = "random")
}
ind <- which.min(sapply(fit.wenchuan,
function(x) x$stress))
fit.wenchuan2 <- fit.wenchuan[[ind]]
fit.wenchuan2$stress ## lowest stress (random start)
[1] 0.15
fit.wenchuan2
Call:
mds(delta = Wdelta, type = "ordinal", init = "random")
Model: Symmetric SMACOF
Number of objects: 13
Stress-1 value: 0.15
Number of iterations: 289
fit.wenchuan1$stress ## stress (classical scaling start)
[1] 0.15
fit.wenchuan3 <- mds(Wdelta, type = "interval")
fit.wenchuan3
Call:
mds(delta = Wdelta, type = "interval")
Model: Symmetric SMACOF
Number of objects: 13
Stress-1 value: 0.2
Number of iterations: 54
plot(fit.wenchuan3, plot.type = "Shepard",
main = "Shepard Diagram (Interval MDS)")

plot(fit.wenchuan1, plot.type = "Shepard",
main = "Shepard Diagram (Orginal MDS)")

plot(fit.wenchuan2, plot.type = "Shepard",
main = "Shepard Diagram (Ordinal MDS)")

#Configurations
plot(fit.wenchuan2, plot.type = "confplot", main= "confplot (Random Ordinal MDS)")

plot(fit.wenchuan2, plot.type = "resplot", main= "resplot (Random Ordinal MDS)")

plot(fit.wenchuan2, plot.type = "stressplot", main= "stressplot (Random Ordinal MDS)")

plot(fit.wenchuan2, plot.type = "bubbleplot", main= "bubbleplot(Random Ordinal MDS)")

library("colorspace")
set.seed(123)
bootWen <- bootmds(fit.wenchuan2, data = std_data,
method.dat = "euclidean", nrep = 100)
cols <- rainbow_hcl(17, l = 60)
plot(bootWen, col = cols)
colpal <- c(rainbow_hcl(3, c=100))
pal <-palette(colpal)
memb <- c(3,1,1,3,1,3,1,2,2,1,3,2,2)
plot(fit.wenchuan2, main = "Configuration", label.conf = list(label=FALSE), col = memb)
legend("topright", legend = c("Inform", "Support", "Relationships"), col=colpal, pch=20)
palette(pal)
colpal <- c(rainbow_hcl(3, c=100, l=30))
pal <- palette(colpal)
text(fit.wenchuan2$conf[-7,], labels=rownames(fit.wenchuan2$conf)[-7], col=memb[-7], pos=3, cex=0.8)
text(fit.wenchuan2$conf[7.1], fit.wenchuan2$conf[7,2], labels= rownames(fit.wenchuan2$conf)[7], col=memb[7], pos=1, cex=0.8)

#This is taking it a step further with Confirmatory Multidimensional Scaling
library("MPsychoR")
library("smacof")
cormatrix<-cor(std_data)
corrplot::corrplot(corr=cormatrix, method="ellipse", diag = FALSE, order="hclust")

ocpD <- sim2diss(cormatrix)
fit.ocp1 <- mds(ocpD, type = "ordinal")
fit.ocp1
Call:
mds(delta = ocpD, type = "ordinal")
Model: Symmetric SMACOF
Number of objects: 13
Stress-1 value: 0.15
Number of iterations: 49
v_color <- viridis::viridis(
n=length(13)
)
names(v_color)<-sort(13)
v<-c("confplot", "resplot", "Shepard", "stressplot", "bubbleplot", "histogram")
for(j in v) plot(x=fit.ocp1, plot.type=j, main=j)






LS0tDQp0aXRsZTogIkZpbmFsIFByb2plY3QgLSBFeHBsb3JhdG9yeSBNdWx0aWRpbWVuc2lvbmFsIFNjYWxpbmcsIFRha2UgMiINCmF1dGhvcjogSmFrZSBSZXlub2xkcywgSW5kZXBlbmRlbnQgU3R1ZHksIEZhbGwgMjAyMQ0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KCJNUHN5Y2hvUiIpDQpsaWJyYXJ5KCJzbWFjb2YiKQ0KY2hwcyA9IHJlYWQuY3N2KCJjaHBzX3N1cHBvcnQuY3N2IikNCmBgYA0KDQojUmFuZG9tIGZvcmNlIHVzZWQgdG8gYWRkIG1pc3NpbmcgdmFsdWVzLiBtaXNzUmFuZ2VyIC0gRmFzdCBJbXB1dGF0aW9uIG9mIE1pc3NpbmcgVmFsdWVzIGJ5IENoYWluZWQgUmFuZG9tIEZvcmVzdHMNCmBgYHtyfQ0Kb3B0aW9ucyhkaWdpdHM9Miwgc2NpcGVuPTk5OSkNCmRhdGEobGlzdD0iY2hwcyIsIHBhY2thZ2U9Ik1Qc3ljaG9SIikNCm15ZGF0YTI8LW1pc3NSYW5nZXI6Om1pc3NSYW5nZXIoZGF0YSA9IGNocHMsIHZlcmJvc2U9MCkNCmBgYA0KYGBge3J9DQpmb3IoaiBpbiAxOm5jb2wobXlkYXRhMikpbXlkYXRhMlssal08LXJvdW5kKG15ZGF0YTJbLGpdKQ0KTSA8LSB0aWR5cjo6Z2F0aGVyKGRhdGE9bXlkYXRhMixrZXk9Ikl0ZW0iLCB2YWx1ZSA9ICJWYWx1ZSIpIA0KTSRJdGVtIDwtZmFjdG9yKHg9TSRJdGVtLCBsZXZlbHMgPSBuYW1lcyhzb3J0KHRhcHBseShYPU0kVmFsdWUsIElOREVYPU0kSXRlbSwgRlVOPW1lYW4pKSkpDQpyZXF1aXJlKGdncGxvdDIpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoTSkgKyBhZXMoeD1WYWx1ZSwgZmlsbD1JdGVtKStnZW9tX2JhcigpK2ZhY2V0X3dyYXAofkl0ZW0pDQpgYGANCg0KDQojU3RhbmRhcmRpemVkIHRoZSB2YXJpYWJsZXMgc2luY2Ugbm90IGFsbCBvZiB0aGUgdmFyaWFibGVzIHdlcmUgdGhlIHNhbWUuDQpgYGB7cn0NCnN0YW5kYXJkaXplID0gZnVuY3Rpb24oeCl7DQogIHJldHVybiAoKHgtbWVhbih4LG5hLnJtPVRSVUUpKS9zZCh4LG5hLnJtPVRSVUUpKQ0KfQ0KYGBgDQpgYGB7cn0NCnN0ZF9kYXRhID0gYXMuZGF0YS5mcmFtZShhcHBseShteWRhdGEyLDIsc3RhbmRhcmRpemUpKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeSgic21hY29mIikNCldkZWx0YSA8LSBkaXN0KHQoc3RkX2RhdGEpKSAjIyBFdWNsaWRlYW4gZGlzdGFuY2VzDQpmaXQud2VuY2h1YW4xIDwtIG1kcyhXZGVsdGEsIHR5cGUgPSAib3JkaW5hbCIpICMjIE1EUyBmaXQNCmZpdC53ZW5jaHVhbjENCg0KYGBgDQoNCmBgYHtyfQ0KcGxvdChmaXQud2VuY2h1YW4xLCBtYWluID0gIkNIUFMgU3VydmV5IE1EUyIpDQpgYGANCiNUaGUgc3RyZXNzIGlzIGhpZ2hlciB1c2luZyB0aGUgcmFuZG9tc3RyZXNzIHRlc3QuIA0KYGBge3J9DQpzZXQuc2VlZCgxMjMpDQpyc3ZlYyA8LSByYW5kb21zdHJlc3MobiA9IGF0dHIoV2RlbHRhLCAiU2l6ZSIpLCBuZGltID0gMiwNCm5yZXAgPSA1MDAsIHR5cGUgPSAib3JkaW5hbCIpDQptZWFuKHJzdmVjKQ0KYGBgDQpgYGB7cn0NCmhpc3QoeD1yc3ZlYywgbWFpbiA9ICJIaXN0b2dyYW0gb2YgcmFuZG9tbHkgZ2VuZXJhdGVkL25tdWx0aWRpbWVuc2lvbmFsIHNjYWxpbmcgc3RyZXNzIikNCmBgYA0KI1RoZSBtb2RlbCBhYm92ZSBpcyBsZXNzIHRoYW4gMC4yMSwgd2hpY2ggbWVhbnMgdGhhdCBpdCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiANCmBgYHtyfQ0KbWVhbihyc3ZlYykgLSAyKnNkKHJzdmVjKQ0KYGBgDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0KcGVybW1kcyA8LSBwZXJtdGVzdChmaXQud2VuY2h1YW4xLCBkYXRhID0gc3RkX2RhdGEsDQptZXRob2QuZGF0ID0gImV1Y2xpZGVhbiIsIG5yZXAgPSA1MDAsDQp2ZXJib3NlID0gRkFMU0UpDQpwZXJtbWRzDQpgYGANCg0KYGBge3J9DQpuIDwtIGF0dHIoV2RlbHRhLCAiU2l6ZSIpDQpzdmVjIDwtIE5VTEwNCmZvciAoaSBpbiAxOihuLTEpKSB7DQpzdmVjW2ldIDwtIG1kcyhXZGVsdGEsIG5kaW0gPSBpLCB0eXBlID0gIm9yZGluYWwiKSRzdHJlc3MNCn0NCmBgYA0KDQpgYGB7cn0NCnBsb3QoeD0xOihuLTEpLCB5PXN2ZWMsIHR5cGU9ImIiLCBtYWluID0gIk1EUyBTY3JlZSBQbG90IiwgcGNoPTIwLCB4bGFiPSJOdW1iZXIgb2YgRGltZW5zaW9ucyIsIHlsYWIgPSAiU3RyZXNzIikNCmBgYA0KYGBge3J9DQpzZXQuc2VlZCgxMjMpDQpmaXQud2VuY2h1YW4gPC0gTlVMTCAjIyAxMDAgcmFuZG9tIHN0YXJ0cw0KZm9yKGkgaW4gMToxMDApIHsNCmZpdC53ZW5jaHVhbltbaV1dIDwtIG1kcyhXZGVsdGEsIHR5cGUgPSAib3JkaW5hbCIsDQppbml0ID0gInJhbmRvbSIpDQp9DQppbmQgPC0gd2hpY2gubWluKHNhcHBseShmaXQud2VuY2h1YW4sDQpmdW5jdGlvbih4KSB4JHN0cmVzcykpDQpmaXQud2VuY2h1YW4yIDwtIGZpdC53ZW5jaHVhbltbaW5kXV0NCmZpdC53ZW5jaHVhbjIkc3RyZXNzICMjIGxvd2VzdCBzdHJlc3MgKHJhbmRvbSBzdGFydCkNCg0KDQpgYGANCmBgYHtyfQ0KZml0LndlbmNodWFuMiANCmBgYA0KDQoNCmBgYHtyfQ0KZml0LndlbmNodWFuMSRzdHJlc3MgIyMgc3RyZXNzIChjbGFzc2ljYWwgc2NhbGluZyBzdGFydCkNCmBgYA0KYGBge3J9DQpmaXQud2VuY2h1YW4zIDwtIG1kcyhXZGVsdGEsIHR5cGUgPSAiaW50ZXJ2YWwiKQ0KZml0LndlbmNodWFuMw0KYGBgDQoNCmBgYHtyfQ0KDQpwbG90KGZpdC53ZW5jaHVhbjMsIHBsb3QudHlwZSA9ICJTaGVwYXJkIiwNCm1haW4gPSAiU2hlcGFyZCBEaWFncmFtIChJbnRlcnZhbCBNRFMpIikNCmBgYA0KDQpgYGB7cn0NCnBsb3QoZml0LndlbmNodWFuMSwgcGxvdC50eXBlID0gIlNoZXBhcmQiLA0KbWFpbiA9ICJTaGVwYXJkIERpYWdyYW0gKE9yZ2luYWwgTURTKSIpDQoNCmBgYA0KDQpgYGB7cn0NCnBsb3QoZml0LndlbmNodWFuMiwgcGxvdC50eXBlID0gIlNoZXBhcmQiLA0KbWFpbiA9ICJTaGVwYXJkIERpYWdyYW0gKE9yZGluYWwgTURTKSIpDQoNCmBgYA0KDQojQ29uZmlndXJhdGlvbnMgDQoNCmBgYHtyfQ0KcGxvdChmaXQud2VuY2h1YW4yLCBwbG90LnR5cGUgPSAiY29uZnBsb3QiLCBtYWluPSAiY29uZnBsb3QgKFJhbmRvbSBPcmRpbmFsIE1EUykiKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChmaXQud2VuY2h1YW4yLCBwbG90LnR5cGUgPSAicmVzcGxvdCIsIG1haW49ICJyZXNwbG90IChSYW5kb20gT3JkaW5hbCBNRFMpIikNCmBgYA0KDQpgYGB7cn0NCnBsb3QoZml0LndlbmNodWFuMiwgcGxvdC50eXBlID0gInN0cmVzc3Bsb3QiLCBtYWluPSAic3RyZXNzcGxvdCAoUmFuZG9tIE9yZGluYWwgTURTKSIpDQpgYGANCg0KYGBge3J9DQpwbG90KGZpdC53ZW5jaHVhbjIsIHBsb3QudHlwZSA9ICJidWJibGVwbG90IiwgbWFpbj0gImJ1YmJsZXBsb3QoUmFuZG9tIE9yZGluYWwgTURTKSIpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KCJjb2xvcnNwYWNlIikNCnNldC5zZWVkKDEyMykNCmJvb3RXZW4gPC0gYm9vdG1kcyhmaXQud2VuY2h1YW4yLCBkYXRhID0gc3RkX2RhdGEsDQptZXRob2QuZGF0ID0gImV1Y2xpZGVhbiIsIG5yZXAgPSAxMDApDQpjb2xzIDwtIHJhaW5ib3dfaGNsKDE3LCBsID0gNjApDQpwbG90KGJvb3RXZW4sIGNvbCA9IGNvbHMpDQpgYGANCg0KYGBge3J9DQpjb2xwYWwgPC0gYyhyYWluYm93X2hjbCgzLCBjPTEwMCkpDQpwYWwgPC1wYWxldHRlKGNvbHBhbCkNCm1lbWIgPC0gYygzLDEsMSwzLDEsMywxLDIsMiwxLDMsMiwyKQ0KcGxvdChmaXQud2VuY2h1YW4yLCBtYWluID0gIkNvbmZpZ3VyYXRpb24iLCBsYWJlbC5jb25mID0gbGlzdChsYWJlbD1GQUxTRSksIGNvbCA9IG1lbWIpDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiSW5mb3JtIiwgIlN1cHBvcnQiLCAiUmVsYXRpb25zaGlwcyIpLCBjb2w9Y29scGFsLCBwY2g9MjApDQpwYWxldHRlKHBhbCkNCmNvbHBhbCA8LSBjKHJhaW5ib3dfaGNsKDMsIGM9MTAwLCBsPTMwKSkNCnBhbCA8LSBwYWxldHRlKGNvbHBhbCkNCnRleHQoZml0LndlbmNodWFuMiRjb25mWy03LF0sIGxhYmVscz1yb3duYW1lcyhmaXQud2VuY2h1YW4yJGNvbmYpWy03XSwgY29sPW1lbWJbLTddLCBwb3M9MywgY2V4PTAuOCkNCnRleHQoZml0LndlbmNodWFuMiRjb25mWzcuMV0sIGZpdC53ZW5jaHVhbjIkY29uZls3LDJdLCBsYWJlbHM9IHJvd25hbWVzKGZpdC53ZW5jaHVhbjIkY29uZilbN10sIGNvbD1tZW1iWzddLCBwb3M9MSwgY2V4PTAuOCkNCmBgYA0KI1RoaXMgaXMgdGFraW5nIGl0IGEgc3RlcCBmdXJ0aGVyIHdpdGggQ29uZmlybWF0b3J5IE11bHRpZGltZW5zaW9uYWwgU2NhbGluZw0KDQoNCmBgYHtyfQ0KbGlicmFyeSgiTVBzeWNob1IiKQ0KbGlicmFyeSgic21hY29mIikNCmNvcm1hdHJpeDwtY29yKHN0ZF9kYXRhKQ0KY29ycnBsb3Q6OmNvcnJwbG90KGNvcnI9Y29ybWF0cml4LCBtZXRob2Q9ImVsbGlwc2UiLCBkaWFnID0gRkFMU0UsIG9yZGVyPSJoY2x1c3QiKQ0Kb2NwRCA8LSBzaW0yZGlzcyhjb3JtYXRyaXgpDQoNCg0KDQpgYGANCg0KYGBge3J9DQpmaXQub2NwMSA8LSBtZHMob2NwRCwgdHlwZSA9ICJvcmRpbmFsIikNCmZpdC5vY3AxDQpgYGANCmBgYHtyfQ0Kdl9jb2xvciA8LSB2aXJpZGlzOjp2aXJpZGlzKA0Kbj1sZW5ndGgoMTMpDQopDQpuYW1lcyh2X2NvbG9yKTwtc29ydCgxMykNCnY8LWMoImNvbmZwbG90IiwgInJlc3Bsb3QiLCAiU2hlcGFyZCIsICJzdHJlc3NwbG90IiwgImJ1YmJsZXBsb3QiLCAiaGlzdG9ncmFtIikNCmZvcihqIGluIHYpIHBsb3QoeD1maXQub2NwMSwgcGxvdC50eXBlPWosIG1haW49aikNCmBgYA0KDQoNCg0K