Latent Profilanalyse (Lpa) forsøker å identifisere klynger av individer (dvs. latente profiler) basert på svar på en rekke kontinuerlige variabler (dvs.indikatorer). LPA antar at det er uobserverte latente profiler som genererer mønstre av svar på indikatorelementer.Her vil Jeg gå gjennom et raskt eksempel PÅ LPA for å identifisere grupper av mennesker basert på deres interesser / hobbyer. Dataene kommer fra Ungdomsundersøkelsen, tilgjengelig fritt på Kaggle.com.
Her er en sniktitt på hva vi går for:
Terminologi merk: Folk bruker begrepene klynger, profiler, klasser og grupper om hverandre, men det er små forskjeller. Jeg vil for det meste holde meg til profil for å referere til en gruppering av saker, i tråd MED lpa terminologi. Vi bør merke SEG AT LPA er en gren Av Gaussisk Endelig Blandingsmodellering, som inkluderer Latent Klasseanalyse (LCA). Forskjellen MELLOM lpa og LCA er konseptuell, ikke beregningsmessig: LPA bruker kontinuerlige indikatorer og LCA bruker binære indikatorer. LPA er en probabilistisk modell, som betyr at den modellerer sannsynligheten for at saken tilhører en profil. Dette er bedre enn en tilnærming Som K-means som bruker avstandsalgoritmer.
Med det til side, la oss laste inn dataene.
library(tidyverse)
survey <- read_csv("https://raw.githubusercontent.com/whipson/tidytuesday/master/young_people.csv") %>% select(History:Pets)
dataene er på 32 interesser / hobbyer. Hvert element er rangert 1 (ikke interessert) til 5 (veldig interessert).
beskrivelsen På Kaggle antyder at det kan være uforsiktig å svare(f. eks. Vi kan bruke uforsiktig pakken til å identifisere «streng svarer». La oss også se etter multivariate outliers med Mahalanobis Avstand(se mitt forrige innlegg På Mahalanobis for å identifisere outliers).
library(careless)library(psych)interests <- survey %>% mutate(string = longstring(.)) %>% mutate(md = outlier(., plot = FALSE))
vi vil cap streng svarer til maksimalt 10 og bruke En Mahalanobis D cutoff av alpha = .001.
cutoff <- (qchisq(p = 1 - .001, df = ncol(interests)))interests_clean <- interests %>% filter(string <= 10, md < cutoff) %>% select(-string, -md)
pakken mclust utfører ulike typer modellbasert clustering og dimensjonsreduksjon. I tillegg er det veldig intuitivt å bruke. Det krever fullstendige data( ingen mangler), så i dette eksemplet fjerner vi saker med NAs. Dette er ikke den foretrukne tilnærmingen; vi ville være bedre å imputing. Men for illustrative formål fungerer dette bra. Jeg skal også standardisere alle indikatorene, så når vi plotter profilene, er det tydeligere å se forskjellene mellom klynger. Kjører denne koden vil ta noen minutter.
library(mclust)interests_clustering <- interests_clean %>% na.omit() %>% mutate_all(list(scale))BIC <- mclustBIC(interests_clustering)
Vi begynner med å plotte Bayesianske Informasjonskriterier for alle modellene med profiler fra 1 til 9.
plot(BIC)
det er ikke umiddelbart klart hvilken modell som er best siden y-aksen er så stor og mange av modellene scorer tett sammen. sammendrag (BIC) viser de tre beste modellene basert PÅ 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
den høyeste BIC kommer FRA VVE, 3. Dette sier at det er 3 klynger med variabelt volum, variabel form, lik orientering og ellipsodial distribusjon(se Figur 2 fra dette papiret for en visuell). IMIDLERTID ER VEE, 3 ikke langt bak og kan faktisk være en mer teoretisk nyttig modell siden den begrenser formen på fordelingen til å være lik. Av denne grunn går VI med VEE, 3.
hvis vi vil se nærmere på denne modellen, lagrer vi den som et objekt og inspiserer det med sammendrag ().
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
utgangen beskriver de geometriske egenskapene til profilene og antall tilfeller klassifisert i hver av de tre klyngene.
BIC er en av de best egnede indeksene, men det anbefales alltid å se etter flere bevis på at løsningen vi har valgt er den riktige. Vi kan også sammenligne verdier Av Integrated Completed Likelikood (ICL) – kriteriet. Se dette papiret for flere detaljer. ICL er ikke mye forskjellig FRA BIC, bortsett fra at det legger til en straff på løsninger med større entropi eller klassifiseringsusikkerhet.
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
vi ser lignende resultater. ICL antyder at modellen VEE, 3 passer ganske bra. Til slutt vil Vi utføre Bootstrap Sannsynlighet Ratio Test (BLRT) som sammenligner modellpassform mellom k-1 og k cluster modeller. Med andre ord, det ser ut til å se om en økning i profiler øker passform. Basert på simuleringer av Nylund, Asparouhov, Og Muthé (2007) BIC OG BLRT er de beste indikatorene for hvor mange profiler det er. Denne koden vil ta lang tid å løpe, så hvis du bare følger med, foreslår jeg å hoppe over det med mindre du vil gå ut for en kaffepause.
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 foreslår også at en 3-profil løsning er ideell.
Visualisere LPA
Nå som vi er sikre på vårt valg av en 3-profil løsning, la oss plotte resultatene. Spesielt vil vi se hvordan profilene er forskjellige på indikatorene, det vil si elementene som utgjør profilene. Hvis løsningen er teoretisk meningsfylt, bør vi se forskjeller som gir mening.
Først vil vi trekke ut midler for hver profil (husk at vi valgte disse å være standardisert). Deretter bruker vi pivot_longer å krangle det i lang form. Merk at jeg trimmer verdier som overstiger + 1 SD, ellers går vi inn i plotting problemer.
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))
her er koden for plottet. Jeg omorganiserer indikatorene slik at lignende aktiviteter er tett sammen.
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")
Vi har mange indikatorer (mer enn typisk FOR LPA), men vi ser noen interessante forskjeller. Klart den røde gruppen er interessert i vitenskap og den blå gruppen viser større interesse for kunst og humaniora. Den grønne gruppen virker uinteressert i både vitenskap og kunst, men moderat interessert i andre ting.
Vi kan gjøre denne plottet mer informativ ved å plugge inn profilnavn og proporsjoner. Jeg skal også lagre denne plottet som et objekt slik at vi kan gjøre noe veldig kult med det!
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
det noe veldig kult som jeg vil gjøre er å lage et interaktivt plott. Hvorfor skulle jeg ønske å gjøre dette? Vel, et av problemene med den statiske plottet er at med så mange indikatorer er det vanskelig å lese verdiene for hver indikator. Et interaktivt plott lar leseren begrense seg til spesifikke indikatorer eller interesseprofiler. Vi bruker plotly til å gjøre vår statiske tomt til en interaktiv.
library(plotly)ggplotly(p, tooltip = c("Interest", "Mean")) %>% layout(legend = list(orientation = "h", y = 1.2))
Det er et raskt eksempel PÅ LPA. Samlet sett tror JEG LPA er flott verktøy for Utforskende Analyse, selv om jeg stiller spørsmål ved reproduserbarheten. Det som er viktig er at statistikeren vurderer både fit indekser og teori når de bestemmer seg for antall profiler.
Referanser& Ressurser
Bertoletti, M., Friel, N., & Rastelli, R. (2015). Velge antall klynger i en endelig blandingsmodell ved hjelp av et eksakt Integrert Fullført Sannsynlighetskriterium. https://arxiv.org/pdf/1411.4257.pdf.
Nylund, K. L., Asparouhov, T., & Muthé, B. O. (2007). Bestemme Antall Klasser I Latent Klasseanalyse Og Vekstblandingsmodellering: En Monte Carlo Simuleringsstudie. Strukturell Ligningsmodellering, 14, 535-569.
Scrucca, L., Fop, M., Murphy, T. B., & Raftery, A. E. (2016). mclust5: Clustering, Klassifisering Og Tetthetsestimering Ved Bruk Av Gaussiske Endelige Blandingsmodeller. R Journal, 8, 289-317.