R语言 线性混合效应模型实战案例

news2024/10/7 10:22:47

介绍

最近我们被客户要求撰写关于性混合效应模型的研究报告,包括一些图形和统计输出。首先,请注意,围绕多层次模型的术语有很大的不一致性。例如,多层次模型本身可能被称为分层线性模型、随机效应模型、多层次模型、随机截距模型、随机斜率模型或集合模型。根据不同的学科、使用的软件和学术文献,许多这些术语可能指的是相同的一般建模策略。

相关视频:线性混合效应模型(LMM,Linear Mixed Models)和R语言实现

线性混合效应模型(LMM,Linear Mixed Models)和R语言实现案例

时长12:13

在本文中,我将试图通过演示如何在R中拟合多层次模型,并试图将模型拟合过程与有关这些模型的常用术语联系起来,为用户提供一个多层次模型的指南。

读入数据

多层次模型适合于一种特殊的数据结构,即单位嵌套在组内(一般是5个以上的组),我们想对数据的组结构进行建模。

##   id extro  open agree social class school
## 1  1 63.69 43.43 38.03  75.06     d     IV
## 2  2 69.48 46.87 31.49  98.13     a     VI
## 3  3 79.74 32.27 40.21 116.34     d     VI
## 4  4 62.97 44.41 30.51  90.47     c     IV
## 5  5 64.25 36.86 37.44  98.52     d     IV
## 6  6 50.97 46.26 38.83  75.22     d      I

在这里,我们有关于嵌套在班级和学校内的科目的外向性的数据。

在我们开始之前,让我们先了解一下数据的结构。

## 'data.frame':    1200 obs. of  7 variables:
##  $ id    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ extro : num  63.7 69.5 79.7 63 64.2 ...
##  $ open  : num  43.4 46.9 32.3 44.4 36.9 ...
##  $ agree : num  38 31.5 40.2 30.5 37.4 ...
##  $ social: num  75.1 98.1 116.3 90.5 98.5 ...
##  $ class : Factor w/ 4 levels "a","b","c","d": 4 1 4 3 4 4 4 4 1 2 ...
##  $ school: Factor w/ 6 levels "I","II","III",..: 4 6 6 4 4 1 3 4 3 1 ...

这里我们看到我们有两个可能的分组变量--班级和学校。让我们进一步探讨一下它们。 

## 
##   a   b   c   d 
## 300 300 300 300
## 
##   I  II III  IV   V  VI 
## 200 200 200 200 200 200
##    
##      I II III IV  V VI
##   a 50 50  50 50 50 50
##   b 50 50  50 50 50 50
##   c 50 50  50 50 50 50
##   d 50 50  50 50 50 50

这是一个完全平衡的数据集。让我们来绘制一下数据。可以探索学校和班级之间的变量关系。

 

plot(extro ~ open + social + agree | school + class
           

在这里我们看到,在班级内部有明显的分层,我们也看到社会变量与开放和赞同变量有强烈的区别。我们还看到,A班和D班在最低和最高段的分布明显更多。接下来让我们按学校绘制数据。 

按学校划分,我们看到学生的分组很紧密,但学校一和学校六比其他学校显示出明显的分散性。在学校之间,我们的预测指标的模式与班级之间的模式相同。

这里我们可以看到,学校和班级似乎密切区分了我们的预测因素和外向性之间的关系。
 

探索merMod对象

我们对我们的嵌套数据拟合了一系列的随机截距模型。我们将更深入地研究我们拟合这个模型时产生的lmerMod对象,以了解如何在R中使用混合效应模型。我们首先拟合下面这个按班级分组的基本例子。

## [1] "lmerMod"
## attr(,"package")
## [1] "lme4"

首先,我们看到MLexamp1现在是一个lmerMod类的R对象。这个lmerMod对象是一个S4类,为了探索其结构,我们使用slotNames。

##  [1] "resp"    "Gp"      "call"    "frame"   "flist"   "cnms"    "lower"  
##  [8] "theta"   "beta"    "u"       "devcomp" "pp"      "optinfo"

在lmerMod对象中,我们看到了一些我们可能希望探索的对象。比如说。 

## lmer(formula = extro ~ open + agree + social + (1 | school), 
##     data = lmm.data)
## [1] 59.116514  0.009751  0.027788 -0.002151
## [1] "data.frame"
##   extro  open agree social school
## 1 63.69 43.43 38.03  75.06     IV
## 2 69.48 46.87 31.49  98.13     VI
## 3 79.74 32.27 40.21 116.34     VI
## 4 62.97 44.41 30.51  90.47     IV
## 5 64.25 36.86 37.44  98.52     IV
## 6 50.97 46.26 38.83  75.22      I

merMod对象有许多可用的方法--在此无法一一列举。但是,我们将在下面的列表中介绍一些比较常见的方法。 

##  [1] anova.merMod*        as.function.merMod*  coef.merMod*        
##  [4] confint.merMod       deviance.merMod*     df.residual.merMod* 
##  [7] drop1.merMod*        extractAIC.merMod*   extractDIC.merMod*  
## [10] family.merMod*       fitted.merMod*       fixef.merMod*       
## [13] formula.merMod*      isGLMM.merMod*       isLMM.merMod*       
## [16] isNLMM.merMod*       isREML.merMod*       logLik.merMod*      
## [19] model.frame.merMod*  model.matrix.merMod* ngrps.merMod*       
## [22] nobs.merMod*         plot.merMod*         predict.merMod*     
## [25] print.merMod*        profile.merMod*      qqmath.merMod*      
## [28] ranef.merMod*        refit.merMod*        refitML.merMod*     
## [31] residuals.merMod*    sigma.merMod*        simulate.merMod*    
## [34] summary.merMod*      terms.merMod*        update.merMod*      
## [37] VarCorr.merMod*      vcov.merMod          weights.merMod*     
## 
##    Non-visible functions are asterisked

一个常见的需求是从merMod对象中提取固定效应。 fixef提取一个固定效应的命名数字向量,这很方便。 

## (Intercept)        open       agree      social 
##   59.116514    0.009751    0.027788   -0.002151

了解这些参数的p值或统计显着性:

如果你想了解这些参数的P值或统计学意义,首先通过运行 "mcmcsamp "查阅lme4帮助,了解各种方法。包中内置的一个方便的方法是。 

##                0.5 %   99.5 %
## .sig01       4.91840 23.88758
## .sigma       2.53287  2.81456
## (Intercept) 46.27751 71.95610
## open        -0.02465  0.04415
## agree       -0.01164  0.06721
## social      -0.01493  0.01063

从这里我们可以首先看到我们的固定效果参数重叠0表示没有效果。我们还可以看到.sig01,这是我们对随机效应变化的估计。这表明我们的群体之间的影响很小,要么得到更精确的估计的群体太少。

另一个常见的需求是提取残余标准误差,这是计算效果大小所必需的。要获得残差标准误的命名向量:

## [1] 2.671

例如,教育研究中的常见做法是通过将固定效应参数除以残差标准误差来将固定效果标准化为“效果大小”:

## (Intercept)        open       agree      social 
##  22.1336705   0.0036508   0.0104042  -0.0008055

从这一点,我们可以看到,我们对开放性,赞同性和社交性的预测因素在预测外向性方面几乎毫无用处。让我们把注意力转向下一个随机效应。

探索组变化和随机效果

您很可能适合混合效果模型,因为您直接对模型中的组级变化感兴趣。目前还不清楚如何从结果中探索这种群体水平的变化summary.merMod。我们从这个输出得到的是组效应的方差和标准偏差。

## $school
##     (Intercept)
## I       -14.091
## II       -6.183
## III      -1.971
## IV        1.966
## V         6.331
## VI       13.948

运行ranef函数可以得到每个学校的截距,但没有太多的额外信息--例如这些估计值的精确度。我们需要一些额外的命令。

## [1] "ranef.mer"
## , , 1
## 
##         [,1]
## [1,] 0.03565
## 
## , , 2
## 
##         [,1]
## [1,] 0.03565
## 
## , , 3
## 
##         [,1]
## [1,] 0.03565
## 
## , , 4
## 
##         [,1]
## [1,] 0.03565
## 
## , , 5
## 
##         [,1]
## [1,] 0.03565
## 
## , , 6
## 
##         [,1]
## [1,] 0.03565

ranef.mer对象是一个列表,其中包含每个组水平的数据框。数据框包含每个组的随机效应(这里我们只有每个学校的截距)。lme4提供随机效应的条件方差时,它储存在这些数据框的一个属性中,作为方差-协方差矩阵的一个列表。
这种结构的确很复杂,但它很强大,因为它允许嵌套的、分组的和跨级别的随机效应。

 
## $school
##     (Intercept)
## I       -14.091
## II       -6.183
## III      -1.971
## IV        1.966
## V         6.331
## VI       13.948
## 
## with conditional variances for "school"
## $school

这个图形显示了随机效应项的点阵图,也被称为毛毛虫图。在这里,你可以清楚地看到每个学校对外向性的影响,以及它们的标准误差,以帮助确定随机效应之间的区别。
 

使用模拟和图来探索随机效应

一种常见的计量经济学方法是创建所谓的群体水平项的经验贝叶斯估计。但是,对于什么是随机效应项的适当标准误差,甚至对于如何一致地定义经验贝叶斯估计值,目前还没有太多的共识。在R中,有一些额外的方法可以获得随机效应的估计值。

##    X1          X2    mean  median    sd
## 1   I (Intercept) -14.053 -14.093 3.990
## 2  II (Intercept)  -6.141  -6.122 3.988
## 3 III (Intercept)  -1.934  -1.987 3.981
## 4  IV (Intercept)   2.016   2.051 3.993
## 5   V (Intercept)   6.378   6.326 3.981
## 6  VI (Intercept)  13.992  14.011 3.987

REsim函数为每个学校返回水平名称X1、估计名称X2、估计值的平均值、中位数和估计值的标准差。

另一个方便的函数可以帮助我们绘制这些结果,看看它们与dotplot的结果相比如何。

                       ymin = "ymin")) + 
    geom_pointrange() + theme_dpi() + 
    theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), 
          axis.text.x = element_blank(), axis.ticks.x = element_blank()) + 
    geom_hline(yintercept = 0, color = I("red"), size = I(1.1))
}

根据你的数据收集方式和你的研究问题,估计这些效应大小的其他方法是可能的。

我们可以测试是否包含随机效应来提高模型的拟合度,我们可以使用基于模拟的似然比测试来评估额外的随机效应项的p值。

## 
##  simulated finite sample distribution of LRT. (p-value based on
##  10000 simulated values)
## 
## data:  
## LRT = 2958, p-value < 2.2e-16

这里程序发出了一个警告,因为我们最初是用REML而不是完全最大似然来拟合模型。但lme4中的refitML函数允许我们使用完全最大似然法轻松地重新拟合我们的模型。

## 
##  simulated finite sample distribution of LRT. (p-value based on
##  10000 simulated values)
## 
## data:  
## LRT = 2958, p-value < 2.2e-16

在这里,我们可以看到,即使每个单独的群体的影响可能是实质性的小和/或不精确的测量,但纳入我们的分组变量是显著的。这对于理解模型是很重要的。
 

随机效应有什么意义?

如何解释我们的随机效应的实质性影响?在使用多层次结构的观察工作中,这往往是至关重要的,了解分组对个体观察的影响。为了做到这一点,我们选择了12个随机案例,然后模拟他们的预测值,如果他们被安排在6所学校中的每一所,他们的extro预测值。请注意,这是一个非常简单的模拟,只是使用了固定效应的平均值和随机效应的条件模式,并没有进行复制或抽样。

qplot(school, yhat, data = simDat) + facet_wrap(~case) + theme_dpi()

 

这张图告诉我们,在每个图中,代表一个案例,不同的学校有很大的变化。因此,把每个学生移到不同的学校,对外向性得分有很大的影响。但是,每个案例在每个学校都有差异吗?

+ facet_wrap(~school) + theme_dpi() + 
  theme(axis.text.x = element_blank())

在这里,我们可以清楚地看到,在每所学校内,案例相对相同,表明群体效应大于个体效应。
这些图在以实质性的方式展示群体和个体效应的相对重要性方面很有用。甚至还可以做更多的事情来使图表更有信息量,比如提到结果的总变异性,也可以看一下移动群体使每个观察值离其真实值的距离。

结论

R为处理混合效应模型提供了一个非常强大的面向对象的工具集。理解模型拟合和置信区间需要一些研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web大学生网页作业成品 蛋糕店美食餐饮网站设计与实现(HTML+CSS+JavaScript)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

代码随想录训练营第54天|LeetCode 392.判断子序列、115.不同的子序列

参考 代码随想录 题目一&#xff1a;LeetCode 392.判断子序列 确定dp数组及其下标的含义 dp[i][j]&#xff1a;s字符串中0&#xff5e;i字符构成的子串和t字符串中0&#xff5e;j字符构成的子串的最长公共子序列的长度。 确定递推公式 dp[i][j]有两个可能的来源&#xff1a;…

内点法求最优潮流和微电网调度(风、光、蓄电池、燃油机)(Matlab实现)

目录 1 概述 2 案例 2.1算例描述 2.2 数据 3 一点小知识 4 Matlab代码实现 1 概述 由于电力系统本身的复杂性,电力潮流优化具有规模大,约束条件多和非线性的特点。通过对最优潮流的求解,最终达到优化已有资源、降低发电厂耗量成本、减少电网线路损耗、提高电力系统输电…

JSON的定义、基本使用、以及和对象之间的相互转换

json的定义与基本使用 <script>//定义jsonvar json{"name" : "张三","age" : "18岁","addr" : ["北京","上海","天津"]}//获取数据console.log(json.age)console.log(json.name)consol…

【算法】可解释机器学习-CAM / Grad_CAM(Datawhale)

可解释机器学习-CAM / Grad_CAM一、CAM1.CAM算法介绍2.CAM的特点3.CAM算法的缺点二、Grad_CAM1.Grad_CAM算法介绍2.Grad_CAM算法优点3.Grad_CAM算法缺点4.Grad_CAM算法的变种1&#xff09;Grad_CAM算法2&#xff09;ScoreCAM算法3&#xff09;LayerCAM算法一、CAM 1.CAM算法介…

jsp+ssm计算机毕业设计高铁售票管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

stack和queue

stack&#xff1a;https://cplusplus.com/reference/stack/stack/?kwstack 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器…

设计模式之命令模式

Command design pattern 命令模式的概念、命令模式的结构、命令模式的优缺点、命令模式的使用场景、命令模式的实现示例、命令模式的源码分析 1、命令模式的概念 命令模式&#xff0c;即将请求封装成一个对象&#xff0c;使发出请求的责任和执行请求的责任分离开。这样两者之间…

App自动化测试【1】Appium的原理解读

1.Appium的架构原理 Appium的架构原理如图所示&#xff0c;由客户端&#xff08;Appium Client&#xff09;和服务器&#xff08;Appium Server&#xff09;两部分组成&#xff0c;客户端与服务器端通过JSON Wire Protocol进行通信。 2.Appium原理解读 客户端Client&#x…

Win10自动更新怎么永久关闭?服务、注册表、组策略、计划任务中全方位设置,永久解决!

Win10自动更新就像打不死的小强&#xff0c;不管怎么关闭&#xff0c;之后还是会自动更新&#xff0c;让不少小伙伴颇为不爽。今天通过4步&#xff0c;在服务、注册表、组策略、计划任务中全方位设置&#xff0c;彻底关闭Win10自动更新&#xff0c;感兴趣的小伙伴不妨试试吧。 …

Python:requirements.txt, environment.yml简介

文章目录简介requirements.txtenvironment.yml小结简介 最近安装了一些从github上clone下载的开源python软件包&#xff0c;经历了许许多多的酸甜苦辣。在python软件包&#xff0c;通常都会包含requirements.txt, environment.yml, setup.py三者之中某些或者全部&#xff0c;一…

11.注解开发依赖注入及管理第三方Bean

1. 注解开发依赖注入 1.1 使用Autowired注解开启自动装配模式 Service public class BookServiceImpl implements BookService {//Autowired&#xff1a;注入引用类型&#xff0c;自动装配模式&#xff0c;默认按类型装配Autowiredprivate BookDao bookDao;public void save(…

【OpenCV+Qt】实现简易视频播放器——支持进度条拖动

OpenCV实现视频播放器&#xff0c;其思路大致就是在线程中使用OpenCV中的VideoCapture循环读取本地视频的每一帧Mat&#xff0c;然后发送到界面转换成QImage进行显示&#xff0c;而进度条拖动则用到了VideoCapture中的set函数&#xff0c;进度条则是使用Qslider&#xff1b;并且…

记录安装 fenics 的问题

因为 fenics 官方更新后可能版本会出现有时效的问题, 所以也记录一下时间. Windows 系统下安装最大的问题 2022-12-19 记录. Windows 系统下本来是想通过 Anaconda 安装 fenics 的, 创建好虚拟环境后, 利用 conda install -c conda-forge fenics 进行安装, 但是直接提示 Pack…

操作系统,计算机网络,数据库刷题笔记14

操作系统&#xff0c;计算机网络&#xff0c;数据库刷题笔记14 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xf…

【OpenSourceC#】ET框架

1. 前言 ET算是我刚接触客户端时最早知道的框架&#xff0c;ET我最初眼馋的还是他的双端功能。包揽前后端的功能&#xff0c;这个很有吸引力。但是那时候对我来说这框架太复杂了&#xff0c;没法看。 这两天又来看看&#xff0c;曾经很多不懂的地方现在都能看懂了&#xff0c…

数据库拆分5--使用sharding-jdbc来实现水平拆分

有三张表 user log order表&#xff0c;先将user log 和order垂直分库&#xff0c;然后将user表水平拆分 配置文件 spring.shardingsphere.enabledtruespring.shardingsphere.datasource.nameswim-user,wim-orderspring.shardingsphere.datasource.wim-user.typecom.alibaba.…

【JavaEE】多线程之Thread类

一、Thread类常见方法与字段 1、构造方法 构造方法说明Thread()不带参数的构造方法Thread(String name)可以在构造时传入线程的名字Thread(Runnable run)传入Runnable&#xff0c;是创建线程的方法之一Thread(Runnable run,String name)传入线程工作并给线程起名 2、常见属性…

JaveWeb框架(一):Web入门,Http的请求和响应,https介绍,Web实战自定义服务器

Servlet入门 MVC实战项目 仓储管理系统JavaWeb入门介绍Http协议Http请求数据格式Http响应数据格式Web实战Demo&#xff1a;自定义服务器对比Https协议总结Redis章节复习已经过去&#xff0c;新的章节JavaWeb开始了&#xff0c;这个章节中将会回顾JavaWeb实战项目 仓储管理 代码…

机器人开发--电机中的电流环、速度环、位置环

机器人开发--电机中的电流环、速度环、位置环电流环、速度环、位置环1 三环原理1.1 电流环1.2 速度环1.3 位置环2 各环与PID控制2.1 电流环重点在 PID&#xff08;比例、积分和微分&#xff09;2.2 速度环重点在 PI&#xff08;比例和积分&#xff09;2.3 位置环重点在 P&#…