A látens Profilelemzés (LPA) megpróbálja azonosítani az egyének klasztereit (azaz látens profilokat) a folyamatos változók (azaz mutatók) sorozatára adott válaszok alapján. Az LPA feltételezi, hogy vannak nem megfigyelt látens profilok, amelyek válaszmintákat generálnak az indikátorelemeken.
itt átmegyek egy gyors példán az LPA-ra, hogy érdeklődésük/hobbijaik alapján azonosítsam az emberek csoportjait. Az adatok a fiatalok felméréséből származnak, szabadon elérhető a Kaggle.com.
itt egy settenkedik kandikál, amit megyünk:
terminológia Megjegyzés: Az emberek használják a kifejezéseket klaszterek, profilok, osztályok és csoportok szinonimaként, de vannak finom különbségek. Leginkább a profilhoz ragaszkodom, hogy az esetek csoportosítására utaljak, összhangban az LPA terminológiájával. Meg kell jegyeznünk, hogy az LPA a Gauss-féle véges keverék modellezés egyik ága, amely magában foglalja a látens Osztályelemzést (lca). Az LPA és az LCA közötti különbség fogalmi, nem számítási: az LPA folyamatos indikátorokat, az LCA pedig bináris indikátorokat használ. Az LPA egy valószínűségi modell, ami azt jelenti, hogy modellezi a profilhoz tartozó eset valószínűségét. Ez jobb, mint egy olyan megközelítés, mint a K-means, amely távolsági algoritmusokat használ.
ezt félretéve töltsük be az adatokat.
library(tidyverse)
survey <- read_csv("https://raw.githubusercontent.com/whipson/tidytuesday/master/young_people.csv") %>% select(History:Pets)
az adatok 32 érdeklődési kör/hobbi. Minden elem rangsorolva 1 (nem érdekel) 5 (Nagyon érdekel).
a Kaggle leírása azt sugallja, hogy lehetnek gondatlan válaszok (például olyan résztvevők, akik ugyanazt az értéket választották újra és újra). A gondatlan csomag segítségével azonosíthatjuk a”karakterlánc válaszát”. Nézzük meg a Mahalanobis távolsággal rendelkező többváltozós kiugró értékeket is (a kiugró értékek azonosításához lásd a Mahalanobis korábbi bejegyzését).
library(careless)library(psych)interests <- survey %>% mutate(string = longstring(.)) %>% mutate(md = outlier(., plot = FALSE))
a legfeljebb 10-re válaszoló karakterláncot lezárjuk, és az alpha = Mahalanobis D határát használjuk .001.
cutoff <- (qchisq(p = 1 - .001, df = ncol(interests)))interests_clean <- interests %>% filter(string <= 10, md < cutoff) %>% select(-string, -md)
a mclust csomag Különböző típusú modell alapú fürtözést és méretcsökkentést hajt végre. Ráadásul nagyon intuitív a használata. Teljes adatokat igényel (nem hiányzik), ezért ebben a példában eltávolítjuk az eseteket a NAs-szal. Ez nem az előnyben részesített megközelítés; jobb lenne, ha beszámítanánk. De szemléltető célokra ez jól működik. Az összes mutatót is egységesíteni fogom, így amikor a profilokat ábrázoljuk, világosabb látni a klaszterek közötti különbségeket. A kód futtatása néhány percet vesz igénybe.
library(mclust)interests_clustering <- interests_clean %>% na.omit() %>% mutate_all(list(scale))BIC <- mclustBIC(interests_clustering)
kezdjük a Bayes-féle információs kritériumok ábrázolásával az 1-től 9-ig terjedő profilú modellek esetében.
plot(BIC)
nem azonnal világos, hogy melyik modell a legjobb, mivel az y tengely olyan nagy, és sok modell pontszáma közel van egymáshoz. összefoglaló (BIC) mutatja az első három modell alapján 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
a legmagasabb BIC a VVE, 3-ból származik. Ez azt mondja, hogy 3 klaszter van változó térfogattal, változó alakzattal, egyenlő orientációval és ellipszodiális eloszlással (lásd a 2.ábrát ebből a papírból). Azonban a VEE, 3 nem messze van, és valójában elméletileg hasznosabb modell lehet, mivel korlátozza az eloszlás alakját egyenlőnek. Ezért a VEE-vel megyünk, 3.
ha közelebbről meg akarjuk nézni ezt a modellt, akkor objektumként mentjük, és a summary () függvény segítségével vizsgáljuk meg.
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 kimenet leírja a profilok geometriai jellemzőit és a három klaszterbe sorolt esetek számát.
a BIC az egyik legjobban illeszkedő index, de mindig ajánlott további bizonyítékokat keresni arról, hogy az általunk választott megoldás a helyes. Összehasonlíthatjuk az integrált befejezett Likelikood (ICL) kritérium értékeit is. További részletekért lásd ezt a cikket. Az ICL nem sokban különbözik a BIC-től, azzal a különbséggel, hogy büntetést ad a nagyobb entrópiával vagy osztályozási bizonytalansággal rendelkező megoldásokra.
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
hasonló eredményeket látunk. Az ICL azt sugallja, hogy a Vee, 3 modell elég jól illeszkedik. Végül elvégezzük a Bootstrap Likelihood Ratio Test (BLRT) tesztet, amely összehasonlítja a modell illeszkedését a k-1 és a K klaszter modellek között. Más szavakkal, úgy néz ki, hogy a profilok növekedése növeli-e az illeszkedést. Nylund, Asparouhov és Muth (2007) szimulációi alapján a BIC és a BLRT a legjobb mutatók arra, hogy hány profil létezik. Ennek a kódsornak a futtatása hosszú időt vesz igénybe, tehát ha csak követi, azt javaslom, hogy hagyja ki, hacsak nem akar kilépni egy kávészünetre.
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
a BLRT azt is javasolja, hogy a 3-profilos megoldás ideális.
az LPA megjelenítése
most, hogy biztosak vagyunk a 3-profilú megoldás választásában, ábrázoljuk az eredményeket. Pontosabban azt szeretnénk látni, hogy a profilok hogyan különböznek a mutatókon, vagyis a profilokat alkotó elemeken. Ha a megoldás elméletileg értelmes, látnunk kell a különbségeket, amelyeknek van értelme.
először kibontjuk az egyes profilok eszközeit (ne feledje, hogy ezeket szabványosítottuk). Ezután a pivot_longer segítségével hosszú formába rakjuk. Ne feledje, hogy a +1 SD-t meghaladó értékeket vágom, különben rajzolási problémákba ütközünk.
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))
itt van a telek kódja. Átrendezem a mutatókat, hogy a hasonló tevékenységek közel legyenek egymáshoz.
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")
sok mutatónk van (több, mint az LPA-ra jellemző), de érdekes különbségeket látunk. Nyilvánvaló, hogy a vörös csoport érdeklődik a tudomány iránt, a kék csoport pedig nagyobb érdeklődést mutat a művészetek és a humán tudományok iránt. Úgy tűnik, hogy a zöld csoport nem érdekli mind a tudomány, mind a művészet, de mérsékelten érdekli más dolgok.
ezt a cselekményt informatívabbá tehetjük a profilnevek és arányok beillesztésével. Ezt a cselekményt tárgyként is meg fogom menteni, hogy valami igazán klasszat csinálhassunk vele!
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 valami nagyon jó, amit szeretnék csinálni, hogy egy interaktív telek. Miért akarnám ezt csinálni? Nos, a statikus telek egyik problémája az, hogy oly sok mutatóval nehéz elolvasni az egyes mutatók értékeit. Az interaktív cselekmény lehetővé teszi az olvasó számára, hogy szűkítse az érdeklődésre számot tartó mutatókat vagy profilokat. A plotly segítségével a statikus cselekményünket interaktívvá alakítjuk.
library(plotly)ggplotly(p, tooltip = c("Interest", "Mean")) %>% layout(legend = list(orientation = "h", y = 1.2))
van egy gyors példa az LPA-ra. Összességében úgy gondolom, hogy az LPA nagyszerű eszköz a feltáró elemzéshez, bár megkérdőjelezem annak reprodukálhatóságát. Fontos, hogy a statisztikus mind a megfelelő indexeket, mind az elméletet figyelembe vegye, amikor a profilok számáról dönt.
hivatkozások& források
Bertoletti, M., Friel, N.,& Rastelli, R. (2015). A klaszterek számának kiválasztása egy véges keverékmodellben egy pontos integrált befejezett valószínűségi kritérium segítségével. https://arxiv.org/pdf/1411.4257.pdf.
Nylund, K. L., Asparouhov, T., & Muth ons, B. O. (2007). Döntés az osztályok számáról a látens Osztályelemzésben és a növekedési keverék modellezésében: Monte Carlo szimulációs tanulmány. Szerkezeti Egyenlet Modellezés, 14, 535-569.
Scrucca, L., Fop, M., Murphy, T. B., & Raftery, A. E. (2016). mclust5: klaszterezés, osztályozás és Sűrűségbecslés Gauss-féle véges Keverékmodellek segítségével. Az R Folyóirat, 8, 289-317.