Latent Profile Analysis (LPA) pyrkii tunnistamaan yksilöiden klustereita (eli piileviä profiileja) jatkuvien muuttujien sarjan (eli indikaattorien) vasteiden perusteella. LPA olettaa, että on olemassa havaitsemattomia piileviä profiileja, jotka tuottavat malleja vastauksia indikaattori kohteita.
tässä käyn läpi nopean esimerkin LPA: sta, jossa yksilöidään ihmisryhmiä heidän harrastustensa / harrastustensa perusteella. Tiedot ovat peräisin Nuortenkyselystä, joka on vapaasti saatavilla Kaggle.com.
tässä on kurkistus siihen, mihin olemme menossa:
terminologia huomautus: ihmiset käyttävät termejä klusterit, profiilit, luokat ja ryhmät keskenään, mutta niissä on hienoisia eroja. Pysyn enimmäkseen profiilissa viitatakseni juttujen ryhmittelyyn LPA: n terminologian mukaisesti. Meidän pitäisi huomata, että LPA on haara Gaussin rajallinen seos mallinnus, joka sisältää latentti luokan analyysi (LCA). LPA: n ja LCA: n ero on käsitteellinen, ei laskennallinen: LPA käyttää jatkuvia indikaattoreita ja LCA käyttää binäärisiä indikaattoreita. LPA on probabilistinen malli, eli se mallintaa todennäköisyyden, että asia kuuluu profiiliin. Tämä on parempi lähestymistapa, kuten K-means, joka käyttää etäisyys algoritmeja.
kun tämä sikseen, ladataanpa tiedot.
library(tidyverse)
tiedot koskevat 32 harrastusta / harrastusta. Jokainen kohde on sijalla 1 (ei kiinnostunut) kohteeseen 5 (erittäin kiinnostunut).
kuvaus Kaggle-sivustolla viittaa siihen, että vastaaminen voi olla huolimatonta (esimerkiksi osallistujat, jotka valitsivat saman arvon uudestaan ja uudestaan). Voimme käyttää huolimaton paketti tunnistaa ”merkkijono vastaa”. Etsitään myös monimuuttujia Mahalanobis-etäisyydellä (katso edellinen postaukseni Mahalanobis-sivustolta outlaiersin tunnistamiseksi).
library(careless)library(psych)interests <- survey %>% mutate(string = longstring(.)) %>% mutate(md = outlier(., plot = FALSE))
me suljemme merkkijonon vastaten maksimissaan 10: een ja käytämme Mahalanobis D-katkaisua alpha = .001.
cutoff <- (qchisq(p = 1 - .001, df = ncol(interests)))interests_clean <- interests %>% filter(string <= 10, md < cutoff) %>% select(-string, -md)
paketti mclust suorittaa erilaisia mallipohjaisia ryhmittelyjä ja mittojen pienentämistä. Plus, se on todella intuitiivinen käyttää. Se vaatii täydelliset tiedot (ei puutu), joten tässä esimerkissä poistamme nas-tapaukset. Tämä ei ole ensisijainen lähestymistapa; meidän olisi parempi imputing. Mutta havainnollistaakseni, tämä toimii hyvin. Aion myös standardoida kaikki indikaattorit, joten kun suunnittelemme profiileja, on selkeämpää nähdä erot klustereiden välillä. Tämän koodin suorittaminen vie muutaman minuutin.
library(mclust)interests_clustering <- interests_clean %>% na.omit() %>% mutate_all(list(scale))BIC <- mclustBIC(interests_clustering)
aloitamme piirtämällä Bayesilaiset Informaatiokriteerit kaikille malleille, joiden profiilit vaihtelevat 1: stä 9: ään.
plot(BIC)
ei ole heti selvää, mikä malli on paras, koska y-akseli on niin suuri ja monet mallit pisteytyvät lähekkäin. Yhteenveto(BIC) näyttää BIC: hen perustuvat kolme parasta mallia.
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
korkein BIC-arvo tulee VVE: stä, 3. Tämä sanoo, että on olemassa 3 klustereita, joilla on muuttuva määrä, muuttuva muoto, yhtäläinen suunta, ja ellipsodial distribution (katso kuva 2 tämän paperin visuaalinen). VEE, 3 ei kuitenkaan ole kaukana perässä ja voi itse asiassa olla teoreettisesti käyttökelpoisempi malli, koska se rajoittaa jakauman muodon samansuuruiseksi. Tästä syystä mukaan otetaan VEE, 3.
Jos haluamme tarkastella tätä mallia lähemmin, tallennamme sen objektina ja tarkastamme sen yhteenvedolla().
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
tuotos kuvaa profiilien geometrisia ominaisuuksia ja kuhunkin kolmeen klusteriin luokiteltujen tapausten määrää.
BIC on yksi parhaista fit-indekseistä, mutta on aina suositeltavaa etsiä lisää todisteita siitä, että valitsemamme ratkaisu on oikea. Voimme myös vertailla Integrated Completed Likelikood (ICL) – kriteerin arvoja. Katso tästä lehdestä lisätietoja. ICL ei juuri eroa BIC: stä, paitsi että se lisää rangaistuksen ratkaisuille, joilla on suurempi entropia tai luokitteluepävarmuus.
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
samansuuntaisia tuloksia nähdään. ICL: n mukaan malli VEE, 3 sopii varsin hyvin. Lopuksi suoritamme Bootstrap-Todennäköisyystestin (BLRT), jossa verrataan mallin sopivuutta k-1-ja k-klusterimallien välillä. Toisin sanoen, näyttää siltä, jos kasvu profiileja kasvaa sovi. Nylundin, Asparouhovin ja Muthénin (2007) simulaatioiden perusteella BIC ja BLRT ovat parhaat indikaattorit profiilien lukumäärälle. Tämä rivi koodi kestää kauan ajaa, joten jos olet vain seuraavat pitkin ehdotan ohita se, ellet halua astua ulos kahvitauko.
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 viittaa myös siihen, että 3-profiilinen ratkaisu olisi ihanteellinen.
visualisoidaan LPA
nyt, kun olemme varmoja 3-profiilisen ratkaisun valinnasta, piirretään tulokset. Erityisesti haluamme nähdä, miten profiilit eroavat indikaattoreista eli profiilien muodostamista kohteista. Jos ratkaisu on teoreettisesti mielekäs, pitäisi nähdä eroja, joissa on järkeä.
ensin poimimme keinot jokaiselle profiilille (muista, että valitsimme nämä standardoitaviksi). Sitten, käytämme pivot_longer vääntää sen pitkään muotoon. Huomaa, että trimmaan arvoja yli + 1 SD, muuten törmäämme juonitteluun.
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))
tässä on tontin koodi. Järjestän mittarit uudelleen niin, että vastaavat toiminnot ovat lähellä toisiaan.
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")
meillä on paljon indikaattoreita (enemmän kuin tyypillistä LPA: lle), mutta näemme joitakin mielenkiintoisia eroja. Punainen ryhmä on selvästi kiinnostunut tieteestä ja sininen ryhmä osoittaa suurempaa kiinnostusta taiteisiin ja humanistisiin tieteisiin. Vihreät eivät tunnu olevan kiinnostuneita tieteestä ja taiteesta, mutta kohtalaisen kiinnostuneita muista asioista.
voimme tehdä tästä juonesta informatiivisemman liittämällä profiilien nimet ja mittasuhteet. Aion myös tallentaa tämän juonen objektina, jotta voimme tehdä sillä jotain todella siistiä!
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
something really cool that I want to do on vuorovaikutteinen juoni. Miksi haluaisin tehdä tämän? No, yksi staattisen tontin ongelmista on, että niin monilla indikaattoreilla on vaikea lukea kunkin indikaattorin arvoja. Interaktiivisen juonen avulla lukija voi rajautua tiettyihin indikaattoreihin tai profiileihin, joita kiinnostaa. Käytämme plotlya muuttaaksemme staattisen juonemme interaktiiviseksi.
library(plotly)ggplotly(p, tooltip = c("Interest", "Mean")) %>% layout(legend = list(orientation = "h", y = 1.2))
on nopea esimerkki LPA: sta. Kaiken kaikkiaan LPA on mielestäni erinomainen väline alustavaan analyysiin, vaikka kyseenalaistankin sen toistettavuuden. Tärkeää on, että tilastotieteilijä ottaa huomioon sekä sopivuusindeksit että teorian päättäessään profiilien lukumäärästä.
References & Resources
Bertoletti, M., Friel, N., & Rastelli, R. (2015). Valitaan klusterien lukumäärä äärellisessä seosmallissa käyttäen tarkkaa integroitua täytettyä Todennäköisyyskriteeriä. https://arxiv.org/pdf/1411.4257.pdf.
Nylund, K. L., Asparouhov, T., & Muthén, B. O. (2007). Päättäminen luokkien määrä piilevä luokka analyysi ja kasvu seos mallinnus: Monte Carlo simulointi tutkimus. Structural Equation Modeling, 14, 535-569.
Scrucca, L., Fop, M., Murphy, T. B., & Raftery, A. E. (2016). mclust5: ryhmittely, luokittelu ja tiheyden estimointi käyttäen Gaussin äärellisiä Seosmalleja. R-Lehti, 8, 289-317.