MDS non-metric MDS Bootstrap

Introdução

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.


Tipos de algoritmos Escalonamento multidimensional

Existem diferentes tipos de algoritmos Escalonamento multidimensional, incluindo:

Escalonamento multidimensional clássico

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.

Escalonamento multidimensional não métrico

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.

Dados

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),"/")

Escalonamento multidimensional clássico

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)

Escalonamento multidimensional não métrico

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.

Escalonamento multidimensional com bootstrap no R

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/