数据设置:
set.seed(101)
spin = runif(600, 1, 24)
reg = runif(600, 1, 15)
ID = rep(c("1","2","3","4","5", "6", "7", "8", "9", "10"))
day = rep(1:30, each = 10)
testdata <- data.frame(spin, reg, ID, day)
testdata$fatigue <- testdata$spin*testdata$reg/10*rnorm(30, mean=3, sd=2)
Is ID
really nested within day
?从技术上讲,这表明个体 1 (ID=1
)在第 1 天测量代表不同的那个人ID=1
第 2 天测量...?
library(lme4)
m1 <- lmer(fatigue ~ spin * reg + ( 1 | ID),
data = testdata, REML = TRUE)
confint(m1, method = "Wald", parm="beta_")
## instead of test="Chisq", which doesn't work
## 2.5 % 97.5 %
## (Intercept) -13.44726318 7.4959080
## spin -0.04751327 1.2328254
## reg -0.86763792 1.1550787
## spin:reg 0.11263238 0.2541709
为什么不是day
在模型中...?
设置预测数据:
## midpoints of bin
spinvals <- quantile(testdata$spin,seq(0,1,length=5))[2:4]
pframe <- with(testdata,
expand.grid(ID=unique(ID),
reg=seq(min(reg),max(reg),length.out=51),
spin=spinvals))
pframe$fatigue <- predict(m1,newdata=pframe)
pframe$spinFac <- factor(pframe$spin,levels=spinvals)
## explicit factor() to prevent alphabetization of levels
library(ggplot2); theme_set(theme_bw())
g0 <- ggplot(pframe,aes(reg,fatigue,colour=spinFac))+
geom_line(aes(group=interaction(spinFac,ID)))
## bins for cutting testdata into 3 levels (min, 0.33,0.66, max)
## label bins by midpoints
spincuts <- quantile(testdata$spin,seq(0,1,length=4))
testdata$spinFac <- cut(testdata$spin,
spincuts,labels=spinvals)
我不太清楚为什么这会翻转因子水平......
g0 + geom_point(data=testdata)
这是从中提取所需数据的初步尝试effects
目的:
library(effects)
ee <- effect("spin*reg", m1,
xlevels=list(spin=spinvals))
eedat <- with(ee,data.frame(x,fatigue=fit,lwr=lower,upr=upper))
ggplot(eedat,aes(x=reg,y=fatigue,colour=factor(spin)))+
geom_line()+
geom_ribbon(aes(group=spin,ymin=lwr,ymax=upr),colour=NA,
alpha=0.4)