经常我们会听见随机效应模型,固定效应模型,混合效应模型呀,其实这些个东西都是多水平模型:
Multilevel models (also known as hierarchical linear models, linear mixed-effect model, mixed models, nested data models, random coefficient, random-effects models, random parameter models, or split-plot designs) are statistical models of parameters that vary at more than one level.
什么时候会用到多水平模型呢?
一般在处理嵌套数据的时候会用到多水平模型,此时该模型的分析单位通常是在较低层次上的个人,他们被嵌套在较高层次上的背景或综合单位中。比如个人嵌套在家庭,学生嵌套在学校,meta分析中每个研究对象嵌套在每个研究中。
还有就是纵向数据的处理,这个可以理解为时间嵌套在个人中,个人水平就成了高水平。
尽管二层次模型是最常见的,多层次模型也可以用于具有多个层次的数据。
今天就给大家写一个实际的该运用多水平模型进行数据分析的例子,我们在这个例子中就可以体会传统的回归模型和多水平模型的差异,以及该使用多水平模型却没有正确的使用时所造成的后果。
数据模拟
本文依然会给大家模拟一个非常容易理解的例子:
比如我们模拟出来3个变量:幸福感、GPA,朋友数量,这三个变量都是有关于大学生的,然后我们就感兴趣GPA和朋友数量是不是会影响大学生的幸福感。
我们还要把数据设置成嵌套的,我们让我们的大学生来自不同的学校,比如他们分别来自3个穷学校和3个富学校,这样的话,我们的就知道我们的学生是嵌套在学校中,那么对于这3个变量的分析就应该使用多水平模型。
看数据模拟的代码:
nrich=40
npoor=160
#规定参数
S.F.Rich=-2
S.F.Poor=6
S.G.Rich=.7
S.G.Poor=.7
# 富学校
# School 1
X1 <- rnorm(nrich, 10, 2) # 朋友数量
Z1 <- runif(nrich, 1.0, 4.0) # GPA
Y1 <- S.F.Rich*X1 + S.G.Rich*Z1 + 80 + rnorm(nrich, sd= 5) # 幸福感
# School 2
X2 <- rnorm(nrich, 10, 2)
Z2 <- runif(nrich, 1.0, 4.0)
Y2 <- S.F.Rich*X2 + S.G.Rich*Z2 + 75 + rnorm(nrich, sd= 5)
# School 3
X3 <- rnorm(nrich, 10, 2)
Z3 <- runif(nrich, 1.0, 4.0)
Y3 <- S.F.Rich*X3 + S.G.Rich*Z3 +90 + rnorm(nrich, sd= 5)
# 穷学校
# School 4
X4 <- rnorm(npoor, 5, 2) #朋友数量
Z4 <- runif(npoor, 1.0, 4.0) #GPA
Y4 <- S.F.Poor*X4 + S.G.Poor*Z4 + 35 + rnorm(npoor, sd = 10)
# School 5
X5 <- rnorm(npoor, 5, 2)
Z5 <- runif(npoor, 1.0, 4.0)
Y5 <- S.F.Poor*X5 + S.G.Poor*Z5 + 40 + rnorm(npoor, sd = 10)
# School 6
X6 <- rnorm(npoor, 5, 2)
Z6 <- runif(npoor, 1.0, 4.0)
Y6 <- S.F.Poor*X6 + S.G.Poor*Z6 + 50 + rnorm(npoor, sd = 10)
# 3个富学校的数据集:
Student.Data.School.1<-data.frame(Happiness=Y1, Friends=X1, GPA=Z1)
Student.Data.School.2<-data.frame(Happiness=Y2, Friends=X2, GPA=Z2)
Student.Data.School.3<-data.frame(Happiness=Y3, Friends=X3, GPA=Z3)
# 3个穷学校的数据集:
Student.Data.School.4<-data.frame(Happiness=Y4, Friends=X4, GPA=Z4)
Student.Data.School.5<-data.frame(Happiness=Y5, Friends=X5, GPA=Z5)
Student.Data.School.6<-data.frame(Happiness=Y6, Friends=X6, GPA=Z6)
#总的数据集
All.Schools.Data <- rbind(Student.Data.School.1, Student.Data.School.2, Student.Data.School.3,
Student.Data.School.4, Student.Data.School.5, Student.Data.School.6)
这个数据模拟看起来比较复杂,给大家解释一下:首先我们模拟出了3个富学校中的3个变量,这个3个富学校中因变量幸福感和自变量的区别就是关系的截距不一样,大家可以看到我分别在截距项上加了80,75,90。
然后模拟了3个穷学校中这三个变量的关系,此处有不同的也依然在截距中,我分别在截距项上加了35,40,50。
我们需要特别注意的就是我们富学校和穷学校之间的差异,在富学校中使用朋友数量和GPA来预测幸福感的时候,斜率分别为-2,0.7;但是在穷学校中斜率分别是6和0.7。
常规数据分析
我们知道这个数据是我们模拟的,我们知道穷学校和富学校的学生中朋友数量和幸福感的关系是不一样的。
但是你导师给你这个总的数据集,里面有6个学校的学生数据,让你探讨一下学生幸福感和朋友数量及GPA的关系,你会怎么做?
大部分不知道多水平模型的人,或者没有注意到学生是嵌套在学校中的,这些人肯定的做法是如下的线性回归:
All.Schools.Data$Friends.C<-scale(All.Schools.Data$Friends, scale = FALSE)[,]
All.Schools.Data$GPA.C<-scale(All.Schools.Data$GPA, scale = FALSE)[,]
Reg.Model<-lm(Happiness ~ Friends.C + GPA.C, data = All.Schools.Data)
summary(Reg.Model)
然后就得到如下的回归结果:
[图片上传失败...(image-712e07-1611476278089)]
根据这个结果我们可以说或者会说,朋友数量对幸福感有正向影响但是GPA对幸福感无影响。
有心的同学估计会说我们再按照学校进行亚组分析看看
好
我们首先设置两个变量,一个是学生ID,另一个是学校
All.Schools.Data$StudentID<-seq(1:nrow(All.Schools.Data))
All.Schools.Data$School<-c(rep(1, nrich), rep(2,nrich), rep(3, nrich), rep(4, npoor),
rep(5, npoor), rep(6, npoor))
我们知道前三个是富学校后三个是穷学校,此时我们就可以进行学校的亚组分析:
School.Rich.Reg.Model<-lm(Happiness ~ Friends.C + GPA.C,
data = subset(All.Schools.Data, School<4))
summary(School.Rich.Reg.Model)
School.Poor.Reg.Model<-lm(Happiness ~ Friends.C + GPA.C,
data = subset(All.Schools.Data, School>3))
summary(School.Poor.Reg.Model)
[图片上传失败...(image-293e70-1611476278089)]
可以看到此亚组分析的结果依然不一致,在富学校中只有朋友数量对幸福感有负向的预测作用,在穷学校中朋友数量和GPA对幸福感都有正向的预测作用,看见没,和总体数据集的结果就矛盾了。
所以我们的研究问题依然没有能够正确地回答,朋友数量和GPA对幸福感的影响究竟是怎么样的呢?
多水平模型
看了错误的分析方法后,我们再看正确的分析方法,因为我们明白学生是嵌套在学校中的,我们有必要将学校间的变异和校内的变异分开来看,往多水平模型上考虑:
Null<-lmer(Happiness ~ 1 # 纯截距模型
+(1|School), # 每个学校都有自己的截距
data=All.Schools.Data, REML = FALSE)
summary(Null)
我们首先建立了一个纯截距模型,就是说有可能朋友数量和GPA对幸福感其实是没作用的,然后我们来检验这个模型的组内相关系数ICC
ICC.Model<-function(Model.Name) {
tau.Null<-as.numeric(lapply(summary(Model.Name)$varcor, diag))
sigma.Null <- as.numeric(attr(summary(Model.Name)$varcor, "sc")^2)
ICC.Null <- tau.Null/(tau.Null+sigma.Null)
return(ICC.Null)
}
ICC.Model(Null)
ICC要回答的问题就是更高的水平究竟所占的变异有多大,如果这个变异显著的大于0那么就应该用多水平模型。
The ICC measures the degree of clustering in our data and answers the question, “How much does my Level 2 predict the total variance of my study?” If your ICC is greater than 0, you have a multi-level study
运行上面的代码,我们可以得到本研究中ICC为0.20617,我们需要使用多水平模型。
首先我们只考虑学校水平的截距:
The.Model.1<-lmer(Happiness ~ GPA.C
+(1|School),
data=All.Schools.Data, REML = FALSE)
summary(The.Model.1)
得到的结果为控制了学校水平的波动后,GPA其实对幸福感无影响。
进一步的我们可以考虑学校水平上学生的朋友数量可以变化(随机斜率):
The.Model.2<-lmer(Happiness ~ Friends.C + GPA.C
+(1+Friends.C|School), # 幸福感随着学校的不同而不同,而且朋友数量和学校有关
#朋友数量是学校的方程
data=All.Schools.Data, REML = FALSE)
summary(The.Model.2)
[图片上传失败...(image-c6d5bd-1611476278089)]
那么此时的结果为:控制了学校水平的随机效应后,朋友数量对幸福感其实是没有影响的。
在这个例子中我们得到的GPA的系数并不等于0.7,是因为每个学校水平朋友数量抽走变异是不一样的,最终我们的结论应该是朋友数量对幸福感无影响,其实也是可以理解的,在富学校中这个关系是朋友越多幸福感越若,在穷学校中朋友越多幸福感越强,推广到一般的学生中其实朋友对幸福感的影响并没有显著意义,之所以不同学校结果不一样是因为学校本身的随机效应。
到这儿你就可以给你的导师说,朋友数量对幸福感无关。
小结
今天给大家写了多水平模型的例子,感谢大家耐心看完。发表这些东西的主要目的就是督促自己,希望大家关注评论指出不足,一起进步。内容我都会写的很细,用到的数据集也会在原文中给出链接,你只要按照文章中的代码自己也可以做出一样的结果,一个目的就是零基础也能懂,因为自己就是什么编程基础没有从零学Python和R的,加油。数据分析问题咨询,代处理请私信(spss,R,Mplus)。
(站外链接发不了,请关注后私信回复“数据链接”获取本头条号所有使用数据)
往期内容: