busca

Análise de perfil latente (LPA) tenta identificar grupos de indivíduos (ou seja, perfis latentes) com base em respostas a uma série de variáveis contínuas (ou seja, indicadores). O LPA assume que existem perfis latentes não observáveis que geram padrões de respostas em itens indicadores.

aqui, vou passar por um exemplo rápido de LPA para identificar grupos de pessoas com base em seus interesses/hobbies. Os dados provêm do inquérito aos jovens, disponível gratuitamente em Kaggle.com.

aqui está uma espreitadela ao que estamos indo para:

Nota terminológica: as pessoas usam os Termos clusters, perfis, classes e grupos alternadamente, mas há diferenças sutis. Vou manter o perfil para me referir a um grupo de casos, de acordo com a terminologia da LPA. Devemos notar que LPA é um ramo da modelagem de mistura finita Gaussiana, que inclui análise de classe latente (LCA). A diferença entre LPA e LCA é conceitual, não computacional: LPA usa indicadores contínuos e LCA usa Indicadores Binários. LPA é um modelo probabilístico, o que significa que ele modela a probabilidade de caso pertencente a um perfil. Isto é superior a uma abordagem como K-significa que usa algoritmos de distância.com isso de lado, vamos carregar os dados.

library(tidyverse)
survey <- read_csv("https://raw.githubusercontent.com/whipson/tidytuesday/master/young_people.csv") %>% select(History:Pets)

Os dados em 32 interesses/hobbies. Cada item está classificado de 1 (Não interessado) a 5 (Muito interessado).

a descrição do Grupo sugere que pode haver uma resposta descuidada (por exemplo, participantes que selecionaram o mesmo valor vezes sem conta). Podemos usar o pacote descuidado para identificar “string responsing”. Vamos também procurar os valores anómalos multivariados com a distância de Mahalanobis (ver o meu post anterior em Mahalanobis para identificar anómalos).

library(careless)library(psych)interests <- survey %>% mutate(string = longstring(.)) %>% mutate(md = outlier(., plot = FALSE))

nós vamos cap string respondendo a um máximo de 10 e usar um corte de Mahalanobis D de alfa = .001.

o pacote mclust realiza vários tipos de agrupamento baseado em modelos e redução de dimensões. Além disso, é muito intuitivo de usar. Requer dados completos (sem falta), por isso, por exemplo, Vamos remover casos com NAs. Esta não é a abordagem preferida, seria melhor se fosse imputável. Mas para fins ilustrativos, isto funciona bem. Eu também vou padronizar todos os indicadores para que quando traçarmos os perfis fique mais claro para ver as diferenças entre clusters. A execução deste código vai demorar alguns minutos.

library(mclust)interests_clustering <- interests_clean %>% na.omit() %>% mutate_all(list(scale))BIC <- mclustBIC(interests_clustering)

we’ll start by plotting Bayesian Information Criteria for all the models with profiles ranging from 1 to 9.

plot(BIC)

não É imediatamente claro qual modelo é o melhor desde o eixo y é tão grande e muitos dos modelos de pontuação juntos. o resumo (BIC) mostra os três melhores modelos baseados no BIC.

summary(BIC)
## Best BIC values:## VVE,3 VEE,3 EVE,3## BIC -75042.7 -75165.1484 -75179.165## BIC diff 0.0 -122.4442 -136.461

o BIC mais alto vem de VVE, 3. Isto diz que existem 3 aglomerados com volume variável, forma variável, orientação igual, e distribuição elipsoidal (Veja Figura 2 deste artigo para um visual). No entanto, VEE, 3 não está muito atrás e na verdade pode ser um modelo mais teoricamente útil, uma vez que restringe a forma da distribuição a ser igual. Por esta razão, vamos com a VEE, 3.

Se queremos olhar para este modelo mais de perto, nós o guardamos como um objeto e o inspecionamos com resumo().

mod1 <- Mclust(interests_clustering, modelNames = "VEE", G = 3, x = BIC)summary(mod1)
## ---------------------------------------------------- ## Gaussian finite mixture model fitted by EM algorithm ## ---------------------------------------------------- ## ## Mclust VEE (ellipsoidal, equal shape and orientation) model with 3 components: ## ## log-likelihood n df BIC ICL## -35455.83 874 628 -75165.15 -75216.14## ## Clustering table:## 1 2 3 ## 137 527 210

A saída descreve as características geométricas dos perfis e o número de casos classificados em cada um dos três clusters.

BIC é um dos melhores índices de ajuste, mas é sempre recomendado procurar mais evidências de que a solução que escolhemos é a correta. Também podemos comparar valores do critério integrado Likelikood (ICL). Veja este artigo para mais detalhes. ICL não é muito diferente do BIC, exceto que adiciona uma penalidade em soluções com maior entropia ou incerteza de classificação.

ICL <- mclustICL(interests_clustering)plot(ICL)

summary(ICL)
## Best ICL values:## VVE,3 VEE,3 EVE,3## ICL -75134.69 -75216.13551 -75272.891## ICL diff 0.00 -81.44795 -138.203

Nós vemos resultados semelhantes. A LCI sugere que o modelo VEE, 3 Se encaixa muito bem. Finalmente, vamos realizar o teste da relação de probabilidade de Bootstrap (BLRT) que compara o ajuste do modelo entre os modelos K-1 e k cluster. Em outras palavras, ele olha para ver se um aumento nos perfis aumenta o ajuste. Com base em simulações de Nylund, Asparouhov, e Muthén (2007) BIC e BLRT são os melhores indicadores para quantos perfis existem. Esta linha de código vai levar muito tempo para correr, então se você está apenas seguindo junto eu sugiro saltando a menos que você quer sair para uma pausa para Café.

mclustBootstrapLRT(interests_clustering, modelName = "VEE")
## Warning in mclustBootstrapLRT(interests_clustering, modelName = "VEE"): some## model(s) could not be fitted!
## ------------------------------------------------------------- ## Bootstrap sequential LRT for the number of mixture components ## ------------------------------------------------------------- ## Model = VEE ## Replications = 999 ## LRTS bootstrap p-value## 1 vs 2 197.0384 0.001## 2 vs 3 684.8743 0.001## 3 vs 4 -124.1935 1.000

BLRT também sugere que um 3-perfil é a solução ideal.

Visualizando LPA

Agora que estamos confiantes em nossa escolha de uma solução de 3 perfis, vamos traçar os resultados. Especificamente, queremos ver como os perfis diferem nos indicadores, ou seja, os itens que compõem os perfis. Se a solução é teoricamente significativa, devemos ver diferenças que façam sentido.

Primeiro, vamos extrair os meios para cada perfil (lembre-se, nós escolhemos estes para ser padronizado). Então, nós usamos pivot_longer para enrolá-lo em forma longa. Repare que estou a reduzir valores superiores a +1 SD, caso contrário, deparamo-nos com problemas de conspiração.

means <- data.frame(mod1$parameters$mean) %>% rownames_to_column() %>% rename(Interest = rowname) %>% pivot_longer(cols = c(X1, X2, X3), names_to = "Profile", values_to = "Mean") %>% mutate(Mean = round(Mean, 2), Mean = ifelse(Mean > 1, 1, Mean))

Aqui está o código da parcela. Estou a reordenar os indicadores para que actividades semelhantes estejam próximas.

means %>% ggplot(aes(Interest, Mean, group = Profile, color = Profile)) + geom_point(size = 2.25) + geom_line(size = 1.25) + scale_x_discrete(limits = c("Active sport", "Adrenaline sports", "Passive sport", "Countryside, outdoors", "Gardening", "Cars", "Art exhibitions", "Dancing", "Musical instruments", "Theatre", "Writing", "Reading", "Geography", "History", "Law", "Politics", "Psychology", "Religion", "Foreign languages", "Biology", "Chemistry", "Mathematics", "Medicine", "Physics", "Science and technology", "Internet", "PC", "Celebrities", "Economy Management", "Fun with friends", "Shopping", "Pets")) + labs(x = NULL, y = "Standardized mean interest") + theme_bw(base_size = 14) + theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "top")

temos um monte de indicadores (mais do que típico para LPA), mas vemos algumas diferenças interessantes. Claramente o grupo vermelho está interessado em Ciência e o grupo azul mostra maior interesse em artes e Humanidades. O grupo dos verdes no parlamento europeu parece desinteressado tanto pela ciência como pela arte, mas moderadamente interessado noutras coisas.

podemos tornar este gráfico mais informativo, ligando nomes de perfis e proporções. Eu também vou salvar este enredo como um objeto para que possamos fazer algo realmente legal com ele!

p <- means %>% mutate(Profile = recode(Profile, X1 = "Science: 16%", X2 = "Disinterest: 60%", X3 = "Arts & Humanities: 24%")) %>% ggplot(aes(Interest, Mean, group = Profile, color = Profile)) + geom_point(size = 2.25) + geom_line(size = 1.25) + scale_x_discrete(limits = c("Active sport", "Adrenaline sports", "Passive sport", "Countryside, outdoors", "Gardening", "Cars", "Art exhibitions", "Dancing", "Musical instruments", "Theatre", "Writing", "Reading", "Geography", "History", "Law", "Politics", "Psychology", "Religion", "Foreign languages", "Biology", "Chemistry", "Mathematics", "Medicine", "Physics", "Science and technology", "Internet", "PC", "Celebrities", "Economy Management", "Fun with friends", "Shopping", "Pets")) + labs(x = NULL, y = "Standardized mean interest") + theme_bw(base_size = 14) + theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "top")p

A algo muito legal que eu quero fazer é fazer uma interativo enredo. Porque haveria de querer fazer isto? Bem, um dos problemas com o enredo estático é que com tantos indicadores é difícil ler os valores para cada indicador. Um gráfico interativo permite ao leitor estreitar sobre indicadores específicos ou perfis de interesse. Vamos usar a plotly para transformar o nosso plano estático num interactivo.

library(plotly)ggplotly(p, tooltip = c("Interest", "Mean")) %>% layout(legend = list(orientation = "h", y = 1.2))

há um exemplo rápido de LPA. Em termos gerais, penso que o LPA é um excelente instrumento de análise exploratória, embora questione a sua reprodutibilidade. O importante é que o estatístico considera índices de ajuste e teoria ao decidir sobre o número de perfis.

Referências & Recursos

Bertoletti, M., Friel, N., & Rastelli, R. (2015). Escolhendo o número de clusters em um modelo de mistura finita usando um critério de probabilidade completado integrado exato. https://arxiv.org/pdf/1411.4257.pdf.

Nylund, K. L., Asparouhov, T., & Muthén, B. O. (2007). Deciding on the Number of Classes in Latent Class Analysis and Growth Mixture Modeling: A Monte Carlo Simulation Study. Structural Equation Modeling, 14, 535-569.

Scruca, L., Fop, M., Murphy, T. B., Raftery, A. E. (2016). mclust5: Clustering, Classification and Density Estimation Using Gaussian Finite Mixture Models. The R Journal, 8, 289-317.

Deixe uma resposta

O seu endereço de email não será publicado.