title: “Escalonamento multidimensional no R” author: [“steven-ross”] categories: [“Multivariada”, “MDS”] tags: [“Multivariada”, “MDS”] —
MDS
non-metric MDS
Bootstrap
Se você usar o código ou as informações deste guia em um trabalho publicado, solicito que cite-o como uma fonte nas referências bibliográficas.
DUTT-ROSS,Steven Escalonamento multidimensional no R. Rio de Janeiro. 2020. mimeo. Disponível em: https://blog.metodosquantitativos.com/MDS/
Você não precisa usar o R… pode usar o Python também.
Existem diferentes tipos de algoritmos Escalonamento multidimensional, incluindo:
Preserva a métrica de distância original entre pontos da melhor maneira possível. Essas são as distâncias ajustadas no mapa MDS e as distâncias originais estão na mesma métrica. O MDS clássico pertence à chamada categoria de escalonamento multidimensional métrico. Também é conhecido como análise de coordenadas principais. É adequado para dados quantitativos.
Também é conhecido como Escalonamento multidimensional ordinal. Aqui, não é a métrica de um valor de distância que é importante ou significativa, mas seu valor em relação às distâncias entre outros pares de objetos.
O MDS ordinal constrói distâncias ajustadas que estão na mesma ordem de classificação que a distância original. Por exemplo, se a distância dos objetos separados 1 e 5 estiver em quinto lugar nos dados de distância originais, eles também deverão estar em quinto lugar na configuração do MDS ordinal.
É adequado para dados qualitativos ordinais.
Analisamos o banco de dados íris do Fisher (que foi usado para ilustrar vários métodos de classificação). Os dados podem ser obtidos diretamente do R. Primeiro, redimensionamos as variáveis dividindo pelos seus desvios padrão.
data(iris)
variris <- apply(iris[,-5],2,var)
iris.adjusted <- sweep(iris[,-5],2,sqrt(variris),"/")
no
Aqui, vamos utilizar a função cmdscale() para fazer o escalonamento multidimensional clássico. Solicitamos ao R uma solução bidimensional, minimizando a função de perda “STRAIN”:
iris.scal <- cmdscale(dist(iris.adjusted),k=2,eig=T)
MDS<-data.frame(iris.scal[["points"]])
clust <- kmeans(MDS, 3)$cluster %>%
as.factor()
MDS <- MDS %>%
mutate(groups = clust)
Vamos fazer dois gráficos dos resultados:
par(bg="#e0feff")
library(MASS)
eqscplot(iris.scal$points,type="n")
text(iris.scal$point,labels = iris[row.names(iris),5],cex=.8)
ggscatter(MDS, x = "X1", y = "X2",
label = rownames(iris),
size = 1,
color = "groups",
palette = "jco",
ellipse = TRUE,
ellipse.type = "convex",
repel = TRUE)
no
Somos forçados a excluir a linha 102, pois o diz que está muito próximo da linha 143 (distância quase zero). Vamos ver os resultados.
library(MASS)
iris.iso <- isoMDS(dist(iris.adjusted[-102,]))
initial value 4.822105
iter 5 value 4.183883
iter 5 value 4.182693
iter 5 value 4.182693
final value 4.182693
converged
MDS_nao_metrico<-data.frame(iris.iso[["points"]])
clust <- kmeans(MDS_nao_metrico, 3)$cluster %>%
as.factor()
MDS_nao_metrico <- MDS_nao_metrico %>%
mutate(groups = clust)
ggscatter(MDS_nao_metrico, x = "X1", y = "X2",
size = 1,
color = "groups",
palette = "jco",
ellipse = TRUE,
ellipse.type = "convex",
repel = TRUE)
Vamos calcular uma medida de ajuste, o valor mínimo do stress.
iris.iso$stress
[1] 4.182693
o que mostra um bom ajuste do modelo aos dados.
A seguir, veremos o gráfico screenplot do “stress”: Vamos executar o seguinte código (copie e cole no R) para verificar o estresse até a dimensão k.
scree.plot = function(d, k) {
stresses=isoMDS(d, k=k)$stress
for(i in rev(seq(k-1)))
stresses=append(stresses,isoMDS(d, k=i)$stress)
plot(seq(k),rev(stresses), type="b", xaxp=c(1,k, k-1), ylab="Stress", xlab="Number of dimensions")
}
scree.plot(dist(iris.adjusted[-102,]), k=6)
initial value 0.000000
final value 0.000000
converged
initial value 0.000000
final value 0.000000
converged
initial value 0.000000
final value 0.000000
converged
initial value 0.758598
iter 5 value 0.641253
final value 0.636005
converged
initial value 4.822105
iter 5 value 4.183883
iter 5 value 4.182693
iter 5 value 4.182693
final value 4.182693
converged
initial value 22.498863
iter 5 value 18.308776
iter 5 value 18.304023
iter 5 value 18.304023
final value 18.304023
converged
O gráfico scree plot mostra um cotovelo com duas dimensões.
library(smacof)
## Euclidean distances
fit <- mds(dist(iris.adjusted[-102,]))
## 2D interval MDS
set.seed(12345)
resboot <- bootmds(fit, iris.adjusted[-102,], method.dat = "euclidean", nrep = 50)
resboot
plot(resboot)
Para saber sobre outras funções no R e no Python, você pode acessar o meu blog https://blog.metodosquantitativos.com/ ou o meu site pessoal https://steven.metodosquantitativos.com/