多水平统计分析模型(混合效应模型)
| 分类: R语言学习 |
一、概述
a0:
固定截距
a1: 固定斜率
b: 随机效应(只影响截距)
X: 固定效应
e: 噪声
http://img.blog.csdn.net/20160611122057362
1、nlme包
这是一个比较成熟的R包,是R语言安装时默认的包,它除了可以分析分层的线性混合模型,也可以处理非线性模型。在优势方面,个人认为它可以处理相对复杂的线性和非线性模型,可以定义方差协方差结构,可以在广义线性模型中定义几种分布函数和连接函数。
它的短板:随机效应的定义过于呆板;数据量大时速度很慢;默认情况下不能处理系谱数据;不能处理多元数据。
2、lme4包
lme4包是由Douglas Bates开发,他也是nlme包的作者之一,相对于nlme包而言,它的运行速度快一点,对于睡觉效应·随机效应的结构也可以更复杂一点,但是它的缺点也和nlme一样:不能处理协方差和相关系数结构;它可以与构建系数的包连接,比如mmpedigree包,但是结合比较脆弱。
3、ASReml-R包
ASReml-R是ASReml的R版本,它的优点:可以处理复杂的随机因子结构;可以处理多元数据;可以处理系谱数据;可以处理大批量的数据
主要的缺点:它是收费的,当然它对于不发达国家的科研机构是免费的,不过需要申请和被审核;它的用户主要是育种公司、科研机构等,它可以在各种平台上运行,包括Windows、Linux、OS X等。
二、多水平模型案例分析
案例一:
1、首先导入数据,查看一下数据的结构
数据来源:一个传统的裂区数据来说明不同软件包的用法,这个数据oats是在MASS包中,是研究大麦品种和N肥处理的裂区试验,其中品种为主区,肥料为裂区。
library(MASS)
data(oats)
names(oats) = c('block', 'variety', 'nitrogen', 'yield')
head(oats)
block variety nitrogen yield
1 I Victory 0.0cwt 111
2 I Victory 0.2cwt 130
3 I Victory 0.4cwt 157
4 I Victory 0.6cwt 174
5 I Golden.rain 0.0cwt 117
6 I Golden.rain 0.2cwt 114
oats$mainplot=oats$variety
oats$subplot=oats$nitrogen
2、nlme包:用这个包很简单,y-变量写在左边,然后是固定因子,然后是随机因子,注意1|block/mainplot是裂区试验残差的写法,因为里面有两个残差。代码如下:
library(lme4)
library(nlme) m1.nlme = lme(yield ~ variety*nitrogen,random = ~ 1|block/mainplot,data = oats) summary(m1.nlme)
方差分析结果为: anova(m1.nlme) numDF denDF F-value p-value (Intercept) 1 45 245.14299 <.0001 variety 2 10 1.48534 0.2724 nitrogen 3 45 37.68562 <.0001 variety:nitrogen 6 45 0.30282 0.9322
3、lme4包
lme4包的语法也相似,随机效应有着和nlme相同的语法,不同的是lme4包它的结果给出了随机效应的标准差,而不是方差。 library(lme4) m1.lme4 = lmer(yield ~ variety*nitrogen + (1|block/mainplot),data = oats) summary(m1.lme4) anova(m1.lme4) Analysis of Variance Table of type III with Satterthwaite approximation for degrees of freedom Sum Sq Mean Sq NumDF DenDF F.value Pr(>F) variety 526.1 263.0 2 10 1.485 0.2724 nitrogen 20020.5 6673.5 3 45 37.686 2.458e-12 *** variety:nitrogen 321.8 53.6 6 45 0.303 0.9322 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
案例二:利用nlme包
1
2
3
4
5
6
install.packages("faraway") library(faraway) library(nlme) age educ sex income year person cyear 1 31 12 M 6000 68 1 -10 2 31 12 M 5300 69 1 -9 3 31 12 M 5200 70 1 -8 4 31 12 M 6900 71 1 -7 5 31 12 M 7500 72 1 -6 6 31 12 M 8000 73 1 -5
library(mgcv) psid$cyear <- psid$year-78 head(psid) model1=lmer(log(income) ~ cyear*sex +age+educ+(cyear|person),psid)
lmer函数使用和lm是类似的,一般变量表示固定效应,括号内竖线右侧的person表示它是一个随机效应,它与模型中其它变量相加,而且与年份cyear变量相乘,影响其斜率。这就是一个随机效应模型。如果认为随机效应只影响模型截距,那么固定效应回归模型可以用下面的公式
model2=lmer(log(income) ~ cyear*sex +age+educ+(1|person),psid) 为了判断哪一个模型更为合适,可以使用anova函数,从结果中观察到P值很小,判断应当使用model1
anova(model1,model2)
Data: psid
Models:
..1: log(income) ~ cyear * sex + age + educ + (1 | person)
object: log(income) ~ cyear * sex + age + educ + (cyear | person)
Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)
..1 8 3943.8 3987.1 -1963.9 3927.8
object 10 3805.5 3859.6 -1892.7 3785.5 142.3 2 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
得到的模型结果还可以用各种泛型函数如summary、predict、resid进行进一步处理。当响应变量不符合正态分布假设时,还可以用广义多层回归进行(glmer)建模
案例三:
1、Generate a longitudinal dataset and convert it into long format
library(MASS)
dat.tx.a <- mvrnorm(n=250, mu=c(30, 20, 28),
dat.tx.b <- mvrnorm(n=250, mu=c(30, 20, 22),
dat <- data.frame(rbind(dat.tx.a, dat.tx.b))
names(dat) <- c('measure.1', 'measure.2', 'measure.3')
根据指定的均值和协方差生成多元正态数据:MASS包中的mvrnorm()函数
mvrnorm(n,mean,sigma)
measure.1 measure.2 measure.3
1
2
3
4
5
6
dat <- data.frame(subject.id = factor(1:500), tx = rep(c('A',
'B'), each = 250), dat)
subject.id tx measure.1 measure.2 measure.3 1 1 A 25.31761 20.89468 34.65525 2 2 A 19.30890 22.82886 33.24505 3 3 A 25.53250 16.27554 24.61767 4 4 A 27.52445 23.07668 32.62275 5 5 A 35.89934 28.24790 36.07344 6 6 A 25.71556 13.36878 26.69632
rm(dat.tx.a, dat.tx.b)
dat <- reshape(dat,varying =
c('measure.1','measure.2','measure.3'),idvar = 'subject.id',
direction = 'long')
1.1
2.1
3.1
4.1
5.1
6.1
495.3
496.3
497.3
498.3
499.3
500.3
2、Multilevel growth models
有很多R包可以做多水平分析,其中 lme4对于一般模型(二分类及离散输出)比较适合,另外一个nlme包
比较适合连续输出变量(正态或高斯分布)
install.packages('lme4')
library(Matrix)
library(lme4)
m <- lmer(measure ~ time + (1 | subject.id), data =
dat)
summary(m)
注:符号 DV 1
rand.int
Likewise, a random slopes model is specified using the
syntax DV
~ IV + (rand.slope | rand.int).
Linear mixed model fit by REML ['lmerMod']
Formula: measure ~ time + (1 | subject.id)
REML criterion at convergence: 9750.6
Scaled residuals:
-2.41363 -0.69275
Random effects:
Groups
subject.id (Intercept)
Residual
Number of obs: 1500, groups:
Fixed effects:
(Intercept)
time
Correlation of Fixed Effects:
time -0.880
3、
install.packages('lmerTest')
library(lmerTest)
m <- lmer(measure ~ time + (1 | subject.id), data =
dat)
summary(m)
结果是一样的,不过多了P值
4、Calculating 95% CI and PI
dat.new <- data.frame(time
= 1:3)
dat.new$measure <- predict(m, dat.new, re.form =
NA)
m.mat <- model.matrix(terms(m), dat.new)
dat.new$var <- diag(m.mat %*% vcov(m) %*% t(m.mat)) +
VarCorr(m)$subject.id[1]
dat.new$pvar <- dat.new$var + sigma(m)^2
dat.new$ci.lb <- with(dat.new, measure - 1.96 * sqrt(var))
dat.new$ci.ub <- with(dat.new, measure + 1.96 * sqrt(var))
dat.new$pi.lb <- with(dat.new, measure - 1.96 *
sqrt(pvar))
dat.new$pi.ub <- with(dat.new, measure + 1.96 *
sqrt(pvar))
5、Plot the average values
library(ggplot2)
ggplot(data = dat.new, aes(x = time, y = measure)) +
http://s3/bmiddle/0024CtGnzy72PPY5jvY02&690

加载中…