阅读权限 255 威望 0 级论坛币 50288 个 通用积分 83.6306 学术水平 253 点 热心指数 300 点 信用等级 208 点 经验 41518 点 帖子 3256 精华 14 在线时间 766 小时 注册时间 2006-5-4 最后登录 2022-11-6
################################################################################
###
### Chapter 6
###
################################################################################
# Table 6.1, p. 192.
# Creating the ged*exper variable in the wages data set.
wages$ged.exper <- wages$ged*wages$exper
print(wages[wages$id %in% c(206,2365,4384),c(1:5, 16)])
# Table 6.2, p. 203.
model.6.2a <- lme(lnw ~ exper + hgc.9 + exper:black + ue.7, data = wages,
random = ~ exper | id, method = "ML",
control = list(msVerbose = TRUE, opt = "optim", trace = 1))
2*model.6.2a$logLik
model.6.2b <- update(model.6.2a, lnw ~ exper + hgc.9 + exper:black + ue.7 + ged,
random = ~ exper + ged | id)
2*model.6.2b$logLik
model.6.2c <- update(model.6.2b, random = ~ exper | id)
2*model.6.2c$logLik
anova(model.6.2a, model.6.2c, model.6.2b)
model.6.2d <- update(model.6.2a, lnw ~ exper + hgc.9 + exper:black + ue.7 + postexp,
random = ~ exper + postexp | id,
control = list(msVerbose = TRUE, niterEM = 100, opt = "optim"))
2*model.6.2d$logLik
anova(model.6.2a, model.6.2d)
model.6.2e <- update(model.6.2d, random = ~ exper| id)
2*model.6.2e$logLik
model.6.2f <- update(model.6.2a, lnw ~ exper + hgc.9 + exper:black + ue.7 + postexp + ged,
random = ~ exper + postexp + ged | id,
control = list(msVerbose = TRUE, niterEM = 500, opt = "optim"))
### NOTE: with big var-cov models, a bigger EM burn-in with optim boosts convergence
### notably
2*model.6.2f$logLik
model.6.2g <- update(model.6.2f, random = ~ exper + ged | id)
2*model.6.2g$logLik
model.6.2h <- update(model.6.2f, random = ~ exper + postexp | id)
2*model.6.2h$logLik
model.6.2i <- update(model.6.2f, lnw ~ exper + hgc.9 + exper:black + ue.7 + ged + exper:ged,
random = ~ exper + ged + exper:ged | id)
2*model.6.2i$logLik
model.6.2j <- update(model.6.2i, random = ~ ged + exper | id)
2*model.6.2j$logLik
### NOTE: examine all models; LR tests won't (all) be correct, but AIC/BIC can be
### compared
anova(model.6.2a, model.6.2b, model.6.2c, model.6.2d, model.6.2e, model.6.2f,
model.6.2g, model.6.2h, model.6.2i, model.6.2j)
### NOTE: AIC prefers model F, but BIC prefers several ahead of F with E its favorite
# Table 6.3, p. 205.
# Summary of model F.
summary(model.6.2f)
pairs(model.6.2f, pch = ".", cex = 2)
### NOTE: notable correlations among random-effects
# Fig. 6.4, p. 209.
# We must first read in the alcohol data set and then run model e from table 4.1, p. 94.
### we can do these using predict
pred.6.4e <- expand.grid(age_14 = seq(0, 2, 0.1), coa = c("Not CoA","CoA"),
peer = c(0.655, 1.381))
pred.6.4e$pred <- predict(model.e, pred.6.4e, level=0)
pred.6.4e$pred <- pred.6.4e$pred^2 # square it to go back to original metric
trellis.device(theme = col.whitebg)
xyplot(pred ~ I(age_14 + 14) | peer, data = pred.6.4e, type = "l", lwd = 2,
groups = coa, lty = 1:2, auto.key = list(points = FALSE, lines = TRUE, lwd=2),
xlim = c(13, 17),
ylab = "Alcuse", xlab = "Age")
#reading in the alcohol data
alcohol <- read.table("d:/alcohol1_pp.txt", header=T, sep=",")
#table 4.1, model e
model.e <- lme(alcuse~coa+peer*age_14 , data=alcohol, random= ~ age_14 | id,
method="ML")
#obtaining the fixed effects parameters
fixef.e <- fixef(model.e)
#obtaining the predicted values and squaring them
fit2.ec0p0 <- (fixef.e[[1]] + .655*fixef.e[[3]] +
alcohol$age_14[1:3]*fixef.e[[4]] +
.655*alcohol$age_14[1:3]*fixef.e[[5]])^2
fit2.ec0p1 <- (fixef.e[[1]] + 1.381*fixef.e[[3]] +
alcohol$age_14[1:3]*fixef.e[[4]] +
1.381*alcohol$age_14[1:3]*fixef.e[[5]] )^2
fit2.ec1p0 <- (fixef.e[[1]] + fixef.e[[2]] + .655*fixef.e[[3]] +
alcohol$age_14[1:3]*fixef.e[[4]] +
.655*alcohol$age_14[1:3]*fixef.e[[5]] )^2
fit2.ec1p1 <- (fixef.e[[1]] + fixef.e[[2]] + 1.381*fixef.e[[3]] +
alcohol$age_14[1:3]*fixef.e[[4]] +
1.381*alcohol$age_14[1:3]*fixef.e[[5]])^2
plot(alcohol1$age[1:3], fit2.ec0p0, ylim=c(0, 3), type="n",
ylab="predicted alcuse squared", xlab="age")
lines(spline(alcohol1$age[1:3], fit2.ec0p0), pch=2, type="b")
lines(spline(alcohol1$age[1:3], fit2.ec0p1), type="b", pch=0)
lines(spline(alcohol1$age[1:3], fit2.ec1p0), type="b", pch=17)
lines(spline(alcohol1$age[1:3], fit2.ec1p1), type="b", pch=15)
title("Non-linear Change")
legend(14, 3, marks=c(2, 0, 17, 15), c("COA=0, low peer", "COA=0, high peer",
"COA=1, low peer", "COA=1, high peer"))
# Reading in the berkeley data set and then creating the transformed variables for iq and age.
berkeley <- read.table(file.choose(), header=T, sep=",")
names(berkeley) <- tolower(names(berkeley))
berkeley$age2.3 <- berkeley$age^(1/2.3)
berkeley$iq2.3 <- berkeley$iq^2.3
# Fig. 6.6, p. 212.
par(mfrow=c(1,3))
plot(berkeley$age, berkeley$iq, type="p", ylim=c(0, 250), xlim=c(0, 60),
ylab="IQ", xlab="TIME", pch=16)
plot(berkeley$age, berkeley$iq2.3, type="p", ylim=c(0, 300000), xlim=c(0, 60),
ylab="IQ^(2.3)", xlab="TIME", pch=16)
plot(berkeley$age2.3, berkeley$iq, type="p", ylim=c(0, 250), xlim=c(0, 6),
ylab="IQ", xlab="TIME^(1/2.3)", pch=16)
### Table 6.4?
# Reading in the external data set.
external <- read.table(file.choose(), header = TRUE, sep=",")
names(external) <- tolower(names(external))
# Creating the higher order variables for grade.
#
### NOTE: not needed...
external$grade2 <- external$grade^2
external$grade3 <- external$grade^3
external$grade4 <- external$grade^4
# Fig. 6.7, p. 218.
par(mfrow=c(2,4))
model.6.7a <- lm(external ~ poly(grade, 2), data = external,
subset = id == "1")
plot(1:6, fitted(model.6.7a), type = "l", lwd = 2, col = "red",
ylim = c(0,60), ylab = "EXTERNAL", xlab = "GRADE")
points(1:6, subset(external, id == "1", external)[[1]], pch = 16)
lines(spline(1:6, subset(external, id == "1", external)[[1]]), lty = 3)
model.6.7b <- lm(external ~ poly(grade, 2), data = external,
subset = id == "6")
plot(1:6, fitted(model.6.7b), type = "l", lwd = 2, col = "red",
ylim = c(0,60), ylab = "EXTERNAL", xlab = "GRADE")
points(1:6, subset(external, id == "6", external)[[1]], pch = 16)
lines(spline(1:6, subset(external, id == "6", external)[[1]]), lty = 3)
model.6.7c <- lm(external ~ grade, data = external,
subset = id == "11")
plot(1:6, fitted(model.6.7c), type = "l", lwd = 2, col = "red",
ylim = c(0,60), ylab = "EXTERNAL", xlab = "GRADE")
points(1:6, subset(external, id == "11", external)[[1]], pch = 16)
lines(spline(1:6, subset(external, id == "11", external)[[1]]), lty = 3)
### NOTE: looks like a quadratic would fit better...
model.6.7d <- lm(external ~ grade, data = external,
subset = id == "25")
plot(1:6, fitted(model.6.7d), type = "l", lwd = 2, col = "red",
ylim = c(0,60), ylab = "EXTERNAL", xlab = "GRADE")
points(1:6, subset(external, id == "25", external)[[1]], pch = 16)
lines(spline(1:6, subset(external, id == "25", external)[[1]]), lty = 3)
model.6.7e <- lm(external ~ poly(grade, 3), data = external,
subset = id == "34")
plot(1:6, fitted(model.6.7e), type = "l", lwd = 2, col = "red",
ylim = c(0,60), ylab = "EXTERNAL", xlab = "GRADE")
points(1:6, subset(external, id == "34", external)[[1]], pch = 16)
lines(spline(1:6, subset(external, id == "34", external)[[1]]), lty = 3)
model.6.7f <- lm(external ~ poly(grade, 4), data = external,
subset = id == "36")
plot(1:6, fitted(model.6.7f), type = "l", lwd = 2, col = "red",
ylim = c(0,60), ylab = "EXTERNAL", xlab = "GRADE")
points(1:6, subset(external, id == "36", external)[[1]], pch = 16)
lines(spline(1:6, subset(external, id == "36", external)[[1]]), lty = 3)
model.6.7g <- lm(external ~ poly(grade, 2), data = external,
subset = id == "40")
plot(1:6, fitted(model.6.7g), type = "l", lwd = 2, col = "red",
ylim = c(0,60), ylab = "EXTERNAL", xlab = "GRADE")
points(1:6, subset(external, id == "40", external)[[1]], pch = 16)
lines(spline(1:6, subset(external, id == "40", external)[[1]]), lty = 3)
model.6.7h <- lm(external ~ poly(grade, 2), data = external,
subset = id == "26")
plot(1:6, fitted(model.6.7h), type = "l", lwd = 2, col = "red",
ylim = c(0,60), ylab = "EXTERNAL", xlab = "GRADE")
points(1:6, subset(external, id == "26", external)[[1]], pch = 16)
lines(spline(1:6, subset(external, id == "26", external)[[1]]), lty = 3)
### alternative in a for loop
ex.ids <- c("1","6","11","25","34","36","40","26")
par(mfrow=c(2,4))
for (i in 1:length(ex.ids)){
fit <- lm(external ~ poly(grade, 4), data = external,
subset = id == ex.ids[i])
pred <- predict(fit, data.frame(grade = seq(1, 6, 0.1)))
plot(x = seq(1, 6, 0.1), y = pred, type = "l", lwd = 2, col = "red",
ylim = c(0,60), ylab = "EXTERNAL", xlab = "GRADE")
points(1:6, subset(external, id == ex.ids[i], external)[[1]], pch = 16)
lines(spline(1:6, subset(external, id == ex.ids[i], external)[[1]]), lty = 3)
}
### NOTE: could use drop1() to find best fit if we wanted...
# Table 6.5, p. 221.
# Comparison of fitting alternative polynomial change trajectories to the external data set.
model.6.5a <- lme(external ~ 1, random = ~ 1 | id, method = "ML", external)
summary(model.6.5a)
model.6.5b <- update(model.6.5a, external ~ time, random = ~ time | id)
summary(model.6.5b)
### NOTE: could use poly(time, degree) for orthogonal polynomials
model.6.5c <- update(model.6.5a, external ~ time + I(time^2),
random = ~ time + I(time^2) | id,
control = list(msVerbose = TRUE, niterEM = 100, opt = "optim"))
summary(model.6.5c)
model.6.5d <- update(model.6.5c, external ~ time + I(time^2) + I(time^3),
random = ~ time + I(time^2) + I(time^3) | id)
summary(model.6.5d)
pairs(model.6.5d, pch = 16) # super high correlations
model.6.5d.1 <- update(model.6.5c, external ~ poly(time, 3),
random = ~ poly(time, 3) | id)
summary(model.6.5d.1)
### NOTE: converges faster with orthogonal polynomials, which remove non-essential
### correlation
# Reading in the fox and geese data.
fg.df <- read.table(file.choose(), header = TRUE, sep=",")
names(fg.df) <- tolower(names(fg.df))
fg.df$id <- factor(fg.df$id)
str(fg.df)
# Fig. 6.8, p. 227.
# Empirical growth plots for 8 children in the fox and geese data.
xyplot(nmoves ~ game | id,
data=fg.df[fg.df$id %in% c(1, 4, 6, 7, 8, 11, 12, 15), ],
ylim=c(0, 25), as.table = T, pch = 16)
# Table 6.6, p. 231.
# Fitting a logistic model to the fox and geese data.
model.6.6a <- nlme(nmoves ~ 1 + 19/(1 + xmid*exp( -scal*game + u)),
fixed = scal + xmid ~ 1,
random = scal + u ~ 1 |id,
start = c(scal = 0.2, xmid = 12),
data = fg.df,
control = list(msVerbose = TRUE, niterEM = 100))
summary(model.6.6a)
model.6.6b <- nlme(nmoves ~ 1 + 19/(1 + xmid*exp(-scal10*game - scal01*read.c - scal11*readc.game + u)),
fixed = scal10 + scal01 + scal11 + xmid ~ 1,
random = scal10 + u ~ 1 |id,
start = c(scal10 = 0.12, scal01 = -0.4, scal11 = 0.04, xmid = 12),
data = fg.df)
summary(model.b)
### NOTE: need to check book for read.c and readc.game
# Fig. 6.10, p. 232.
fixef.a <- fixef(model.a)
fit.a <- 1 + 19/(1 + fixef.a[[2]]*exp(-fixef.a[[1]]*fg.df$game[1:27]))
plot(fg.df$game[1:27], fit.a, ylim=c(0, 25), type="l",
ylab="predicted nmoves", xlab="game")
title("Model A \n Unconditional logistic growth")
fixef.b <- fixef(model.b)
fit.b.high <- 1 + 19/(1+fixef.b[[4]]*exp(-fixef.b[[1]]*fg.df$game[1:27] -
fixef.b[[2]]*1.58 - fixef.b[[3]]*1.58*fg.df$game[1:27]))
fit.b.low <- 1 + 19/(1+fixef.b[[4]]*exp(-fixef.b[[1]]*fg.df$game[1:27] -
fixef.b[[2]]*(-1.58) - fixef.b[[3]]*(-1.58)*fg.df$game[1:27]))
plot(fg.df$game[1:27], fit.b.high, ylim=c(0, 25), type="l",
ylab="predicted nmoves", xlab="game")
lines(fg.df$game[1:27], fit.b.low, lty=3)
title("Model B \n Fitted logistic growth by reading level")
legend(1, 25, c("High Reading level","Low reading level"), lty=c(1, 3)) 复制代码