# Latent variable methods and applications (2012)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
 Class date(s): 29 March 2012

## Course notes

This section will be briefly covered in class on 29 March 2012. Only the basic concepts will be covered.

• Course notes. Please read the start of Chapter 6 for an overview. The rest of the chapter will not be covered in this course.

## Code that shows least squares failing

We get very different models for very small changes in the raw data when our variables are strongly correlated.

 # Create data with strongly correlated X's set.seed(0) x1 <- rnorm(10) x2 <- x1 * 2 + rnorm(10, sd=0.01) x3 <- rnorm(10) y <- 3*x1 + 4*x2 - 5*x3 + rnorm(10, sd=0.05) plot(data.frame(x1, x2, x3, y)) mod.corr <- lm(y ~ x1 + x2 + x3) print('Before the change') summary(mod.corr) confint(mod.corr) # Coefficients: # (Intercept) x1 x2 x3 # 0.02144 -0.95069 5.96684 -5.00735 # Change one of the entries in x1: before # ---------------------------------------- #  1.262954285 -0.326233361 1.329799263 #  1.272429321 0.414641434 -1.539950042 #  -0.928567035 -0.294720447 -0.005767173 2.404653389 x1 = 1.25 # After: notice by how little we changed it! # ------ #  1.250000000 -0.326233361 1.329799263 #  1.272429321 0.414641434 -1.539950042 #  -0.928567035 -0.294720447 -0.005767173 2.404653389 mod.updated <- lm(y ~ x1 + x2 + x3) print('After the change') summary(mod.updated) confint(mod.updated) # Coefficients: # (Intercept) x1 x2 x3 # 0.01978 0.51850 5.23192 -5.00882 # The coefficient for x1 has flipped sign! The slope # for x2 is also quite different. # Confirming that least squares is unstable with # highly correlated data. # R2 is 1.0 in both cases! # S_E = 0.03323 in both cases! 

## Code for the rotating cube

Created using R with this code, then converted to a video file using http://ffmpeg.org/

temps<- read.csv('http://openmv.net/file/room-temperature.csv')
summary(temps)
X <- data.frame(x1=temps$FrontLeft, x2=temps$FrontRight, x3=temps$BackLeft) # To colour-code sub-groups of outliers library(lattice) grouper = c(numeric(length=50)+1, numeric(length=10)+2, numeric(length=144-50-10)+1) grouper = 3 cube <- function(angle){ # Function to draw the cube at a certain viewing angle xlabels = 0 ylabels = 0 zlabels = 0 lattice.options(panel.error=NULL) print(cloud( X$x3 ~ X$x1 * X$x2,
cex = 1,
type="p",
groups = grouper,
pch=20,
col=c("black", "blue", "blue"),
main="",
screen = list(z = angle, x = -70, y = 0),
par.settings = list(axis.line = list(col = "transparent")),
scales = list(
col = "black", arrows=TRUE,
distance=c(0.5,0.5,0.5)
),
xlab="x1",
ylab="x2",
zlab="x3",
zoom = 1.0
)
)
}

angles = seq(0, 360, 1)
for(i in angles){

if (i<10) {
filename <- paste("00", as.character(i), ".jpg", sep="")
} else if (i<100) {
filename <- paste("0", as.character(i), ".jpg", sep="")
} else {
filename <- paste("", as.character(i), ".jpg", sep="")
}

jpeg(file=filename, height = 1000, width = 1000, quality=100, res=300)
cube(i)
dev.off()
}

# Install "ffmpeg" to stitch the JPG files into an animation
system("ffmpeg -r 20 -b 1800 -i %03d.jpg animated-spinning-cube.mp4")