library("MPsychoR")
library("smacof")
VaHSdata = read.csv("VaHSdata.csv")
options(digits=2, scipen=999)
data(list="VaHSdata", package="MPsychoR")
mydata2<-missRanger::missRanger(data = VaHSdata, verbose=0)
library(psych)
describe(mydata2)

#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))
for(j in 1:ncol(std_data))std_data[,j]<-round(std_data[,j])
M <- tidyr::gather(data=std_data,key="Item", value = "Value") 
M$Item <-factor(x=M$Item, levels = names(sort(tapply(X=M$Value, INDEX=M$Item, FUN=mean))))
require(ggplot2)
Loading required package: ggplot2
ggplot(M) + aes(x=Value, fill=Item)+geom_bar()+facet_wrap(~Item)

library("smacof")
Wdelta <- dist(t(std_data)) ## Euclidean distances
fit.VaHSdata1 <- mds(Wdelta, type = "ordinal") ## MDS fit
fit.VaHSdata1

Call:
mds(delta = Wdelta, type = "ordinal")

Model: Symmetric SMACOF 
Number of objects: 12 
Stress-1 value: 0.1 
Number of iterations: 51 
plot(fit.VaHSdata1, main = "VaHSdata")

#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.22
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.19
set.seed(123)
permmds <- permtest(fit.VaHSdata1, data = std_data,
method.dat = "euclidean", nrep = 500,
verbose = FALSE)
permmds

Call: permtest.smacof(object = fit.VaHSdata1, data = std_data, method.dat = "euclidean", 
    nrep = 500, verbose = FALSE)

SMACOF Permutation Test
Number of objects: 12 
Number of replications (permutations): 500 

Observed stress value: 0.1 
p-value: <0.001 
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.VaHSdata <- NULL ## 100 random starts
for(i in 1:100) {
fit.VaHSdata[[i]] <- mds(Wdelta, type = "ordinal",
init = "random")
}
ind <- which.min(sapply(fit.VaHSdata,
function(x) x$stress))
fit.VaHSdata2 <- fit.VaHSdata[[ind]]
fit.VaHSdata2$stress ## lowest stress (random start)
[1] 0.1
fit.VaHSdata2

Call:
mds(delta = Wdelta, type = "ordinal", init = "random")

Model: Symmetric SMACOF 
Number of objects: 12 
Stress-1 value: 0.1 
Number of iterations: 97 
fit.VaHSdata1$stress ## stress (classical scaling start)
[1] 0.1
fit.VaHSdata3 <- mds(Wdelta, type = "interval")
fit.VaHSdata3

Call:
mds(delta = Wdelta, type = "interval")

Model: Symmetric SMACOF 
Number of objects: 12 
Stress-1 value: 0.16 
Number of iterations: 6 

plot(fit.VaHSdata3, plot.type = "Shepard",
main = "Shepard Diagram (Interval MDS)")

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

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

#Configurations

plot(fit.VaHSdata2, plot.type = "confplot", main= "confplot (Random Ordinal MDS)")

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

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

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

library("colorspace")
set.seed(123)
bootWen <- bootmds(fit.VaHSdata2, data = std_data,
method.dat = "euclidean", nrep = 100)
cols <- rainbow_hcl(17, l = 60)
plot(bootWen, col = cols)

colpal <- c(rainbow_hcl(4, c=100))
pal <-palette(colpal)
memb <- c(1,2,2,2,2,2,3,3,4,4,4,3)
plot(fit.VaHSdata2, main = "Configuration", label.conf = list(label=FALSE), col = memb)
legend("topright", legend = c("Enrollment", "Race", "Subgroup", "Achievement"), col=colpal, pch=20)
palette(pal)
colpal <- c(rainbow_hcl(4, c=100, l=30))
pal <- palette(colpal)
text(fit.VaHSdata2$conf[-7,], labels=rownames(fit.VaHSdata2$conf)[-7], col=memb[-7], pos=3, cex=0.8)
text(fit.VaHSdata2$conf[7.1], fit.VaHSdata2$conf[7,2], labels= rownames(fit.VaHSdata2$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: 12 
Stress-1 value: 0.1 
Number of iterations: 30 
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)

mdsbi <- biplotmds(fit.ocp1, ocpD)
plot(mdsbi)

library(MASS)
out_Car1=isoMDS(ocpD, k=1)
initial  value 35.208679 
final  value 27.355976 
converged
library(MASS)
out_Car2=isoMDS(ocpD, k=2)
initial  value 14.611676 
iter   5 value 10.316203
final  value 10.209001 
converged
library(MASS)
out_Car3=isoMDS(ocpD, k=3)
out_Car1
$points
                  [,1]
Enrollment       0.090
Asian_p          0.096
Black_p         -0.404
Hispanic_p      -0.211
White_p          0.650
Multirace_p      0.248
ESL_P           -0.203
SWD_p           -0.100
GCI2019          0.533
Chronic.Abs2019 -0.547
Reading2019      0.383
Disadvantaged_p -0.536

$stress
[1] 27
out_Car2
$points
                 [,1]   [,2]
Enrollment       0.09 -0.337
Asian_p          0.11 -0.378
Black_p         -0.34  0.318
Hispanic_p      -0.26 -0.328
White_p          0.51  0.457
Multirace_p      0.33 -0.072
ESL_P           -0.26 -0.319
SWD_p           -0.13  0.446
GCI2019          0.55  0.165
Chronic.Abs2019 -0.54 -0.059
Reading2019      0.45 -0.226
Disadvantaged_p -0.51  0.333

$stress
[1] 10
out_Car3
$points
                 [,1]   [,2]   [,3]
Enrollment       0.13 -0.438 -0.218
Asian_p          0.18 -0.477 -0.155
Black_p         -0.51  0.256 -0.428
Hispanic_p      -0.30 -0.442  0.155
White_p          0.53  0.518  0.446
Multirace_p      0.42 -0.059 -0.385
ESL_P           -0.29 -0.433  0.171
SWD_p           -0.23  0.590 -0.217
GCI2019          0.68  0.292 -0.048
Chronic.Abs2019 -0.57 -0.022  0.429
Reading2019      0.55 -0.221  0.123
Disadvantaged_p -0.58  0.437  0.125

$stress
[1] 3
LS0tDQp0aXRsZTogIk11bHRpZGltZW5zaW9uYWwgU2NhbGluZyAtIFZpcmdpbmlhIFB1YmxpYyBIaWdoIFNjaG9vbHMiDQphdXRob3I6IEpha2UgUmV5bm9sZHMNCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KYGBge3J9DQpsaWJyYXJ5KCJNUHN5Y2hvUiIpDQpsaWJyYXJ5KCJzbWFjb2YiKQ0KVmFIU2RhdGEgPSByZWFkLmNzdigiVmFIU2RhdGEuY3N2IikNCmBgYA0KDQpgYGB7cn0NCm9wdGlvbnMoZGlnaXRzPTIsIHNjaXBlbj05OTkpDQpkYXRhKGxpc3Q9IlZhSFNkYXRhIiwgcGFja2FnZT0iTVBzeWNob1IiKQ0KbXlkYXRhMjwtbWlzc1Jhbmdlcjo6bWlzc1JhbmdlcihkYXRhID0gVmFIU2RhdGEsIHZlcmJvc2U9MCkNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KHBzeWNoKQ0KZGVzY3JpYmUobXlkYXRhMikNCmBgYA0KDQoNCiNTdGFuZGFyZGl6ZWQgdGhlIHZhcmlhYmxlcyBzaW5jZSBub3QgYWxsIG9mIHRoZSB2YXJpYWJsZXMgd2VyZSB0aGUgc2FtZS4NCmBgYHtyfQ0Kc3RhbmRhcmRpemUgPSBmdW5jdGlvbih4KXsNCiAgcmV0dXJuICgoeC1tZWFuKHgsbmEucm09VFJVRSkpL3NkKHgsbmEucm09VFJVRSkpDQp9DQpgYGANCmBgYHtyfQ0Kc3RkX2RhdGEgPSBhcy5kYXRhLmZyYW1lKGFwcGx5KG15ZGF0YTIsMixzdGFuZGFyZGl6ZSkpDQpgYGANCg0KYGBge3J9DQpmb3IoaiBpbiAxOm5jb2woc3RkX2RhdGEpKXN0ZF9kYXRhWyxqXTwtcm91bmQoc3RkX2RhdGFbLGpdKQ0KTSA8LSB0aWR5cjo6Z2F0aGVyKGRhdGE9c3RkX2RhdGEsa2V5PSJJdGVtIiwgdmFsdWUgPSAiVmFsdWUiKSANCk0kSXRlbSA8LWZhY3Rvcih4PU0kSXRlbSwgbGV2ZWxzID0gbmFtZXMoc29ydCh0YXBwbHkoWD1NJFZhbHVlLCBJTkRFWD1NJEl0ZW0sIEZVTj1tZWFuKSkpKQ0KcmVxdWlyZShnZ3Bsb3QyKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KE0pICsgYWVzKHg9VmFsdWUsIGZpbGw9SXRlbSkrZ2VvbV9iYXIoKStmYWNldF93cmFwKH5JdGVtKQ0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KCJzbWFjb2YiKQ0KV2RlbHRhIDwtIGRpc3QodChzdGRfZGF0YSkpICMjIEV1Y2xpZGVhbiBkaXN0YW5jZXMNCmZpdC5WYUhTZGF0YTEgPC0gbWRzKFdkZWx0YSwgdHlwZSA9ICJvcmRpbmFsIikgIyMgTURTIGZpdA0KZml0LlZhSFNkYXRhMQ0KDQpgYGANCg0KYGBge3J9DQpwbG90KGZpdC5WYUhTZGF0YTEsIG1haW4gPSAiVmFIU2RhdGEiKQ0KYGBgDQojVGhlIHN0cmVzcyBpcyBoaWdoZXIgdXNpbmcgdGhlIHJhbmRvbXN0cmVzcyB0ZXN0LiANCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0KcnN2ZWMgPC0gcmFuZG9tc3RyZXNzKG4gPSBhdHRyKFdkZWx0YSwgIlNpemUiKSwgbmRpbSA9IDIsDQpucmVwID0gNTAwLCB0eXBlID0gIm9yZGluYWwiKQ0KbWVhbihyc3ZlYykNCmBgYA0KYGBge3J9DQpoaXN0KHg9cnN2ZWMsIG1haW4gPSAiSGlzdG9ncmFtIG9mIHJhbmRvbWx5IGdlbmVyYXRlZC9ubXVsdGlkaW1lbnNpb25hbCBzY2FsaW5nIHN0cmVzcyIpDQpgYGANCiNUaGUgbW9kZWwgYWJvdmUgaXMgbGVzcyB0aGFuIDAuMjEsIHdoaWNoIG1lYW5zIHRoYXQgaXQgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gDQpgYGB7cn0NCm1lYW4ocnN2ZWMpIC0gMipzZChyc3ZlYykNCmBgYA0KDQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCnBlcm1tZHMgPC0gcGVybXRlc3QoZml0LlZhSFNkYXRhMSwgZGF0YSA9IHN0ZF9kYXRhLA0KbWV0aG9kLmRhdCA9ICJldWNsaWRlYW4iLCBucmVwID0gNTAwLA0KdmVyYm9zZSA9IEZBTFNFKQ0KcGVybW1kcw0KYGBgDQoNCmBgYHtyfQ0KbiA8LSBhdHRyKFdkZWx0YSwgIlNpemUiKQ0Kc3ZlYyA8LSBOVUxMDQpmb3IgKGkgaW4gMToobi0xKSkgew0Kc3ZlY1tpXSA8LSBtZHMoV2RlbHRhLCBuZGltID0gaSwgdHlwZSA9ICJvcmRpbmFsIikkc3RyZXNzDQp9DQpgYGANCg0KYGBge3J9DQpwbG90KHg9MToobi0xKSwgeT1zdmVjLCB0eXBlPSJiIiwgbWFpbiA9ICJNRFMgU2NyZWUgUGxvdCIsIHBjaD0yMCwgeGxhYj0iTnVtYmVyIG9mIERpbWVuc2lvbnMiLCB5bGFiID0gIlN0cmVzcyIpDQpgYGANCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0KZml0LlZhSFNkYXRhIDwtIE5VTEwgIyMgMTAwIHJhbmRvbSBzdGFydHMNCmZvcihpIGluIDE6MTAwKSB7DQpmaXQuVmFIU2RhdGFbW2ldXSA8LSBtZHMoV2RlbHRhLCB0eXBlID0gIm9yZGluYWwiLA0KaW5pdCA9ICJyYW5kb20iKQ0KfQ0KaW5kIDwtIHdoaWNoLm1pbihzYXBwbHkoZml0LlZhSFNkYXRhLA0KZnVuY3Rpb24oeCkgeCRzdHJlc3MpKQ0KZml0LlZhSFNkYXRhMiA8LSBmaXQuVmFIU2RhdGFbW2luZF1dDQpmaXQuVmFIU2RhdGEyJHN0cmVzcyAjIyBsb3dlc3Qgc3RyZXNzIChyYW5kb20gc3RhcnQpDQoNCg0KYGBgDQpgYGB7cn0NCmZpdC5WYUhTZGF0YTINCmBgYA0KDQoNCmBgYHtyfQ0KZml0LlZhSFNkYXRhMSRzdHJlc3MgIyMgc3RyZXNzIChjbGFzc2ljYWwgc2NhbGluZyBzdGFydCkNCmBgYA0KYGBge3J9DQpmaXQuVmFIU2RhdGEzIDwtIG1kcyhXZGVsdGEsIHR5cGUgPSAiaW50ZXJ2YWwiKQ0KZml0LlZhSFNkYXRhMw0KYGBgDQoNCmBgYHtyfQ0KDQpwbG90KGZpdC5WYUhTZGF0YTMsIHBsb3QudHlwZSA9ICJTaGVwYXJkIiwNCm1haW4gPSAiU2hlcGFyZCBEaWFncmFtIChJbnRlcnZhbCBNRFMpIikNCmBgYA0KDQpgYGB7cn0NCnBsb3QoZml0LlZhSFNkYXRhMiwgcGxvdC50eXBlID0gIlNoZXBhcmQiLA0KbWFpbiA9ICJTaGVwYXJkIERpYWdyYW0gKE9yZ2luYWwgTURTKSIpDQoNCmBgYA0KDQpgYGB7cn0NCnBsb3QoZml0LlZhSFNkYXRhMiwgcGxvdC50eXBlID0gIlNoZXBhcmQiLA0KbWFpbiA9ICJTaGVwYXJkIERpYWdyYW0gKE9yZGluYWwgTURTKSIpDQoNCmBgYA0KDQojQ29uZmlndXJhdGlvbnMgDQoNCmBgYHtyfQ0KcGxvdChmaXQuVmFIU2RhdGEyLCBwbG90LnR5cGUgPSAiY29uZnBsb3QiLCBtYWluPSAiY29uZnBsb3QgKFJhbmRvbSBPcmRpbmFsIE1EUykiKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChmaXQuVmFIU2RhdGEyLCBwbG90LnR5cGUgPSAicmVzcGxvdCIsIG1haW49ICJyZXNwbG90IChSYW5kb20gT3JkaW5hbCBNRFMpIikNCmBgYA0KDQpgYGB7cn0NCnBsb3QoZml0LlZhSFNkYXRhMiwgcGxvdC50eXBlID0gInN0cmVzc3Bsb3QiLCBtYWluPSAic3RyZXNzcGxvdCAoUmFuZG9tIE9yZGluYWwgTURTKSIpDQpgYGANCg0KYGBge3J9DQpwbG90KGZpdC5WYUhTZGF0YTIsIHBsb3QudHlwZSA9ICJidWJibGVwbG90IiwgbWFpbj0gImJ1YmJsZXBsb3QoUmFuZG9tIE9yZGluYWwgTURTKSIpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KCJjb2xvcnNwYWNlIikNCnNldC5zZWVkKDEyMykNCmJvb3RXZW4gPC0gYm9vdG1kcyhmaXQuVmFIU2RhdGEyLCBkYXRhID0gc3RkX2RhdGEsDQptZXRob2QuZGF0ID0gImV1Y2xpZGVhbiIsIG5yZXAgPSAxMDApDQpjb2xzIDwtIHJhaW5ib3dfaGNsKDE3LCBsID0gNjApDQpwbG90KGJvb3RXZW4sIGNvbCA9IGNvbHMpDQpgYGANCg0KYGBge3J9DQpjb2xwYWwgPC0gYyhyYWluYm93X2hjbCg0LCBjPTEwMCkpDQpwYWwgPC1wYWxldHRlKGNvbHBhbCkNCm1lbWIgPC0gYygxLDIsMiwyLDIsMiwzLDMsNCw0LDQsMykNCnBsb3QoZml0LlZhSFNkYXRhMiwgbWFpbiA9ICJDb25maWd1cmF0aW9uIiwgbGFiZWwuY29uZiA9IGxpc3QobGFiZWw9RkFMU0UpLCBjb2wgPSBtZW1iKQ0KbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIkVucm9sbG1lbnQiLCAiUmFjZSIsICJTdWJncm91cCIsICJBY2hpZXZlbWVudCIpLCBjb2w9Y29scGFsLCBwY2g9MjApDQpwYWxldHRlKHBhbCkNCmNvbHBhbCA8LSBjKHJhaW5ib3dfaGNsKDQsIGM9MTAwLCBsPTMwKSkNCnBhbCA8LSBwYWxldHRlKGNvbHBhbCkNCnRleHQoZml0LlZhSFNkYXRhMiRjb25mWy03LF0sIGxhYmVscz1yb3duYW1lcyhmaXQuVmFIU2RhdGEyJGNvbmYpWy03XSwgY29sPW1lbWJbLTddLCBwb3M9MywgY2V4PTAuOCkNCnRleHQoZml0LlZhSFNkYXRhMiRjb25mWzcuMV0sIGZpdC5WYUhTZGF0YTIkY29uZls3LDJdLCBsYWJlbHM9IHJvd25hbWVzKGZpdC5WYUhTZGF0YTIkY29uZilbN10sIGNvbD1tZW1iWzddLCBwb3M9MSwgY2V4PTAuOCkNCmBgYA0KI1RoaXMgaXMgdGFraW5nIGl0IGEgc3RlcCBmdXJ0aGVyIHdpdGggQ29uZmlybWF0b3J5IE11bHRpZGltZW5zaW9uYWwgU2NhbGluZw0KDQoNCmBgYHtyfQ0KbGlicmFyeSgiTVBzeWNob1IiKQ0KbGlicmFyeSgic21hY29mIikNCmNvcm1hdHJpeDwtY29yKHN0ZF9kYXRhKQ0KY29ycnBsb3Q6OmNvcnJwbG90KGNvcnI9Y29ybWF0cml4LCBtZXRob2Q9ImVsbGlwc2UiLCBkaWFnID0gRkFMU0UsIG9yZGVyPSJoY2x1c3QiKQ0Kb2NwRCA8LSBzaW0yZGlzcyhjb3JtYXRyaXgpDQpgYGANCg0KYGBge3J9DQpmaXQub2NwMSA8LSBtZHMob2NwRCwgdHlwZSA9ICJvcmRpbmFsIikNCmZpdC5vY3AxDQpgYGANCmBgYHtyfQ0Kdl9jb2xvciA8LSB2aXJpZGlzOjp2aXJpZGlzKA0Kbj1sZW5ndGgoMTMpDQopDQpuYW1lcyh2X2NvbG9yKTwtc29ydCgxMykNCnY8LWMoImNvbmZwbG90IiwgInJlc3Bsb3QiLCAiU2hlcGFyZCIsICJzdHJlc3NwbG90IiwgImJ1YmJsZXBsb3QiLCAiaGlzdG9ncmFtIikNCmZvcihqIGluIHYpIHBsb3QoeD1maXQub2NwMSwgcGxvdC50eXBlPWosIG1haW49aikNCmBgYA0KDQpgYGB7cn0NCm1kc2JpIDwtIGJpcGxvdG1kcyhmaXQub2NwMSwgb2NwRCkNCnBsb3QobWRzYmkpDQpgYGANCmBgYHtyfQ0KbGlicmFyeShNQVNTKQ0Kb3V0X0NhcjE9aXNvTURTKG9jcEQsIGs9MSkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoTUFTUykNCm91dF9DYXIyPWlzb01EUyhvY3BELCBrPTIpDQpgYGANCmBgYHtyfQ0KbGlicmFyeShNQVNTKQ0Kb3V0X0NhcjM9aXNvTURTKG9jcEQsIGs9MykNCmBgYA0KYGBge3J9DQpvdXRfQ2FyMQ0Kb3V0X0NhcjINCm91dF9DYXIzDQpgYGANCg0KDQo=