V tomto zadaní budeme opäť pracovať s dátovým súborom
uscrime
z knižnice SMS data
. Súbor obsahuje 50
pozorovaní a 11 premenných s informáciami o počte výskytov rôznych
trestných činov v rámci konkrétnych regiónov USA, ich rozlohe a
populácii.
V predchádzajúcej úlohe sme sa zaoberali analýzou hlavných komponentov. Nasledujúca tabuľka zrhrňuje výsledky pre všetkých 9 komponentov. Vidíme, že na pokrytie zhruba 92% variability nám stačí prvých 5 komponentov, pričom prvý komponent vyjadruje približne 50% variability dát. Na zníženie dimenzionality dát a zároveň dostatočné vysvetlenie variability by nám stačilo prvých 5 komponentov namiesto pôvodných 9.
library(DescTools)
library(kableExtra)
library(knitr)
data(uscrime, package = "SMSdata")
data<-uscrime
pcdata<-data[,-c(10,11)]
pcdata<- scale(pcdata, center = TRUE, scale = TRUE)
pc<-prcomp(pcdata)
tab<-summary(pc)$importance
tab %>%
kbl() %>%
kable_styling()
PC1 | PC2 | PC3 | PC4 | PC5 | PC6 | PC7 | PC8 | PC9 | |
---|---|---|---|---|---|---|---|---|---|
Standard deviation | 2.112468 | 1.211975 | 1.074463 | 0.8535431 | 0.6728768 | 0.5266941 | 0.4740118 | 0.365127 | 0.3121157 |
Proportion of Variance | 0.495840 | 0.163210 | 0.128270 | 0.0809500 | 0.0503100 | 0.0308200 | 0.0249700 | 0.014810 | 0.0108200 |
Cumulative Proportion | 0.495840 | 0.659040 | 0.787320 | 0.8682700 | 0.9185700 | 0.9494000 | 0.9743600 | 0.989180 | 1.0000000 |
Na obrázkoch nižšie, v ktorých využívame 2. a 3. komponent na zobrazenie dát a 3. a 4. komponent (=rôzne “uhly” pohľadu na 9-rozmerné dáta), môžeme pozorovať zhlukovanie dát podľa jednotlivých regiónov. Zdá sa, že zatiaľ čo v južných regiónoch prevládajú vraždy a útoky, v západných sú to krádeže a vlámania a v stredozápadných regiónoch krádeže áut a prepady.
library("ggfortify")
autoplot(pc, data = data, loadings.label = TRUE, colour = 'reg',x=2,y=3, loadings = T)
autoplot(pc, data = data, loadings.label = TRUE, colour = 'reg',x=3,y=4, loadings = T)
Pracujeme s 9-rozmerným náhodným vektorom a v rámci faktorovej analýzy sa pozrieme na vhodný počet faktorov. Keďže pri 6 faktoroch už dostávame záporný počet stupňov voľnosti pri 9 premenných (\(d=\frac{1}{2}(p-k)^2-\frac{1}{2}(p+k)\)), budeme skúmať iba vlastnoti 2,3,4 a 5 faktorov. Nasledujúca tabuľka zachytáva kumulatívny rozptyl a p-hodnoty pre daný počet faktorov.
fa1 <- factanal(pcdata, factors = 2, rotation="varimax")
fa2 <- factanal(pcdata, factors = 3, rotation="varimax")
fa3 <- factanal(pcdata, factors = 4, rotation="varimax")
fa4 <- factanal(pcdata, factors = 5, rotation="varimax")
f1<-c(0.59, fa1$PVAL)
f2<-c(0.69, fa2$PVAL)
f3<-c(0.79, fa3$PVAL)
f4<-c(0.86, fa4$PVAL)
tabul<-rbind(f1,f2,f3,f4)
colnames(tabul)<-c("cum. var", "p-hodnota")
rownames(tabul)<-c("2","3","4","5")
print(tabul)
## cum. var p-hodnota
## 2 0.59 0.001115917
## 3 0.69 0.081426919
## 4 0.79 0.292347438
## 5 0.86 0.127794059
Vidíme, že zamietame nulovú hypotézu, že sú postačujúce 2 faktory a 3
faktory sú relatívne blízko hladiny významnosti. Na základe najvyššej
p-hodnoty, dostatočne vysokého kumulatívneho rozptylu a vhodnej redukcie
dimenzionality si zvolíme 4 faktory.
V nižšie uvedenej tabuľke pozorujeme, že faktor 1 je vysoko korelovaný s premennými burglary a larceny, faktor 2 s premennými murder a assault, faktor 3 s popu1985 a robbery a faktor 4 s land area.
print(fa3, digits=2, cutoff=.6, sort=TRUE)
##
## Call:
## factanal(x = pcdata, factors = 4, rotation = "varimax")
##
## Uniquenesses:
## land area popu 1985 murder rape robbery assault burglary larceny
## 0.00 0.52 0.19 0.27 0.16 0.09 0.10 0.18
## autotheft
## 0.41
##
## Loadings:
## Factor1 Factor2 Factor3 Factor4
## rape
## burglary 0.85
## larceny 0.88
## autotheft
## murder 0.88
## assault 0.87
## popu 1985 0.63
## robbery 0.80
## land area 0.98
##
## Factor1 Factor2 Factor3 Factor4
## SS loadings 2.35 2.01 1.63 1.08
## Proportion Var 0.26 0.22 0.18 0.12
## Cumulative Var 0.26 0.48 0.67 0.79
##
## Test of the hypothesis that 4 factors are sufficient.
## The chi square statistic is 7.32 on 6 degrees of freedom.
## The p-value is 0.292
par(mfrow = c(1,2))
load <- fa3$loadings[,1:2]
plot(load,type="n")
text(load,labels=names(uscrime[,-c(10,11)]),cex=.3)
lines(c(-1,1),c(0,0), lty = 3)
lines(c(0,0),c(-1,1), lty = 3)
load <- fa3$loadings[,3:4]
plot(load,type="n")
text(load,labels=names(uscrime[,-c(10,11)]),cex=.3)
lines(c(-1,1),c(0,0), lty = 3)
lines(c(0,0),c(-1,1), lty = 3)
par(mfrow = c(1,1))
Na obrázkoch pozorujeme, že premenná rape je kladne a približne rovnako korelovaná so všetkými faktormi a premenná autotheft je pomerne vysoko korelovaná s faktorom 1 a 3. Na základe tejto analýzy by sme mohli v potrebnom modeli uvažovať faktor 1, ktorý by mohol reprezentovať vlámania (burglary, larceny, autotheft), faktor 2, ktorý by reprezentoval napadnutia a vraždy (assault, murder), faktor 3, ako reprezentanta krádeží (robbery, rape, popul1985) a ďalej zvlášť premennú land area, na ktorej sa zdá, že nezávisí intenzita výskytov týchto trestých činov.
rbPal <- colorRampPalette(c('red','blue'))
loadings <- data.frame(fa3$loadings[,1:4])
loadings$colF1 <- rbPal(20)[as.numeric(cut(loadings[,1],breaks = seq(-1,1,length = 20)))]
loadings$nam1 <- paste(row.names(loadings), round(loadings[,1], digits = 3), sep = "\n")
loadings$colF2 <- rbPal(20)[as.numeric(cut(loadings[,2],breaks = seq(-1,1,length = 20)))]
loadings$nam2 <- paste(row.names(loadings), round(loadings[,2], digits = 3), sep = "\n")
loadings$colF3 <- rbPal(20)[as.numeric(cut(loadings[,3],breaks = seq(-1,1,length = 20)))]
loadings$nam3 <- paste(row.names(loadings), round(loadings[,2], digits = 3), sep = "\n")
loadings$colF4 <- rbPal(20)[as.numeric(cut(loadings[,4],breaks = seq(-1,1,length = 20)))]
loadings$nam4 <- paste(row.names(loadings), round(loadings[,2], digits = 3), sep = "\n")
par(mar = c(5, 5, 5, 4) + 0.4)
barplot(abs(loadings[,1]), col = loadings$colF1, ylim = c(0,1), ylab = "Factor 1", names.arg = loadings$nam1, cex.names = 0.5)
barplot(abs(loadings[,2]), col = loadings$colF2, ylim = c(0,1), ylab = "Factor 2", names.arg = loadings$nam2, cex.names = 0.5)
barplot(abs(loadings[,3]), col = loadings$colF3, ylim = c(0,1), ylab = "Factor 3", names.arg = loadings$nam2, cex.names = 0.5)
barplot(abs(loadings[,4]), col = loadings$colF4, ylim = c(0,1), ylab = "Factor 4", names.arg = loadings$nam2, cex.names = 0.5)