#Aufgabe 2 #Einlesen der Daten euro <- read.table("europa.txt",header=T) X.euro <- euro[,-1] #a) cov.euro <- cov(X.euro) #Die PCA ist nicht skaleninvariant; hier sind die Varianzen sehr unterschiedlich, #dh. es wird fast nur ober eine Rolle spielen. Daher sollte man zunächst eine #Skalierung durchführen, z.B. so dass alle Variablen die Varianz 1 haben #(Standardisierung) #b) #Korrelationsmatrix = Kovarianzmatrix der standardisierten Variablen. cor.euro <- cor(X.euro) # Standardisiere Matrix => cov = cor euro.stand<-scale(X.euro) cov(euro.stand) cor(euro.stand) cor.euro #PCA entspricht Spektralzerlegung der Kovarianzmatrix (bzw. hier Korrelationsmatrix; #vgl. Vorlesung) eigen.cor <- eigen(cor.euro) #Anteil der durch die ersten beiden Hauptkomponenten erklärten Streuung frac2 <- sum(eigen.cor$values[1:2])/sum(eigen.cor$values) frac2 #84.25% der gesamten Streuung werden durch die ersten beiden Hauptkomponenten erklärt. #c) frac.expl <- cumsum(eigen.cor$values)/sum(eigen.cor$values) frac.expl #1. HK: 48.66% der Streuung #1.+ 2. HK: 84.25% der Streuung (vgl. oben) #1.+ 2.+ 3. HK: 93.58% der Streuung #1. + ... + 4. HK: 100% der Streuung #1. +2. HK enthalten 84.25% der Gesamtstreuung: diese beiden sollte man für #notwendig erachten #d) #Matrix Q der Eigenvektoren Q <- eigen.cor$vectors p <- dim(Q)[2] #Vektor für Namen names <- names(X.euro) par(mfrow = c(p,1)) #Balkendiagramm für jede Hauptkomponente for (i in 1:p){ if(all(Q[,i]<0)){ Q[,i] <- -Q[,i] #Vorzeichenänderung } #Anordnung gemäß der absoluten Werte o <- rev(order(abs(Q[,i]))) barplot(Q[o,i],names.arg = names[o]) abline(h = 0) } #e) #Wir betrachten die ersten beiden Hauptkomponenten. Die neuen Kovariablen erhält #man wie folgt: y_1=a_1'x, y_2=a_2'x #X.euro zunächst standardisieren, da man auf Basis von Korrelationsmatrix arbeitet: Y12 <- as.matrix(euro.stand) %*% eigen.cor$vectors[,1:2] ## Alternativ: Berechnung über princomp PCEuro<-princomp(X.euro,cor=T) #Indices für CH, BUL, D, PL ind <- which(euro[,1]=="Schweiz"| euro[,1]=="Bulgarien") Y12.sel <- Y12[ind,] row.names(Y12.sel) <- as.character(euro[ind,1]) Y12.sel ## Alternativ: Berechnung über princomp PCEuro$scores[ind,1:2] # numerische Abweichungen gegenüber der Lösung mit princomp #Interpretation: betrachte hierzu ersten und zweiten Eigenvektor eigen.cor$vectors[,1:2] ## Alternativ: Berechnung über princomp PCEuro$loadings #sowie die ursprünglichen Variablen X.euro[ind,] #-BUL: BIP niedrig, arbl hoch; also y_1 eher. klein, y_2 groß #-CH: BIP hoch, arbl niedrig; also y_1 hoch, y_2 eher. klein (umgekehrt) #Die Einwohnerzahl ist fast gleich, bei der Fläche ist BUL etwa 2.5mal so groß #(erklärt Unterschiede in Ausprägung nach oben und unten). #Das Ganze geht natürlich auch mit Hilfe der Funktion princomp()