Search

analiza profilului Latent (LPA) încearcă să identifice grupuri de indivizi (adică profiluri latente) pe baza răspunsurilor la o serie de variabile continue (adică indicatori). APL presupune că există profiluri latente neobservate care generează modele de răspunsuri la elementele indicatoare.

aici, voi trece printr-un exemplu rapid de APL pentru a identifica grupuri de oameni în funcție de interesele/hobby-urile lor. Datele provin din sondajul tinerilor, disponibil gratuit pe Kaggle.com.

iată o scurtă privire la ceea ce mergem:

terminologie notă: oamenii folosesc termenii clustere, profiluri, clase și grupuri în mod interschimbabil, dar există diferențe subtile. Voi lipi cea mai mare parte la profil pentru a se referi la o grupare de cazuri, în conformitate cu terminologia APL. Trebuie remarcat faptul că LPA este o ramură a modelării amestecului finit Gaussian, care include analiza clasei latente (LCA). Diferența dintre APL și LCA este conceptuală, nu computațională: APL utilizează indicatori continue și LCA utilizează indicatori binari. APL este un model probabilistic, ceea ce înseamnă că modelează probabilitatea de caz aparținând unui profil. Acest lucru este superior unei abordări precum K-înseamnă că folosește algoritmi de distanță.

cu asta deoparte, să încărcăm datele.

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

datele sunt pe 32 de interese / hobby-uri. Fiecare element este clasat pe locul 1 (nu este interesat) la 5 (foarte interesat).

descrierea de pe Kaggle sugerează că poate exista un răspuns neglijent (de exemplu, participanți care au selectat aceeași valoare de mai multe ori). Putem folosi pachetul neglijent pentru a identifica „răspunsul șirului”. Să căutăm, de asemenea, valori aberante multivariate cu distanța Mahalanobis (vezi postarea mea anterioară despre Mahalanobis pentru identificarea valorilor aberante).

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

vom cap șir răspunde la un maxim de 10 și de a folosi un Mahalanobis d cutoff de alpha = .001.

cutoff <- (qchisq(p = 1 - .001, df = ncol(interests)))interests_clean <- interests %>% filter(string <= 10, md < cutoff) %>% select(-string, -md)

pachetul mclust efectuează diferite tipuri de clustering bazate pe model și reducerea dimensiunii. În plus, este foarte intuitiv de utilizat. Este nevoie de date complete (fără lipsă), deci pentru acest exemplu vom elimina cazurile cu NAs. Aceasta nu este abordarea preferată; ar fi mai bine să imputăm. Dar, în scopuri ilustrative, acest lucru funcționează bine. De asemenea, voi standardiza toți indicatorii, astfel încât atunci când trasăm profilurile, este mai clar să vedem diferențele dintre clustere. Rularea acestui cod va dura câteva minute.

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

vom începe prin trasarea criteriilor de informații Bayesiene pentru toate modelele cu profiluri cuprinse între 1 și 9.

plot(BIC)

nu este clar imediat ce model este cel mai bun, deoarece axa y este atât de mare și multe dintre modele punctează aproape. rezumat (BIC) prezintă primele trei modele bazate pe 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

cel mai mare BIC vine de la VVE, 3. Aceasta spune că există 3 clustere cu volum variabil, formă variabilă, orientare egală și distribuție elipsodială (vezi Figura 2 din această lucrare pentru o imagine vizuală). Cu toate acestea, VEE, 3 nu este cu mult în urmă și de fapt poate fi un model mai Teoretic util, deoarece constrânge forma distribuției să fie egală. Din acest motiv, vom merge cu VEE, 3.

dacă vrem să privim mai atent acest model, îl salvăm ca obiect și îl inspectăm cu rezumat().

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

rezultatul descrie caracteristicile geometrice ale profilurilor și numărul de cazuri clasificate în fiecare dintre cele trei clustere.

BIC este unul dintre cei mai buni indici de potrivire, dar este întotdeauna recomandat să căutați mai multe dovezi că soluția pe care am ales-o este cea corectă. De asemenea, putem compara valorile criteriului integrat Likelikood finalizat (ICL). Consultați această lucrare pentru mai multe detalii. ICL nu este mult diferit de BIC, cu excepția faptului că adaugă o penalizare pentru soluțiile cu entropie mai mare sau incertitudine de clasificare.

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

vedem rezultate similare. ICL sugerează că modelul VEE, 3 se potrivește destul de bine. În cele din urmă, vom efectua testul raportului de probabilitate Bootstrap (BLRT) care compară potrivirea modelului între modelele K-1 și K cluster. Cu alte cuvinte, se pare pentru a vedea dacă o creștere a profilurilor crește fit. Bazat pe simulări de Nylund, Asparouhov, și Muth (2007) BIC și BLRT sunt cei mai buni indicatori pentru cât de multe profiluri există. Această linie de cod va dura mult timp pentru a rula, așa că, dacă Doar urmați, vă sugerez să o săriți, cu excepția cazului în care doriți să ieșiți pentru o pauză de cafea.

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 sugerează, de asemenea, că o soluție cu 3 profiluri este ideală.

vizualizarea APL

acum, că suntem încrezători în alegerea noastră de o soluție de 3-profil, să complot rezultatele. Mai exact, vrem să vedem cum diferă profilurile de indicatori, adică elementele care alcătuiau profilurile. Dacă soluția este teoretic semnificativă, ar trebui să vedem diferențe care au sens.

În primul rând, vom extrage mijloacele pentru fiecare profil (amintiți-vă, am ales ca acestea să fie standardizate). Apoi, vom folosi pivot_longer să se certa în formă lungă. Rețineți că am tunderea valori care depășesc +1 SD, altfel vom rula în probleme de complot.

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))

Iată codul pentru complot. Reordonez indicatorii, astfel încât activitățile similare să fie apropiate.

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

avem o mulțime de indicatori (mai mult decât tipic pentru APL), dar vedem unele diferențe interesante. În mod clar, grupul roșu este interesat de știință, iar grupul albastru arată un interes mai mare pentru Arte și științe Umaniste. Grupul verde pare dezinteresat atât de știință, cât și de artă, dar moderat interesat de alte lucruri.

putem face acest complot mai informativ prin conectarea numelor și proporțiilor profilului. De asemenea, voi salva acest complot ca obiect, astfel încât să putem face ceva foarte cool cu el!

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

ceva foarte cool pe care vreau să fac este să fac un complot interactiv. De ce aș vrea să fac asta? Ei bine, una dintre problemele cu complotul static este că, cu atât de mulți indicatori, este greu să citiți valorile pentru fiecare indicator. Un complot interactiv permite cititorului restrânge pe indicatori specifici sau profiluri de interes. Vom folosi plotly pentru a transforma complotul nostru static într-unul interactiv.

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

există un exemplu rapid de APL. În general, cred că APL este un instrument excelent pentru analiza exploratorie, deși pun la îndoială reproductibilitatea acesteia. Ceea ce este important este că statisticianul ia în considerare atât indicii potriviți, cât și teoria atunci când decide numărul de profiluri.

referințe& resurse

Bertoletti, M., Friel, N.,& Rastelli, R. (2015). Alegerea numărului de clustere într-un model de amestec finit folosind un criteriu de probabilitate completat integrat exact. https://arxiv.org/pdf/1411.4257.pdf.

Nylund, K. L., Asparouhov, T.,& Muth, B. O. (2007). Decizia cu privire la numărul de clase în analiza clasei latente și modelarea amestecului de creștere: un studiu de simulare Monte Carlo. Modelarea Ecuației Structurale, 14, 535-569.

Scrucca, L., Fop, M., Murphy, T. B.,& Raftery, A. E. (2016). mclust5: Clustering, clasificare și estimarea densității folosind modele de amestec finit Gaussian. Jurnalul R, 8, 289-317.

Lasă un răspuns

Adresa ta de email nu va fi publicată.