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] 1.262954285 -0.326233361 1.329799263 # [4] 1.272429321 0.414641434 -1.539950042 # [7] -0.928567035 -0.294720447 -0.005767173 2.404653389 x1[1] = 1.25 # After: notice by how little we changed it! # ------ # [1] 1.250000000 -0.326233361 1.329799263 # [4] 1.272429321 0.414641434 -1.539950042 # [7] -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[131] = 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")