<- function (pcobj, choices = 1:2, scale = 1, pc.biplot = TRUE,
ggbiplot obs.scale = 1 - scale, var.scale = scale, groups = NULL,
ellipse = FALSE, ellipse.prob = 0.68, labels = NULL, labels.size = 3,
alpha = 1, var.axes = TRUE, circle = FALSE, circle.prob = 0.69,
varname.size = 3, varname.adjust = 1.5, varname.abbrev = FALSE,
...)
{library(ggplot2)
library(plyr)
library(scales)
library(grid)
stopifnot(length(choices) == 2)
if (inherits(pcobj, "prcomp")) {
<- sqrt(nrow(pcobj$x) - 1)
nobs.factor <- pcobj$sdev
d <- sweep(pcobj$x, 2, 1/(d * nobs.factor), FUN = "*")
u <- pcobj$rotation
v
}else if (inherits(pcobj, "princomp")) {
<- sqrt(pcobj$n.obs)
nobs.factor <- pcobj$sdev
d <- sweep(pcobj$scores, 2, 1/(d * nobs.factor), FUN = "*")
u <- pcobj$loadings
v
}else if (inherits(pcobj, "PCA")) {
<- sqrt(nrow(pcobj$call$X))
nobs.factor <- unlist(sqrt(pcobj$eig)[1])
d <- sweep(pcobj$ind$coord, 2, 1/(d * nobs.factor), FUN = "*")
u <- sweep(pcobj$var$coord, 2, sqrt(pcobj$eig[1:ncol(pcobj$var$coord),
v 1]), FUN = "/")
}else if (inherits(pcobj, "lda")) {
<- sqrt(pcobj$N)
nobs.factor <- pcobj$svd
d <- predict(pcobj)$x/nobs.factor
u <- pcobj$scaling
v <- sum(d^2)
d.total
}else {
stop("Expected a object of class prcomp, princomp, PCA, or lda")
}<- pmin(choices, ncol(u))
choices <- as.data.frame(sweep(u[, choices], 2, d[choices]^obs.scale,
df.u FUN = "*"))
<- sweep(v, 2, d^var.scale, FUN = "*")
v <- as.data.frame(v[, choices])
df.v names(df.u) <- c("xvar", "yvar")
names(df.v) <- names(df.u)
if (pc.biplot) {
<- df.u * nobs.factor
df.u
}<- sqrt(qchisq(circle.prob, df = 2)) * prod(colMeans(df.u^2))^(1/4)
r <- rowSums(v^2)
v.scale <- r * df.v/sqrt(max(v.scale))
df.v if (obs.scale == 0) {
<- paste("standardized PC", choices, sep = "")
u.axis.labs
}else {
<- paste("PC", choices, sep = "")
u.axis.labs
}<- paste(u.axis.labs, sprintf("(%0.1f%% explained var.)",
u.axis.labs 100 * pcobj$sdev[choices]^2/sum(pcobj$sdev^2)))
if (!is.null(labels)) {
$labels <- labels
df.u
}if (!is.null(groups)) {
$groups <- groups
df.u
}if (varname.abbrev) {
$varname <- abbreviate(rownames(v))
df.v
}else {
$varname <- rownames(v)
df.v
}$angle <- with(df.v, (180/pi) * atan(yvar/xvar))
df.v$hjust = with(df.v, (1 - varname.adjust * sign(xvar))/2)
df.v<- ggplot(data = df.u, aes(x = xvar, y = yvar)) + xlab(u.axis.labs[1]) +
g ylab(u.axis.labs[2]) + coord_equal()
if (var.axes) {
if (circle) {
<- c(seq(-pi, pi, length = 50), seq(pi, -pi,
theta length = 50))
<- data.frame(xvar = r * cos(theta), yvar = r *
circle sin(theta))
<- g + geom_path(data = circle, color = muted("white"),
g size = 1/2, alpha = 1/3)
}<- g + geom_segment(data = df.v, aes(x = 0, y = 0,
g xend = xvar, yend = yvar), arrow = arrow(length = unit(1/2,
"picas")), color = muted("red"))
}if (!is.null(df.u$labels)) {
if (!is.null(df.u$groups)) {
<- g + geom_text(aes(label = labels, color = groups),
g size = labels.size)
}else {
<- g + geom_text(aes(label = labels), size = labels.size)
g
}
}else {
if (!is.null(df.u$groups)) {
<- g + geom_point(aes(color = groups), alpha = alpha)
g
}else {
<- g + geom_point(alpha = alpha)
g
}
}if (!is.null(df.u$groups) && ellipse) {
<- c(seq(-pi, pi, length = 50), seq(pi, -pi, length = 50))
theta <- cbind(cos(theta), sin(theta))
circle <- ddply(df.u, "groups", function(x) {
ell if (nrow(x) <= 2) {
return(NULL)
}<- var(cbind(x$xvar, x$yvar))
sigma <- c(mean(x$xvar), mean(x$yvar))
mu <- sqrt(qchisq(ellipse.prob, df = 2))
ed data.frame(sweep(circle %*% chol(sigma) * ed, 2,
FUN = "+"), groups = x$groups[1])
mu,
})names(ell)[1:2] <- c("xvar", "yvar")
<- g + geom_path(data = ell, aes(color = groups, group = groups))
g
}if (var.axes) {
<- g + geom_text(data = df.v, aes(label = varname,
g x = xvar, y = yvar, angle = angle, hjust = hjust),
color = "darkred", size = varname.size)
}return(g)
}
ggbiplot
Fordi github kan være træls
R
PCA
Bare fordi. ggbiplot er en lækker pakke. Det kan bare være en lidt frustrerende oplevelse at få den installeret. Der er bøvl med forskellige versioner af R, og når 60 studerende på et kursus alle prøver at installere fra github samtidig, støder man næsen mod begrænsninger i githubs api. Så. Kopier nedenstående, kør det i R, og funktionen ggbiplot er tilgængelig.